5

単一のテーブルで一対多の関係を定義するために使用しようとしています。たとえば、次のエントリを持つ Groups テーブルがあるとします。

グループ:
  グループ_1:
    名前:アトランティック・レコード
  グループ_2:
    名前: キャピタル レコード
  グループ_3:
    名前:ナールス・バークレー
  グループ_4:
    名前:キューティーのデスキャブ
  グループ_5:
    名前:コールドプレイ
  グループ_6:
    名称:管理会社

グループ Coldplay は、Capital Records グループの子であり、Management Company グループの子である可能性があり、Gnarls Barkley は、Atlantic Records の子のみである可能性があります。

この関係を表す最良の方法は何ですか。PHPとmySQLを使用しています。また、それが役立つ場合は、ORM として PHP-Doctrine を使用しています。

2 つの列を持つ group_groups というリンク テーブルを作成する必要があると考えていました。owner_id と group_id。ただし、これが最善の方法であるかどうかはわかりません。

任意の洞察をいただければ幸いです。私の問題を十分に説明したかどうか教えてください。

4

8 に答える 8

7

このアプローチにはいくつかの問題が考えられますが、要件を最小限に理解していれば、次のようになります。

ここには実際には 3 つの「エンティティ」があるように見えます: アーティスト/バンド、レーベル/レコーディング会社、および管理会社です。

アーティスト/バンドは、レーベル/レコーディング CO を持つことができます アーティスト/バンドは、管理会社を持つことができます。

レーベル/レコーディング会社は複数のアーティスト/バンドを持つことができます

管理会社は複数のアーティスト/バンドを持つことができます

したがって、Recording Co と Artists の間、および Management Co と Artists の間には 1 対多の関係があります。

各エンティティを一意の ID を使用して、独自のテーブルに 1 回だけ記録します。

「多数」の各インスタンスに「1」のキーを配置します。この場合、アーティスト/バンドはレコーディング Co ID と管理 Co ID の両方を持ちます。

その後、クエリは最終的にアーティスト、レコーディング会社、および管理会社に結合されます。

この構造では、交差テーブルは必要ありません。「エンティティ」が明確に分離されており、クエリは比較的単純です。

于 2008-10-24T21:31:18.530 に答える
3

いくつかのオプション:

最も簡単: 各グループが 1 つの親しか持てない場合は、メイン テーブルに「ParentID」フィールドが必要です。

関係がそれよりも複雑になる可能性がある場合は、そうです、何らかのリンクテーブルが必要になります。2 つのグループ間の関係の種類を定義する "関係タイプ" 列もあるかもしれません。

于 2008-10-24T21:21:55.630 に答える
1

この特定の例では、1 つのテーブルで 3 つの別個のエンティティをモデル化しているように見えるため、Ken G のアドバイスに従うのが賢明です。

一般に、これが発生する可能性があります-「人」テーブルがあり、みんなの友達が誰であるかをモデル化している場合、不自然な例です。

この場合、これらの関係を管理するための「リンク」テーブル、連想テーブル、または結婚テーブルが実際にあります。

于 2008-10-24T21:44:22.653 に答える
0

NestedSet http://www.doctrine-project.org/documentation/manual/1_0/en/hierarchical-data#nested-setを使用するのが最善だと思い ます

actAs NestedSet を設定するだけ

于 2008-12-12T18:16:03.537 に答える
0

管理とラベルを分離する必要があるという Ken G と JohnMcG に同意します。しかし、彼らはバンドが複数のマネージャーおよび/または一定期間にわたって複数のマネージャーを持つことができることを忘れているかもしれません. その場合、多対多の関係が必要になります。

  • マネジメントには多くのバンドがいます
  • バンドはマネージメントが多い
  • レーベルには多くのバンドが所属
  • バンドには多くのレーベルがある

その場合、関係テーブルを使用するという最初のアイデアは正しいです。つまり、多対多の関係が行われるホームです。ただし、group_groups の方が適切な名前を付けることができます。

最終的には、要件によって異なります。たとえば、CD タイトルを保存している場合、おそらくバンドではなく特定の CD にラベルを付けたいと思うでしょう。

于 2008-10-24T22:15:54.943 に答える
0

これは、STI (単一テーブル継承) とネストされたセット/ツリー構造の融合のようです。ネストされたセット/ツリーは、複数の子に対する 1 つの親です。

http://jgeewax.wordpress.com/2006/07/18/hierarchical-data-side-note/

http://www.dbmsmag.com/9603d06.html

http://www.sitepoint.com/article/hierarchical-data-database

于 2008-10-25T15:47:36.297 に答える
-1

はい、説明したフィールドを含むブリッジが必要です。ただし、説明したのと同じタイプのエンティティに従っている場合は、テーブルを分割する必要があると思います。

于 2008-10-24T21:22:55.067 に答える
-1

(参照に使用できる id 列があると想定しています)。

parent_id (null を許可) という列を追加して、親グループの ID をそこに格納できます。次に、次のように sql を使用して参加できます

このリンクには別のテーブルを使用することをお勧めします。理由は次のとおりです。 1. フィールドで複数の親をサポートすることはできません。別のテーブルを使用する必要があります。2. キーの競合が発生する可能性があるため、テーブル内のフィールドのインポート/エクスポート/削除は非常に困難です。たとえば、データをインポートしようとする場合、最初に親をインポートしてから子をインポートする必要があります。別のテーブルを使用すると、データの実際の順序を気にせずに、すべてのグループをインポートしてからすべての関係をインポートできます。

于 2008-10-24T21:30:27.250 に答える