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.)