Mysql
 sql >> Database >  >> RDS >> Mysql

Memorizzazione di chiavi esterne ridondanti per evitare join

I join sono il modo in cui funzionano i DBMS relazionali. Scopri e usa la normalizzazione.

Se questo è vero per ogni servizio, il tuo database è soggetto a un vincolo. È che (select service from Service_has_transaction join Transaction_has_wallet) è un sottoinsieme di (select service from Service_has_transaction join Transaction_has_wallet join Wallet_has_bonus) .

La maggior parte dei DBMS SQL non consente di esprimere tale vincolo in modo dichiarativo e non sa come ottimizzare l'applicazione. Tuttavia esiste un linguaggio SQL che possiamo usare per esprimerlo e applicarlo in modo dichiarativo. (Indovinando le definizioni della tua tabella:) Per prima cosa aggiungi un bonus colonna a Transaction_has_wallet e una chiave esterna da Transaction_has_wallet (wallet, bonus) a Wallet_has_bonus . Quindi aggiungi le colonne portafoglio e bonus a Service_has_transaction e una chiave esterna da Service_has_transaction (transaction, wallet, bonus) a Transaction . Ciò aggiunge colonne ridondanti ma limita comunque il database a stati validi perché i vincoli di chiave esterna impediscono che i valori ridondanti siano errati. (Speriamo che questo sia un esempio motivante per imparare a esprimere vincoli arbitrari tramite trigger.)