Les jointures sont le fonctionnement des SGBD relationnels. Découvrez et utilisez la normalisation.
Si cela est vrai pour chaque service, votre base de données est soumise à une contrainte. C'est que (select service from Service_has_transaction join Transaction_has_wallet)
est un sous-ensemble de (select service from Service_has_transaction join Transaction_has_wallet join Wallet_has_bonus)
.
La plupart des SGBD SQL ne vous permettent pas d'exprimer cette contrainte de manière déclarative et ne savent pas comment optimiser son application. Cependant, il existe un idiome SQL que nous pouvons utiliser pour l'exprimer et l'appliquer de manière déclarative. (En devinant vos définitions de table :) Ajoutez d'abord un bonus
colonne à Transaction_has_wallet
et une clé étrangère de Transaction_has_wallet (wallet, bonus)
à Wallet_has_bonus
. Ajoutez ensuite les colonnes portefeuille et bonus à Service_has_transaction
et une clé étrangère de Service_has_transaction (transaction, wallet, bonus)
à Transaction
. Cela ajoute des colonnes redondantes mais limite néanmoins la base de données à des états valides car les contraintes de clé étrangère empêchent les valeurs redondantes d'être erronées. (J'espère que c'est un exemple motivant pour apprendre à exprimer des contraintes arbitraires via des déclencheurs.)