web-dev-qa-db-ja.com

1つの外部キーに対する2つの主キー

racing_couple
ID (PRIMARY)

breeding_couple
ID (PRIMARY)

Egg
IDpar(FOREIGN KEY)

2つの異なるテーブル(racing_coupleとbreeding_couple)からの2つのIDがあり、それらは主キーです。 3.テーブル(卵)には、外部キーであるIDparがあり、racing_coupleとbreeding_coupleのIDを参照しています。表は鳩の競争と繁殖のカップルを表し、表「卵」は競争または繁殖のカップルの卵を表します。また、IDparを使用して、どの卵がどのカップルに属しているかを識別しています。

両方のデータベースに他のフィールドがありますが、それらは主にvarcharであり、この問題にはそれほど関係ありません。

両方のデータベースにこのようなものがある場合。どのIDparがracing_coupleの値を持ち、どのIDparがbreeding_coupleの値を持っているかを知る方法。私のデータベースをこのようにして間違えたと思いますが、それを機能させる方法はありますか?

ID(racing_couple)
1
2

ID(breeding_couple)
1
2

IDpar(Egg)
1 (ID racing_couple)
1 (ID breeding_couple)
2 (ID racing_couple)
2 (ID breeding_couple)
2
FosAvance

各カップリングのプロパティが十分に類似している場合は、2つではなく1つの「カップル」テーブルが必要か、または次のように、2つの既存のタイプのカップルが「継承」するカップルテーブルを使用することをお勧めします。

RC                  Couple                                Egg
----------          ---------------------------           ----------------
C ID (FK)   ----->  C ID (PK)                    <-----   C ID (FK)
(rc props)    |     (generic couple properties)           (Egg properties)
              |
BC            |
----------    |
C ID (FK)   --'
(BC props)

あなたはまだこの配置でどんな繁殖とレースの詳細も持っていることができますが(もちろん実際には大丈夫かもしれません)、各卵は1つのカップルにのみ関連付けることができます。この方法でモデル化した場合、カップルのIDの範囲は1つしかなく、カップルに関連するデータを含む他のすべてのテーブルには、レコードにリンクできるFKが1つしかないため、ID範囲が重複しても問題は発生しません。

1
David Spillett

はい。間違い。

この設計作業を行う1つの方法は、ID範囲が重複しないようにすることです。たとえば、レーシングカップルIDを10000から開始します(もちろん、繁殖カップルIDでその近くに決して到達しないと仮定します)。

または、使用する結合テーブルを示すフラグをEggテーブルに追加できますか?

0
Thomas Rushton