1

いくつかのタイプのエンティティがあり、それぞれに独自のフィールドがあり、別々のテーブルに格納されています。
このようなテーブルの各レコードは、異なるテーブルの 0 個以上のレコードに接続できます。つまり、異なるエンティティ タイプのレコードにリンクできます。
ルックアップ テーブルを使用すると、(m(m-1))/2=O(m^2) 個の個別のルックアップ テーブルを初期化する必要があります。
6 つまたは 7 つの異なるエンティティ タイプに対してはまだ実行可能ですが、50 以上のそのようなタイプに対しても関連がありますか?
特に、特定のレコードには他のほとんどのエンティティ タイプへのリンクが必要になるため、理論的に言えば、ほぼ完全で無向の n 面グラフを扱うことになります。
この構造をリレーショナル DBMS に格納する方法を誰かが明らかにすることはできますか?
(重要な場合は Postgresql を使用していますが、他の DBMS のソリューションも同様に役立ちます)。
お時間をいただきありがとうございます!

ユヴァル

4

3 に答える 3

2

これはオブジェクト リレーショナル マッピングであり、古典的に難しい問題です。これを適切に行うには、ORM ツールが本当に必要です。

あなたが参照している接続の問題は落とし穴の 1 つであり、非常に慎重な最適化とクエリの調整が必要です。そうしないと、パフォーマンスが低下します (N+1 SELECT 問題など)。

アプリケーション プラットフォームが何であるかを知らずに、これ以上具体的に言うことはできません。実際に使用されている DBMS は、実際には問題とは関係ありません。

于 2008-09-28T15:33:02.717 に答える
2

すべてのエンティティ型に共通の基本型を使用し、その基本型を介して関係を処理できます。これは、ディスクリミネータ列と外部キー関係を使用して事実上すべての ORM ツールで実行できることです (ただし、CLSA については詳しくありません)。

このアプローチでは、1 つのリレーションシップ テーブルが残ります。

編集: これを設定する方法は次のとおりです。

CREATE TABLE base (
  id int(10) unsigned NOT NULL auto_increment,
  type enum('type1','type2') NOT NULL,
  PRIMARY KEY  (id)
);

CREATE TABLE type1 (
  id int(10) unsigned NOT NULL,
  PRIMARY KEY  (id),
  CONSTRAINT FK_type1_1 FOREIGN KEY (id) REFERENCES base (id)
);

CREATE TABLE type2 (
  id int(10) unsigned NOT NULL,
  PRIMARY KEY  (id),
  CONSTRAINT FK_type2_1 FOREIGN KEY (id) REFERENCES base (id)
);


CREATE TABLE x_relations (
  from_id int(10) unsigned NOT NULL,
  to_id int(10) unsigned NOT NULL,
  PRIMARY KEY  (from_id,to_id),
  KEY FK_x_relations_2 (to_id),
  CONSTRAINT FK_x_relations_1 FOREIGN KEY (from_id) REFERENCES base (id),
  CONSTRAINT FK_x_relations_2 FOREIGN KEY (to_id) REFERENCES base (id) 
  ON DELETE CASCADE ON UPDATE CASCADE
);

ORM ソリューションが行 (または)typeの正しいサブタイプを見つけるのに役立つ識別子列 ( ) に注意してください。ORM のドキュメントには、ポリモーフィズムをベース テーブルにマップする方法に関するセクションが必要です。type1type2

于 2008-09-28T16:05:44.120 に答える
0

もう 1 つのオプションは、db40 やキャッシュなどのオブジェクト指向データベースを使用することです。パフォーマンスが大きな問題ではなく、オブジェクト グラフ全体を保存することに決めている場合は、これを検討している可能性があります。

于 2008-09-28T15:39:05.057 に答える