Ich habe einen Stammbaum. Ich möchte es in einer MySQL-Datenbank speichern. Ich habe eine Tabelle mit einer Spalte namens "Familienmitglieder", aber ich weiß nicht, wie ich diese Familienmitglieder arrangieren soll. Zum Beispiel bin ich unter meinem Vater und mein Sohn ist unter mir. Ich denke, wie kann ich diesen Baumtyp in einer Datenbank speichern?
Sie sagten also, Sie hätten eine Tabelle mit einer Spalte namens "Familienmitglieder". Für mich ist das nur unpassend, weil es die Normalisierung nicht respektiert :) Zuerst würde ich es "familyTreeId" nennen. Gehen wir nun zur FamilyTree-Tabelle.
Diese Tabelle würde etwa so aussehen:
FamilyTree(id, motherId, fatherId, etc)
- & gt; etc: Wenn Sie zusätzliche Daten haben
id
ist der Primärschlüssel der Tabelle motherId
wird mit der Zeile in der Tabelle FamilyTree
verknüpft, die zur Mutter fatherId
wird mit der Zeile in der Tabelle FamilyTree
verknüpft, die zum Vater Also sind die Zeilen:
%Vor%Andere Möglichkeit wäre, die Paare zu speichern
FamilyTreeParents(id, motherId, fatherId)
FamilyTreeNodes(id, familyTreeParentsId)
id
ist der Primärschlüssel der Tabellen familyTreeParentsId
ist ein Fremdschlüssel für eine FamilyTreeParents
Tabelle motherId
ist ein Fremdschlüssel für eine Zeile in der Tabelle FamilyTreeNodes
, die zu der Mutter fatherId
ist ein Fremdschlüssel für eine Zeile in der Tabelle FamilyTreeNodes
, die zum Vater Also sind die Zeilen:
FamilyTreeParents
%Vor%FamilyTreeNodes
%Vor% Daten sind auf diese Weise normalisierter, weil Sie keine Informationen wiederholen (wie you
und yourwife
für son1
und son2
wie in der anderen Lösung. Diese Lösung ist jedoch möglicherweise weniger effizient der Geschwindigkeit, weil mehr Joins benötigt werden.
Sie können ein Schema wie dieses haben
Family( Parent_name, Child_name )
. Das "Tupel" (Parent_name, Child_name)
ist der Schlüssel Ihrer Tabelle. Angenommen, es gibt keine doppelte (Parent_name, Child_name)
in Ihrem Familienstammbaum. Wenn Sie etwas wie Social Security Number
haben, um eine Person im Familienstammbaum eindeutig zu identifizieren, dann sollten Sie Parent_ssn, Child_ssn
anstelle von Namen verwenden und eine separate Tabelle haben, um die Beziehung zwischen ssn
und name
zu speichern, deren Schlüssel wäre ssn
Elemente in dieser Tabelle können
sein %Vor%Hoffe das hilft
Ich würde zwei Tische behalten, einen mit Personen, einen anderen mit Verwandten. Die Frage hier ist, ob Sie die Beziehung in einem Datensatz (zB Ehemann - Ehefrau) oder auch von der anderen Person (1: Ehemann - Ehefrau, 2: Ehefrau - Ehemann) halten sollten. Der Vorteil des zweiten Ansatzes ist die schnelle Suche, also das schnelle Rendern zB eines Layouts, aber auch eine größere Tabelle mit mehr Schreibvorgängen bei Datenänderungen und möglichen Fehlern. Ich würde den ersten Ansatz nehmen und einen Index verwenden, um die Suche schneller zu machen.
Also mit einem Minimum an Verbindungen könnten Sie die folgende Familie ausschreiben
%Vor%Tags und Links mysql