Frage

Wie würde eine Struktur eine Tabelle für eine Entität, die eine Eins-zu-Beziehung zu sich selbst haben kann? Insbesondere arbeite ich an einem App Tierzucht zu verfolgen. Jedes Tier hat eine ID; es hat auch einen Vater-ID und eine Dame ID. So ist es möglich, eine Eins-zu viele vom Vater oder Dame an seine Nachkommen zu haben. Ich würde so etwas geneigt sein:

ID INT NOT NULL PRIMARY KEY
SIRE_ID INT 
DAME_ID INT

und einen Nullwert für diese Tiere aufzunehmen, die gekauft wurden und in den Zuchtbestand und eine ID in der Tabelle für den Rest.

So:

  1. Kann mir jemand auf einen Punkt Artikel / Web-Seite, die diskutiert Modellierung dieser Art von Beziehung?
  2. Sollte die ID ein INT oder irgendeine Art von String? Ein NULL in der INT würde zeigen an, dass das Tier nicht hat Eltern in der Datenbank, sondern ein String mit speziellen Flag-Werte könnte verwendet, um die gleiche Sache zeigen.
  3. Wäre das vielleicht am besten modelliert werden über zwei Tabellen? Ich meine einen Tisch für die Tiere und ein separates Tabelle nur angibt Verwandtschaft e. g.

    Animal

    ID INT NOT NULL PRIMARY KEY

    Sippen

    ID INT NOT NULL PRIMARY KEY FOREIGN KEY

    SIRE_ID INT PRIMARY KEY FOREIGN KEY

    DAME_ID INT PRIMARY KEY FOREIGN KEY

Ich entschuldige mich für die oben: mein SQL rostig ist. Ich hoffe, es ist eine Art vermittelt, was ich denke.

War es hilfreich?

Lösung

Nun, das ist eine „normale“ Eins-zu-viele-Beziehung und die Methode, die Sie vorschlagen, ist der klassisch man es für die Lösung.

Beachten Sie, dass zwei Tabellen denormalized (Ich kann nicht genau zeigen, wo die superkey-ist-nicht-gut sollte-sein-Subset-of-andere-key-fsck-I-forgot Teil ist, aber ich m ziemlich sicher, dass es irgendwo da); der intuitive Grund ist, dass ein Tupel in dem ersten höchstens ein Tupel in dem zweiten übereinstimmt, so, wenn Sie viele Tiere mit null Vater und Dame-IDs haben, ist es keine gute Lösung in jeder Aussicht (es verschlechtert sich die Leistung - Notwendigkeit Join -. und verringert nicht die Speicheranforderungen)

Andere Tipps

Ich denke, Ihr Layout mit nur einem Tisch ist in Ordnung. Sie wollen auf jeden Fall SIRE_ID und DAME_ID in dem gleichen Datentyp wie ID zu halten. Sie wollen auch sie als Fremdschlüssel erklären (es ist möglich, einen Fremdschlüssel Punkt zurück auf den gleichen Tisch zu haben, und ein Fremdschlüssel kann auch null sein).

ID INT NOT NULL PRIMARY KEY
SIRE_ID INT REFERENCES TABLENAME (ID)
DAME_ID INT REFERENCES TABLENAME (ID)

Dieses Layout verwenden, können Sie leicht die Elterntiere sehen, und man kann auch einen Nachkommen Baum für ein bestimmtes Tier (für Oracle gibt es CONNECT BY)

bauen

, fragte ich eine ähnliche Frage eine Reihe von Monaten auf der MySQL-Website. Ich würde empfehlen, dass Sie einen Blick auf die Antwort nehmen, dass ich von Peter Brawley in Bezug auf diese Art von Beziehung erhalten: http : //forums.mysql.com/read.php 135,187196,187196 # msg-187196

Wenn Sie das Thema weiter erforschen wollen, dann würde ich empfehlen, dass man sich in Baum Hierarchies auf Wikipedia.

Eine andere vorgeschlagene Architektur (das wäre völlig normalisiert werden) würde in etwa wie folgt aussehen:

Tabelle: Tier

ID | name | Breed

Tabelle: Abstammung

animal_id | parent_id | parent (entweder Vater oder Dame)

INT ist die bessere Wahl für die ID-Spalte und besser geeignet, wenn Sie eine Sequenz verwenden sollten, um die eindeutige IDs zu erzeugen.

Ich sehe keinen Vorteil in das Design in zwei Tabellen aufgeteilt wird.

Ich weiß nicht, über die Tierzucht, aber es klingt wie Ihre Sire_ID der Vater ist und Dame_ID ist die Mutter? Kein Problem. Eine Zeile pro Tier, null sire_ und dame_ID die für gekaufte Tiere, ich forsee keine Probleme.

[ID],[Sire_ID],[Dame_ID];
0,null,null  (male)
1,null,null  (female)
2,null,null  (female)
3,0,1 (male)
4,0,2 (male)
5,null,null  (female)
6,3,5
7,4,5

und so weiter. Sie würden wahrscheinlich ein TreeView oder XmlNodeList in einer while-Schleife bevölkern ...

While (myAnimal.HasChildren) {
 Animal[] children = GetChildren(Animal.ID)
 for (int x=0; x<children.length; x++) 
  myAnimal.Children.Add(children[x]);
}

In diesem Fall ist Animal.Children eine Sammlung von Tieren. Daher myAnimal.Children [0] .Father würde myAnimal zurückzukehren. .Parent [] kann eine Sammlung seiner beide Eltern sein, die als so lange funktionieren sollen [0] ist immer ein Elternteil (Vater) und [1] ist immer die andere (Mutter).

Stellen-ID ein Auto PK und weisen Sire_ID und Dame_ID programmatisch durch die IDs seiner Eltern zurück. Keine Fremdschlüsselbeziehungen sollten notwendig sein, wenn beide Eltern IDs zurück zur Kenn könnte, wenn Sie wirklich wollen.

Verwenden Sie die „Verbindung von“ Klausel mit SQL es zu erklären, welche Hierarchie zu folgen.

Es ist nicht wirklich eine Eins-zu-Beziehung, es sei denn, ein Tier viele Eltern haben kann.

Ich würde es als eine einzige Tabelle mit dem eindeutigen Schlüssel-ID für das Tier verlassen, ein int Feld für jeden der Eltern, und wahrscheinlich ein Textfeld für allgemeine Hinweise über das Tier zu verwenden, wie, wo es gekauft wurde, wenn das ist der Fall ist.

Ich denke, dass da es klar ist, dass ein Tier nur einen Vater und einen Damm hat, dass eine einzelne Tabelle mit würde am meisten Sinn machen. Ich bevorzuge int oder Bigint als Zeilenkennung zu verwenden, mit einem Nullwert bedeutet keine Beziehung. Ich würde wahrscheinlich dann auf eine andere Methode verwendet Tiere eindeutig zu identifizieren, so dass sie in der Tabelle am Ende nicht zweimal, und erstellen Sie einen eindeutigen Index für die Spalte als auch.

Scheint, wie Sie so etwas wie ein Baum aufbauen wollen.

Was ist so etwas wie:

 ID          Primary Key,
 Parent_ID   Foreing_Key
 ( data )

Es gibt einige Funktionen für querys in Tabellen mit Beziehungen zu sich selbst zu tun. Siehe die Syntax von Verbinden von : http: // www.adp-gmbh.ch/ora/sql/connect_by.html

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