質問

私は家族関係をモデル化するプログラム用のデータベースを作成しています。元:X は Y の父親であり、Y は X の息子です

それで、私は メンバー 各メンバーに関するすべての情報を含むテーブルがあるため、メンバー間に多対多の関係を作成することを考えました。 メンバー テーブルとそれ自体が Member_メンバー ブリッジテーブルには列が含まれます 「FK_FromID 、FK_ToID」 複合キーとして(これは正しいですか?)、 「FK_関係タイプ」 の外部キーとして 関係タイプ このテーブルにはリレーション タイプ "Father,mother,son,daughter" があり、Members テーブルからこれら 2 つの外部キーへの 2 つのリレーションが 1 対多になります。

私の問題は :削除するときにカスケードを選択すると、メンバーを削除すると関連レコードへの削除パスが 2 つあるため、サイクルが作成されます。 Member_メンバー ブリッジ、プログラムで父親リレーションを挿入するたびに、 Member_Member テーブルに息子リレーションも挿入することを知っていますが、メンバーを削除するたびに関連レコードを削除するようにカスケードを有効にする方法または回避策はありますかで メンバー_メンバー to または from 外部キー列に記録されているかどうかは関係ありません

それで、どうすればいいのかわかりません、そもそもこれは正しい設計ですか、それとも何ですか?、サイクリングについてはどうすればよいでしょうか。また、同じ問題に対してより良い設計を行うには、2 つの当事者間の関係の種類を指定する必要があると思いますか?

助けてくれてありがとう、そして悪い英語のビショイをごめんなさい

役に立ちましたか?

解決

SQLは非常によく、このような「ネットワーク」の問題を処理しません。

メンバーメンバーのブリッジテーブルはひどい名前です。それは、「メンバーの親」(または「親子」)橋です。ブリッジテーブルは、「複合キー」を持つべきではありません。ブリッジテーブルは代理キー(単に連番)と他のテーブルへのFK参照のペアを持っています。 2 FKのは、それが完全に関係がこの表にあるものを明確にし、「メンバー」と「親」のような名前を持つ必要があります。

誰もが親を持っています。誰もが子供を持っています。一部の親は、このデータベースに親を持っていません。彼らは「トップの両親」です。

トップ両親がNULLの親FKと親子ブリッジ内の行を持っている場合は、

これは最も簡単です。 ;すべてのメンバーは、少なくとも一つのメンバーの親行を持っている - あなたは超複雑なアウターは、参加しないことを道理想的に2ます。

あなたは関係が推移しているため、多くの問題を「サイクリング」でしょう。

あなたができないことに注意してください - 単一の標準的なSQLクエリで - 家族のすべてのメンバーを検索するか、すべての親が家族の先頭に戻る、またはすべての子供や孫。そここれを可能にするSQLの拡張機能がありますが、標準はそれをうまく処理できません。

家族内の関係は、次の2つの方法(子供の親、親の子)に向いますが、SQLは方向のみの1種類(FK参照)がされているので。

このカスケード削除がうまく動作しません。

あなたはすべてのメンバーが、少なくとも一つを有していなければならないことを保証しようとすることができます(ほとんどの2時)、「メンバー-親」の行ののメンバーの削除がmember-」の2つの行を削除します親」ののキーは、あなたがこの作品の部品を作るかもしれませんが、適切な名前を持っています。

あなたはメンバーを削除すると、これは彼らの親との関係を壊すことに注意してください。あなたは、メンバーの親行を削除します。それは良い。子供たちはどう?この削除された親を参照するメンバーの親を持つ他の行は、現在壊れています。これは何を意味するのでしょうか?何をすべきか?

  

何の標準の答えはありません。連結グラフのリーフ要素から行を除去すること   未接続。あなたはそのためのいくつかの賢明なルールをうまくする必要があります。

SQLがうまくこれを行いませんので、

、すべてのデザインは、問題を持っているように思われます。

他のヒント

  1. 各メンバーが母親と父親を 1 人だけ持つことができると仮定すると、単純に mother_id そして father_id のフィールド members テーブル。

    ただし、これはデータベースが次の場合にのみ機能します。 しない 情報が欠けています。たとえば、メンバー X がメンバー Y の兄弟である場合、X と Y の親がデータベースに保存されていない限り、これを知る方法はありません。

    データベースに欠落情報がない場合は、上記の方法でデータの整合性を管理する方が簡単になる可能性があります。ただし、クエリは少し複雑になる可能性があります。

  2. member_member あなたが提案したブリッジには、関係の方向性を暗示しているため、X が Y の父親である場合、Y は X の息子でもあるという重大な問題が 1 つあります。関係を両方向で 2 回定義することを提案しましたが、一般的にこれはお勧めできません。これはデータ重複の一種であり、データの重複により参照整合性を強制するのが困難になる場合があります。DBMS は、X が Y の父親であることは、Y が X の息子であることと同じであることを認識していないことに注意してください。

これが完全な答えではなく、いくつかの観察にすぎないことは承知しています。私も全く同感です S.ロットの答え リレーショナル データベースでこれを「解決」する標準的な方法がないのと同様です。

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