Joins zijn hoe relationele DBMS'en werken. Lees meer over normalisatie en gebruik deze.
Als dit voor elke service geldt, is uw database onderhevig aan een beperking. Het is dat (select service from Service_has_transaction join Transaction_has_wallet)
is een subset van (select service from Service_has_transaction join Transaction_has_wallet join Wallet_has_bonus)
.
De meeste SQL DBMS'en laten je die beperking niet declaratief uitdrukken en weten niet hoe je de handhaving ervan kunt optimaliseren. Er is echter een SQL-idioom dat we kunnen gebruiken om het declaratief uit te drukken en af te dwingen. (Gissend naar je tafeldefinities:) Voeg eerst een bonus
toe kolom naar Transaction_has_wallet
en een externe sleutel van Transaction_has_wallet (wallet, bonus)
naar Wallet_has_bonus
. Voeg vervolgens portemonnee- en bonuskolommen toe aan Service_has_transaction
en een externe sleutel van Service_has_transaction (transaction, wallet, bonus)
naar Transaction
. Dit voegt redundante kolommen toe, maar beperkt de database niettemin tot geldige toestanden omdat de beperkingen van de refererende sleutel voorkomen dat de overtollige waarden verkeerd zijn. (Hopelijk is dit een motiverend voorbeeld om te leren over het uiten van willekeurige beperkingen via triggers.)