3

私は家族の関係をモデル化することになっているプログラムのデータベースを作成しています。 例: XはYの父、YはXの息子

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

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

だから、私は何をすべきかわかりません、これはそもそも正しいデザインですか、それとも何ですか?、サイクリングについて私は何をすべきか、また同じ問題のより良い設計は、私が2つの当事者間のどのような関係を指定する必要があることを知っているべきだと思いますか

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

4

2 に答える 2

2

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

メンバー間ブリッジ テーブルはひどい名前です。これは「メンバー-親」(または「親子」) ブリッジです。ブリッジ テーブルには「複合キー」を含めないでください。ブリッジ テーブルには、代理キー (単なる連番) と、他のテーブルへの一対の FK​​ 参照があります。2 つの FK には、このテーブルでの関係を完全に明確にするために、「メンバー」や「親」などの名前を付ける必要があります。

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

一番上の親が、親 FK が NULL の親子ブリッジに行を持っている場合が最も簡単です。そうすれば、非常に複雑な外部結合を回避できます。すべてのメンバーには、メンバーと親の行が少なくとも 1 つあります。理想的には2つ。

関係は推移的であるため、多くの「循環」の問題が見つかります。

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

ファミリ内の関係は 2 つの方向 (親から子へ、子から親へ) に向けられますが、SQL には 1 種類の方向 (FK 参照) しかないため、カスケード削除はうまくいきません。

すべてのメンバーが「member-parent」に少なくとも 1 行 (および最大 2 行) を持っている必要があり、メンバーを削除すると「member-parent」の 2 行が削除されキーに適切な名前が付けられていることを確認できます。あなたはこの作品の一部を作るかもしれません。

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

標準的な答えはありません。接続されたグラフから行を削除すると、要素が接続されていないままになります。そのためには、いくつかの合理的なルールを作成する必要があります。

SQL はこれをうまく処理できないため、すべての設計に問題があるように見えます。

于 2010-03-02T11:12:58.610 に答える
0
  1. 各メンバーが 1 人の母親と 1 人の父親しか持てないと仮定すると、テーブルにmother_idandfather_idフィールドを保持するだけですべての関係を導き出すことができmembersます。

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

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

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

これが完全な答えではなく、いくつかの観察であることは承知しています。リレーショナルデータベースでこれを「解決」する標準的な方法がないため、S.Lottの回答に完全に同意します。

于 2010-03-02T11:16:57.963 に答える