Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Speichern redundanter Fremdschlüssel, um Joins zu vermeiden

Joins sind die Art und Weise, wie relationale DBMS funktionieren. Erfahren Sie mehr über die Normalisierung und verwenden Sie sie.

Wenn dies für jeden Dienst gilt, unterliegt Ihre Datenbank einer Einschränkung. Es ist dieser (select service from Service_has_transaction join Transaction_has_wallet) ist eine Teilmenge von (select service from Service_has_transaction join Transaction_has_wallet join Wallet_has_bonus) .

Die meisten SQL-DBMSs lassen Sie diese Einschränkung nicht deklarativ ausdrücken und wissen nicht, wie sie ihre Durchsetzung optimieren können. Es gibt jedoch ein SQL-Idiom, mit dem wir es deklarativ ausdrücken und erzwingen können. (Anhand Ihrer Tabellendefinitionen raten:) Fügen Sie zuerst einen bonus hinzu Spalte zu Transaction_has_wallet und einen Fremdschlüssel von Transaction_has_wallet (wallet, bonus) zu Wallet_has_bonus . Fügen Sie dann Brieftaschen- und Bonusspalten zu Service_has_transaction hinzu und einen Fremdschlüssel von Service_has_transaction (transaction, wallet, bonus) zu Transaction . Dadurch werden redundante Spalten hinzugefügt, die Datenbank wird jedoch auf gültige Zustände beschränkt, da die Fremdschlüsselbeschränkungen verhindern, dass die redundanten Werte falsch sind. (Hoffentlich ist dies ein motivierendes Beispiel, um zu lernen, wie man willkürliche Beschränkungen über Trigger ausdrückt.)