Warum eine Join-Tabelle haben, für die 1: m Beziehung in SQL
-
13-09-2019 - |
Frage
Was ist der Vorteil einer Kreuzung Tabellen zwischen dem ersten 1: m und den zweiten 1: m Beziehungen in der folgenden Datenbank
alt text http://dl.getdropbox.com/u /175564/db/db-simple.png
Das Buch Joe Celko der Bäume und Hierarchien in SQL für Smarties sagen, dass der Grund, einzigartige Beziehungen in 1 zu haben ist: Ms. Zum Beispiel resrict die folgenden Tabellen Benutzer die exakt gleiche Frage zweimal zu stellen und genau die gleiche Antwort zweimal zu geben ist.
Die erste 1: m Relation
users-questions
===============
user_id REFERENCES users( user_id )
question_id REFERENCES questions ( question_id )
PK( user_id, question_id) // User is not allowed to ask same question twice
Die zweite 1: m Relation
questions-answers
=================
question_id REFERENCES questions( question_id)
answer_id REFERENCES answers( aswer_id )
PK( question_id, answer_id ) // Question is not allowed to have to same answers
Dieser Vorteil über Einzigartigkeit überzeugen mich nicht zu meinen Code schwieriger zu machen. Ich kann nicht verstehen, warum ich die Möglichkeit, Fragen oder Antworten mit der gleichen ID in der db des Habens beschränken sollte, da ich vielleicht PHP verwenden kann, das zu verbieten.
Lösung
Das in der Regel aufgrund Duplizierung von Daten.
Wie für Ihre Argumentation, ja können Sie dies in der Business-Schicht erzwingen, aber wenn Sie einen Fehler machen, könnte es eine erhebliche Menge an Code brechen. Das Problem, das Sie haben, ist Ihr Datenmodell nur wenige Tabellen haben. Du Glückspilz. Wenn Ihr Datenmodell wächst, wenn Sie nicht Sinn der Struktur machen kann und Sie haben alle die Logik setzen denormalised Tabellen in der GUI-Schicht zu erhalten kann man sehr leicht auf Probleme stoßen. Beachten Sie, dass es schwer ist, um die Dinge thread auf einer GUI für die SQL-Datenbank ohne Verriegelung, die Ihre Leistung zerstören wird.
DBMS sind sehr, sehr gut mit diesen Problemen zu beschäftigen. Sie können Ihr Datenmodell sauber und verwenden Indizierung halten Sie mit der Geschwindigkeit müssen Sie bieten. Ihr Ziel sollte es richtig ersten sein, zu bekommen, und nur Ihre Tabellen denormalise wenn Sie eine klare Notwendigkeit, dies zu tun, sehen (für die Leistung etc.)
Ob Sie es glauben oder nicht, es gibt viele Situationen, in denen normalisierte Daten, die Ihnen das Leben leichter macht, nicht härter, wenn es um Ihre Anwendung kommt. Zum Beispiel, wenn Sie einen großen Tisch mit Fragen und Antworten haben, müssen Sie Code schreiben, um zu überprüfen, ob es einzigartig ist. Wenn Sie eine Tabelle mit einem Primärschlüssel haben, können Sie einfach schreiben
insert into table (col1, col2) values (@id, @value) --NOTE: You would probably
--make the id column an autonumber so you dont have to worry about this
Die Datenbank wird verhindert, dass Sie das Einfügen, wenn Sie einen nicht eindeutigen Wert haben dort oder wenn Sie ohne Frage in einer Antwort platzieren. Alles, was Sie tun müssen, ist zu überprüfen, ob die Einfügung gearbeitet, nichts weiter. Welches ist Ihrer Meinung nach weniger Code?
Andere Tipps
Nun, die einzigartigen Beziehungen Sache scheint mir unsinnig, wahrscheinlich, weil ich zu DBMSes gewohnt bin, wo man eindeutige Schlüssel anders als der Primärschlüssel definieren. In meiner Welt Mapping-Tabellen, wie sie sind, wie Sie eine many-to-many-Beziehung implementieren und sie für eine Beziehung Eins-zu-viele mit ist Wahnsinn - ich meine, wenn Sie das tun, vielleicht haben Sie beabsichtigen für die Beziehung als eine eins-zu-viele verwendet werden, aber was du em eigentlich <> implementiert ist many-to-many-Support.
Ich bin nicht einverstanden mit dem, was Sie da sagen, sind in der Persistenz-Schicht kein Dienstprogramm, um einzigartige Verbindung Schlüssel zu sein, weil Sie, dass in der Anwendungsschicht durchsetzen kann, wenn. Persistenz-Schicht Einzigartigkeit Einschränkungen haben viele schwer zu replizieren Vorteilen, wie in MySQL, die Fähigkeit zu nutzen INSERT ... ON DUPLICATE KEY UPDATE
.
Ich bin damit einverstanden, dass die Tabelle in dieser Situation für eine Eins-zu-viele kommen scheint nicht viel Nutzen zu addieren und als @chaos sagt, Sie tatsächlich many-to-many-Unterstützung am Ende der Umsetzung. Aber Joe Celko ist ein kluger Kerl - ist das wirklich die genaue Antwort gibt er
Ein weiterer möglicher Grund für eine Join-Tabelle Implementierung auf einem Eins-zu-viele ist, dass es völlig Fragen / Antworten aus einer Abhängigkeit von Benutzern trennt.
Zum Beispiel, sagen Sie eine Dogs
Tabelle und eine Deities
Tabelle hinzugefügt. Wir alle wissen, dass Hunde nicht als Benutzer registrieren können, weil sie keine E-Mail-Adressen haben, und Götter registrieren nicht als Nutzer, weil, na ja, es unter ihnen ist. Vielleicht obwohl Hunde und Götter noch Fragen stellen, sondern zu tun, dass Sie einen Hunde-Fragen Tisch und eine Gottheit-Fragen Tabelle implementieren möchten. In der Theorie ist dies immer noch viele-zu-viele, aber in der Praxis Sie es tun, so dass Sie mehrere Eins-zu-manys haben.