2

直面した設計上の問題について質問があります…</p>

サブタイプ B と C を持つテーブル A があります。テーブル A には、タイプが B か C かを示す属性タイプがあります。B と C の共通属性は A にあります。

問題は、B に追加の属性がないことです。B に必要なすべての属性は、既に A に含まれています。ただし、C には追加の属性があります。

テーブル A と C のみを作成した場合、それは受け入れられる解決策ですか??… BI のエンティティを抽出するには、テーブル A から type 属性を介してクエリを実行します

資料を参照できますか?

テーブル A にサブタイプ B,C,D があるという別の混乱もありました。テーブル Z には、B または C のプライマリ ID の値を必要とするが D ではない列があります。

AのプライマリID列をZの列への外部キー参照として追加し、IDがDでないことを確認するトリガーを作成することを考えました...

誰でもコメントできますか?

ありがとうございました !

4

2 に答える 2

2

多くの人は、これらすべてのルールをアプリケーション コードで強制しています。つまり、「単純に」間違ったデータを挿入しません。もちろん、これは非常に脆弱であり、常に完璧なアプリケーション コードを作成する必要があります。そのため、間違ったデータが挿入されないように、代わりにデータベースに制約を適用する必要があります。

CREATE TABLE A (
  id INT PRIMARY KEY,
  type CHAR(1) NOT NULL,
  unique key (id, type)
);

CREATE TABLE B (
  id INT PRIMARY KEY,
  type CHAR(1) NOT NULL DEFAULT 'B',
  FOREIGN KEY (id, type) REFERENCES A(id, type)
);

B.ty​​pe を常に 'B' にする (CHECK 制約、トリガー、または 1 行のルックアップ テーブルを参照する) ことができる場合は、もちろん type='B' である A の親行を参照できます。そして、テーブル C と D で同様のことを行うと、A の各行は、1 つのサブタイプ テーブルからの行だけで参照できるようになります。

つまり、特定の行で A.type が 'B' であり、C.type が 'C' のみである場合、C の行は A.type が 'B' である行を参照できません。

テーブル Z が B または C を参照し、D を参照しないようにする場合は、IDタイプで参照できるため、Z にも独自のタイプ列があります。ルックアップ テーブルを使用して Z.type を制限できます。

CREATE TABLE Ztypes (
  type CHAR(1) PRIMARY KEY
);

INSERT INTO Ztypes VALUES ('B'), ('C');

CREATE TABLE Z (
  id INT PRIMARY KEY,
  Aid INT NOT NULL,
  type CHAR(1) NOT NULL,
  FOREIGN KEY (Aid, type) REFERENCES A(id, type),
  FOREIGN KEY (type) REFERENCES Ztypes(type)
);
于 2012-11-30T19:27:28.753 に答える
0

あなたが探していた答えはすでに得られています。しかし、これに出くわした他の人にとっては、クラス テーブルの継承と共有主キーという 2 つの手法を調査する価値があります。

これら 2 つの手法を一緒に使用すると、A のデータを B または C のデータとすばやく簡単に結合できます。このパターンでは、B にはキーのみが含まれていますが、有用な情報が含まれています。

これらのテクニックには両方とも独自のタグがあります。

于 2012-12-01T02:05:29.850 に答える