sql >> Database >  >> RDS >> Mysql

Redundante externe sleutels opslaan om joins te voorkomen

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




  1. Een groot sql-bestand importeren naar MySql via de opdrachtregel

  2. Hoe sql*plus te gebruiken in het Windows-opdrachtscript om de stroom te regelen?

  3. At-Sign in SQL-instructie vóór kolomnaam

  4. Oracle:DDL en transactie terugdraaien