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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top