Angenommen, ich habe die folgenden Tabellen in meiner Datenbank:
Tabellen http://www.freeimagehosting.net/uploads/a5ef036857.png
Jetzt sind alle meine Abfragen abhängig von der Company-Tabelle. Ist es eine schlechte Praxis, jeder anderen Tabelle eine (redundante) Beziehung zur Firmen-Tabelle zu geben, um meine SQL-Abfragen zu vereinfachen?
Edit 1: Hintergrund ist ein Nutzungsproblem bei einem Framework. Siehe Django: begrenzende Modelldaten .
Edit 2: Kein Tupel würde seine Firma ändern.
Edit 3: Ich schreibe die MySQL-Abfragen nicht. Ich benutze eine Abstraktionsschicht (Django).
Es ist eine schlechte Übung, weil Ihre redundanten Daten unabhängig und daher redundant aktualisiert werden müssen. Ein Prozess, der mit Fehlern behaftet ist. (Auch die automatische Kaskadierung muss separat zugewiesen und gepflegt werden)
Indem Sie diese Beziehung einführen, demormalisieren Sie Ihre Datenbank. Die Denormalisierung ist manchmal aus Gründen der Leistung notwendig, aber aus Ihrer Frage klingt es, als würden Sie nur Ihre SQL vereinfachen.
Verwenden Sie andere Mechanismen, um die Komplexität Ihrer Datenbank zu abstrahieren: Ansichten, Stored Procs, UDFs
Was Sie fragen, ist, ob Sie die dritte Normalform in Ihrem Design verletzen sollten. Dies ist nicht ohne triftigen Grund zu tun, da Sie durch die Schaffung von Redundanz die Möglichkeit für Fehler und Inkonsistenzen in Ihren Daten schaffen. Auch das "Simplifizieren" des Modells mit redundanten Daten zur Unterstützung einiger Operationen wird wahrscheinlich andere Operationen komplizieren. Außerdem müssen Constraints und andere Datenzugriffslogik wahrscheinlich unnötigerweise dupliziert werden.
Wenn Sie wirklich Dinge vereinfachen müssen, ist dies eine Ansicht (oder mehrere Ansichten) wäre praktisch.
Eine Spalte für das Unternehmen in Ihrer employee Ansicht wäre nicht schlecht normalisiert, sofern sie von einem Join on-Abschnitt abgeleitet ist.
Ist es eine schlechte Übung, jeder anderen Tabelle eine (redundante) Beziehung zur Unternehmenstabelle zu geben, um meine SQL-Abfragen zu vereinfachen?
Ja, absolut, denn das würde bedeuten, dass jede redundante Beziehung aktualisiert wird, wenn Sie den Beziehungs-Kunden an ein Unternehmen oder eine Abteilung an ein Unternehmen aktualisieren. Wenn Sie ein solches Update verpassen, verfügen Sie jetzt über eine Datenbank mit redundanten Daten. Es ist eine schlechte Denormalisierung.
Wenn Sie Ihren SQL-Code nur vereinfachen möchten, sollten Sie Views verwenden, um übergeordnete Daten mitzubringen. Hier ist eine Ansicht, die company_id in den Vertrag zieht, indem Sie sich über den Kunden anmelden:
%Vor%Dieser Join ist einfach, aber warum wiederhole ich ihn immer und immer wieder? Schreiben Sie es einmal und verwenden Sie dann die Ansicht in anderen Abfragen.
Viele (aber nicht alle) RDBMS können den Join sogar optimieren, wenn Sie keine Spalten von customer in der Select-Liste oder where-Klausel der Query basierend auf der View anlegen, solange Sie contract.customer_id haben eine referenzielle Integritätsbedingung für den Fremdschlüssel für customer.customer_id. (In Ermangelung einer solchen Einschränkung kann der Join nicht weggelassen werden, da es dann möglich wäre, dass eine contract.customer_id existiert, die im Kunden nicht existiert. Da Sie das , fügen Sie die Fremdschlüsseleinschränkung hinzu.)
Die Verwendung der Ansicht erreicht, was Sie wollen, ohne den Zeitaufwand, die untergeordneten Tabellen zu aktualisieren, ohne den Platzbedarf, um untergeordnete Zeilen durch Hinzufügen der redundanten Spalte breiter zu machen (und dies spielt wirklich eine Rolle, wenn Sie viele Zeilen haben). Je breiter die Zeile ist, desto weniger Zeilen können gleichzeitig in den Speicher passen. Und vor allem ohne die Möglichkeit inkonsistenter Daten, wenn das übergeordnete Element aktualisiert wird, die untergeordneten Elemente jedoch nicht.
Ich würde sagen, nicht im Fall des OP, aber manchmal ist es nützlich (genau wie goto;).
Eine Anekdote:
Ich arbeite mit einer Datenbank, in der die meisten Tabellen einen Fremdschlüssel enthalten, der auf eine Stammtabelle für die Konten verweist. Die Kontonummern befinden sich außerhalb der Datenbank und dürfen nach der Ausstellung nicht geändert werden. Es besteht also keine Gefahr, die Kontonummern zu ändern und alle Referenzen im DB zu aktualisieren. Ich finde auch, dass es wesentlich einfacher ist, Daten aus Tabellen zu entnehmen, die nach Kontonummern getippt sind, anstatt komplexe und kostspielige Joins in der Hierarchie zu machen, um zur Root-Account-Tabelle zu gelangen. Aber in meinem Fall haben wir nicht so sehr einen Fremdschlüssel als einen externen (d. H. Realen) Bezeichner, so dass er nicht ganz der Situation des OP entspricht und für eine Ausnahme geeignet erscheint.
Das hängt von Ihren funktionalen Anforderungen für "Performance" ab. Wird Ihre Anwendung die starke Nachfrage bewältigen? Vereinfachung JOINS rühmt sich Leistung. Neben Hardware ist billig und Turn-Around-Zeit ist wichtig.
Je tiefer Sie in normale Datenbankformulare einsteigen - Sie sparen Platz, sind aber stark in der Berechnung
Tags und Links database database-design relational-database