次の例を考えてみましょう。「is-a」と書くときは、1 対 1 の関係を形成するために、そのテーブルの主キーであり、別のテーブルへの外部キーでもある列を意味します。「has-a」と書くときは、通常の外部キー列を意味し、1 対多の関係を形成します。
- フルーツバスケットテーブル.
- リンゴかごのテーブル、「is-a」フルーツバスケット。
- オレンジ色のバスケット テーブル、「is-a」フルーツバスケット。
- フルーツテーブル「has-a」フルーツバスケット。
- りんごの食卓、「is-a」フルーツ。
- オレンジ色のテーブル、"is-a" フルーツ。
当分の間、null 許容列または型列挙で親テーブルを乱雑にする代わりに、そのテーブルの存在を保証するのに十分なコンテキスト固有の列が applebasket、orangebasket、apple、および orange にあると仮定します。
質問:
- fruit と fruitbasket を関連付けるのと、apple と applebasket + orange と orangebasket を関連付けるのとでは、どちらがより適切でしょうか? 前者は冗長性が低いように見えますが、潜在的に無効な関係を持つ可能性があります (たとえば、リンゴ -> 果物 -> 果物かご -> オレンジかご)。後者はリレーションを強制的に有効にしますが、より冗長であり、他の継承するフルーツ テーブルは独自のバスケット外部キーを宣言する必要があります。
- 具体的には PostgreSQL の場合、最初の選択肢 (フルーツ バスケットに関連するもの) を考えると、関係の妥当性をチェックする最も簡単な方法は何ですか? 3 つの結合を実行する必要があります。
- これをきれいに実装するための他の提案はありますか?
ありがとう...