So speichern Sie Familienstammbaumdaten in einer MySQL-Datenbank

9

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?

    
kirby 03.02.2012, 05:37
quelle

3 Antworten

7

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
  • gehört
  • fatherId wird mit der Zeile in der Tabelle FamilyTree verknüpft, die zum Vater
  • gehört

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
  • gehört
  • fatherId ist ein Fremdschlüssel für eine Zeile in der Tabelle FamilyTreeNodes , die zum Vater
  • gehört

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.

    
Mosty Mostacho 06.02.2012 06:31
quelle
1

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

    
louis.luo 03.02.2012 05:43
quelle
1

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%     
peter 25.02.2012 13:41
quelle

Tags und Links