Joins er, hvordan relationelle DBMS'er fungerer. Lær om og brug normalisering.
Hvis dette er sandt for hver tjeneste, er din database underlagt en begrænsning. Det er den (select service from Service_has_transaction join Transaction_has_wallet)
er en delmængde af (select service from Service_has_transaction join Transaction_has_wallet join Wallet_has_bonus)
.
De fleste SQL DBMS'er lader dig ikke udtrykke denne begrænsning deklarativt og ved ikke, hvordan du optimerer håndhævelsen af den. Men der er et SQL-formsprog, som vi kan bruge til at udtrykke og håndhæve det deklarativt. (Gætter på dine tabeldefinitioner:) Tilføj først en bonus
kolonne til Transaction_has_wallet
og en fremmednøgle fra Transaction_has_wallet (wallet, bonus)
til Wallet_has_bonus
. Tilføj derefter tegnebogs- og bonuskolonner til Service_has_transaction
og en fremmednøgle fra Service_has_transaction (transaction, wallet, bonus)
til Transaction
. Dette tilføjer redundante kolonner, men begrænser ikke desto mindre databasen til gyldige tilstande, fordi begrænsningerne for fremmednøgle forhindrer, at de redundante værdier er forkerte. (Forhåbentlig er dette et motiverende eksempel til at lære om at udtrykke vilkårlige begrænsninger via triggere.)