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