Frage

Ich erstelle eine Datenbank für ein Programm, wo soll ich einige Beziehungen in der Familie modellieren. Ex: X ist Vater Y, Y ist Sohn zu X

Also, ich habe eine Mitglieder Tabelle mit allen Informationen über jedes Mitglied so dachte ich über eine viele zu viele Beziehung zwischen dem machen Mitglieder Tisch und sich so, dass die < strong> Member_Member Bridge-Tabelle werden die Spalten "FK_FromID, FK_ToID" als Composite-Taste (ist das richtig?) und "FK_RelationType" als Fremdschlüssel RelationTypes Tabelle, die die Beziehung Typ „Vater, Mutter, Sohn, Tochter“, und zwei Beziehungen gehen, wie man zu viele von der Tabelle Mitglieder auf diese beiden Fremdschlüssel haben

Mein Problem ist, : beim Löschen, wenn ich wählen Kaskadierung dann werde ich Zyklen machen, weil, wenn ich ein Mitglied löschen, dann wird es in zwei Lösch Pässe verknüpften Datensätze sein Member_Member im Programm zu wissen, Brücke, dass, wenn i Einsatz eines Vater Beziehung i einen Sohn Beziehung als auch in der Member_Member Tabelle einfügen wird, gibt es einen Weg oder eine Abhilfe möglich Kaskadierung so zu ermöglichen, dass, wenn ich ein Mitglied lösche i die zugehörigen Datensätze löschen in Member_member , unabhängig davon, entweder in aufgezeichnet wird ein oder ein von Fremdschlüsselspalte

Also, ich weiß nicht, was zu tun ist dies ein richtiges Design in erster Linie, oder was? Was soll ich über das Radfahren zu tun, auch was denken Sie, ein besseres Design für das gleiche Problem zu wissen, ist, dass ich angeben müssen, welche Art von Beziehung zwischen den beiden Parteien

Vielen Dank für jede Hilfe, und sorry für schlechtes Englisch Bishoy

War es hilfreich?

Lösung

SQL behandelt nicht „Netzwerk“ Probleme wie diese sehr gut.

Der Element-Mitglied Brückentisch ist ein schrecklicher Name. Es ist ein „Mitglied-Eltern“ (oder „Eltern-Kind“) Brücke. Brücke Tabellen sollten nicht einen „gemeinsamen Schlüssel“ haben. Brücke Tabellen haben einen Ersatzschlüssel (nur eine laufende Nummer) und ein Paar von FK Verweisen auf andere Tabellen. Die beiden FK sollen die haben Namen wie „Mitglied“ und „Eltern“, um es perfekt zu machen klar, was die Beziehung in dieser Tabelle ist.

hat jeder einen Elternteil. Nicht jeder hat Kinder. Einige Eltern nicht haben Eltern in dieser Datenbank; sie sind die "Top-Eltern".

Es ist am einfachsten, wenn die Top-Eltern haben Zeilen in der Eltern-Kind-Brücke mit einem Elternteil FK von NULL. Auf diese Weise vermeiden Sie super-Komplex Außen verbindet - jedes Mitglied hat mindestens ein Mitglied-Eltemzeile; idealerweise zwei.

finden Sie viele „Radfahren“ Probleme, da Beziehungen transitiv sind.

Beachten Sie, dass Sie nicht können - in einer einzigen Standard-SQL-Abfrage - alle Mitglieder der Familie finden, oder alle Eltern an die Spitze der Familie zurück, oder alle Kinder und Enkelkinder. Es gibt SQL-Erweiterungen, die dies möglich zu machen, aber der Standard ist es nicht gut behandeln.

Die Kaskadierung löschen klappt nicht gut, weil die Beziehungen in einer Familie auf zwei Arten gerichtet sind (Eltern für Kinder, Kind zu den Eltern), aber SQL hat nur eine Art von Richtung (FK Referenz).

Sie können versuchen, um sicherzustellen, dass jedes Mitglied mindestens eine haben muss (und höchstens zwei) Reihen in „member-parent“ und das Löschen eines Mitglieds löscht die beiden Reihen in „Mitgliedschaft Eltern“ und die Tasten, die richtigen Namen haben, können Sie Teile dieser Arbeit machen.

Beachten Sie, dass, wenn Sie ein Mitglied löschen, das ihre Eltern Beziehungen brechen. Sie löschen das Mitglied Eltemzeile. Das ist gut. Was ist mit ihren Kindern? Die anderen Zeilen, die Mitglied-Eltern haben auf diese gelöschten Eltern beziehen, werden nun gebrochen. Was bedeutet das? Was soll getan werden?

  

Es gibt keine Standard Antwort. Zeilen aus einem zusammenhängenden Graphen Entfernen von Blättern Elemente   nicht an. Sie haben einige vernünftige Regeln dafür auszuarbeiten.

Da SQL dies nicht gut tun, alle Entwürfe scheinen Probleme zu haben.

Andere Tipps

  1. Unter der Annahme, jedes Mitglied nur eine Mutter und einen Vater haben kann, würden Sie in der Lage sein, alle die Beziehungen abzuleiten, indem einfach ein mother_id und father_id Feld in der members Tabelle zu halten.

    Dies würde jedoch nur funktionieren, wenn Ihre Datenbank nicht hat fehlende Informationen. Zum Beispiel sind der Bruder Mitglied Y, gäbe es keine Möglichkeit zu wissen, es sei denn, dies die Eltern von X und Y, wenn Element X in der Datenbank gespeichert ist.

    Wenn Ihre Datenbank nicht fehlen Informationen, die wird, könnte die oben einfache Datenintegrität zu verwalten. Abfragen könnten jedoch ein wenig komplex bekommen.

  2. Die member_member Brücke Sie vorgeschlagen hat ein ernstes Problem, da es eine Richtung der Beziehung impliziert, so dass, wenn X der Vater von Y, Y ist auch der Sohn von X. Sie schlug vor, die Beziehung zu definieren, zweimal in beiden Richtungen, aber im allgemeinen ist dies nicht zu empfehlen. Dies ist eine Form von Datenvervielfältigung und Sie können kämpfen referentielle Integrität mit Duplizierung von Daten zu erzwingen. Denken Sie daran, dass das DBMS nicht weiß, dass X Vater von Y ist die gleiche wie Y, der Sohn von X ist.

Ich bin mir bewusst, dass dies keine vollständige Antwort, aber nur ein paar Beobachtungen. Ich bin vollkommen einverstanden mit S.Lott Antwort wie es keine Standardmethode ist es, „lösen "dies mit relationalen Datenbanken.

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