質問

自分自身と1対多の関係を持つことができるエンティティのテーブルをどのように構成しますか?具体的には、動物の繁殖を追跡するアプリの開発に取り組んでいます。各動物にはIDがあります。種雄牛IDと雄牛IDもあります。そのため、種雄牛からその子孫まで1対多の飼育が可能です。私はこのようなものに傾くでしょう:

ID INT NOT NULL PRIMARY KEY
SIRE_ID INT 
DAME_ID INT

購入して繁殖用ストックに追加した動物のヌル値と、残りのテーブルのIDを記録します。

だから:

  1. 誰かが私を指すことができます 議論する記事/ウェブページ この種の関係をモデル化しますか?
  2. IDはINTまたは何らかのソートである必要があります 文字列の? INTのNULLは 動物にないことを示します データベース内の親、ただし文字列 特別なフラグ値で 以前は同じことを示していました。
  3. これはおそらく最良のモデルになりますか 2つのテーブル経由?私は1つのテーブルを意味します 動物と別の 親族関係のみを示す表e。 g。:

    動物

    ID INT NOT NULL PRIMARY KEY

    親族

    ID INT NOT NULLプライマリキーの外部キー

    SIRE_ID INT PRIMARY KEY FOREIGN KEY

    DAME_ID INT PRIMARY KEY FOREIGN KEY

上記についておaび申し上げます。SQLは錆びています。私が考えていることをそれが伝えることを願っています。

役に立ちましたか?

解決

まあ、これは「通常」です1対多の関係と提案する方法は、それを解決するための古典的な方法です。

2つのテーブルが非正規化されていることに注意してください(スーパーキーが他のキーのサブセットである必要があり、正確にどこにあるのかを正確に指摘することはできませんが、私は忘れました)どこかにあると確信しています);直感的な理由は、最初のタプルが2番目のタプルと多くても一致するためです。したがって、Null sireとdame IDを持つ動物がたくさんいない限り、それはどのような見通しでも良い解決策ではありません(パフォーマンスを悪化させます-必要性結合-ストレージ要件を削減しません。)

他のヒント

テーブルを1つだけ使用するレイアウトは問題ないと思います。 SIRE_IDとDAME_IDをIDと同じデータ型に保持することは間違いありません。また、それらを外部キーとして宣言する必要があります(外部キーが同じテーブルを指すようにすることは可能ですが、外部キーもnullにすることができます)。

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

このレイアウトを使用すると、親動物を簡単に検索できます。また、特定の動物の子孫ツリーを構築できます(OracleにはCONNECT BYがあります)

MySQL Webサイトで数か月前に同様の質問をしました。このタイプの関係に関してPeter Brawleyから受け取った応答をご覧になることをお勧めします。 http ://forums.mysql.com/read.php?135,187196,187196#msg-187196

トピックをさらに調査したい場合は、Wikipediaのツリー階層を調べることをお勧めします。

別の推奨アーキテクチャ(完全に正規化される)は、次のようになります。

表:動物

ID |名前|品種

表:血統

animal_id | parent_id | parentType(sireまたはdame)

INTはID列に適した選択肢であり、シーケンスを使用して一意のIDを生成する必要がある場合に適しています。

デザインを2つのテーブルに分割しても何の利点もありません。

動物の繁殖については知りませんが、あなたのSire_IDが父親で、Dame_IDが母親のようです。問題ない。動物ごとに1行、購入した動物のsire_およびdame_IDはnullです。問題は見当たりません。

[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

など。 whileループでTreeViewまたはXmlNodeListを設定する可能性があります...

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

この場合、Animal.Childrenは動物のコレクションです。したがって、myAnimal.Children [0] .FatherはmyAnimalを返します。 .Parent []は2つの親のコレクションであり、[0]が常に一方の親(父)であり、[1]が常に他方(母)である限り機能します。

IDを自動番号PKにし、親のIDを返すことにより、Sire_IDとDame_IDをプログラムで割り当てます。必要に応じて、両方の親IDがIDを参照することもできますが、外部キーの関係は必要ありません。

「接続方法」を使用どの階層に従うかを指示するSQL節。

動物が多くの親を持つことができない限り、それは実際には一対多の関係ではありません。

動物の一意のキーID、各親の1つのintフィールド、およびおそらく動物に関する一般的なメモに使用するテキストフィールドを含む単一のテーブルとして残します。ケース。

動物には1匹の種牡馬と1匹のdamしかないことは明らかなので、単一のテーブルを使用するのが最も理にかなっていると思います。私の好みは、行識別子としてintまたはbigintを使用することです。null値は関係がないことを示します。その場合、おそらく他の方法を使用して動物を一意に識別し、動物がテーブルに2回入らないようにし、その列にも一意のインデックスを作成します。

ツリーのようなものを構築したいようです。

次のようなものはどうですか?:

 ID          Primary Key,
 Parent_ID   Foreing_Key
 ( data )

自分自身と関係のあるテーブルでクエリを実行するための機能がいくつかあります。 接続方法の構文を参照してください: http:// www.adp-gmbh.ch/ora/sql/connect_by.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top