仕様の私の解釈によると、2つの異なる(ただし接続されている)スーパータイプサブタイプ構造を実装する方法を見つけたいと考えています。
aformentionedタスクを達成するためのアプローチを露出させるためには、私は問題では、シナリオに2つの古典追加するつもりです架空のエンティティと呼ばれるタイプFoo
とBar
、私は意志詳細怒鳴るを。
ビジネスルール
論理モデルの作成に役立ついくつかのステートメントを次に示します。
A Foo is either one Bar or one C
A Foo is categorized by one FooType
A Bar is either one A or one C
A Bar is classified by one BarType
論理モデル
そして、結果のIDEF1X [1]論理モデルを図1に示します(また、DropboxからPDFとしてダウンロードすることもできます)。
Foo and Barの追加
私は追加しませんでしたFoo
し、Bar
より良いモデルの外観を作るために、それはより表現にします。私はそれらが次の理由で重要であると思います:
通りA
とB
名前の属性を共有しE
、この機能は示唆している、彼らは明確な(しかし関連)の一種のサブエンティティタイプであることをコンセプト、イベント、人、測定、私はによって表さなど、Bar
順番に、である、というスーパーエンティティタイプ階層の最上部に属性Foo
を保持するのサブエンティティタイプD
。
以来C
検討中のエンティティタイプの残りの株式のみつの属性、すなわち、D
このアスペクトほのめかすそれは別の種類のサブエンティティタイプであることをコンセプト、イベント、人、測定など、ので、私はのおかげで、このような状況を描写Foo
スーパーエンティティタイプ。
ただし、これらは単なる仮定であり、リレーショナルデータベースは特定のビジネスコンテキストのセマンティクスを正確に反映することを意図しているため、特定のドメインで関心のあるすべてのものを識別して分類する必要があります。 。
設計段階の重要な要素
すべての用語を別として、排他的なスーパータイプサブタイプクラスターは通常の関係であるという事実を認識することは非常に便利です。次の方法で状況を説明しましょう。
- 各排他的スーパーエンティティタイプの出現は、1つのサブエンティティタイプの補数のみに関連しています。
したがって、これらの場合には1対1(1:1)の対応(またはカーディナリティー)があります。
これまでの投稿からわかるように、この性質の関連付けを作成するとき、スーパータイプが接続されている正しいサブタイプインスタンスを示すため、discriminator属性(実装時の列)は最重要の役割を果たします。(i)スーパータイプから(ii)サブタイプへの主キーの移行も重要な意味を持ちます。
具体的なDDL構造
次に、上記の論理モデルに基づいたDDL構造を作成しました。
CREATE TABLE FooType -- Look-up table.
(
FooTypeCode CHAR(2) NOT NULL,
Description CHAR(90) NOT NULL,
CreatedDateTime DATETIME NOT NULL,
CONSTRAINT PK_FooType PRIMARY KEY (FooTypeCode),
CONSTRAINT AK_FooType_Description UNIQUE (Description)
);
CREATE TABLE Foo -- Supertype
(
FooId INT NOT NULL, -- This PK migrates (1) to ‘Bar’ as ‘BarId’, (2) to ‘A’ as ‘AId’, (3) to ‘B’ as ‘BId’, and (4) to ‘C’ as ‘CId’.
FooTypeCode CHAR(2) NOT NULL, -- Discriminator column.
D INT NOT NULL, -- Column that applies to ‘Bar’ (and therefore to ‘A’ and ‘B’) and ‘C’.
CreatedDateTime DATETIME NOT NULL,
CONSTRAINT PK_Foo PRIMARY KEY (FooId),
CONSTRAINT FK_from_Foo_to_FooType FOREIGN KEY (FooTypeCode)
REFERENCES FooType (FooTypeCode)
);
CREATE TABLE BarType -- Look-up table.
(
BarTypeCode CHAR(1) NOT NULL,
Description CHAR(90) NOT NULL,
CONSTRAINT PK_BarType PRIMARY KEY (BarTypeCode),
CONSTRAINT AK_BarType_Description UNIQUE (Description)
);
CREATE TABLE Bar -- Subtype of ‘Foo’.
(
BarId INT NOT NULL, -- PK and FK.
BarTypeCode CHAR(1) NOT NULL, -- Discriminator column.
E INT NOT NULL, -- Column that applies to ‘A’ and ‘B’.
CONSTRAINT PK_Bar PRIMARY KEY (BarId),
CONSTRAINT FK_from_Bar_to_Foo FOREIGN KEY (BarId)
REFERENCES Foo (FooId),
CONSTRAINT FK_from_Bar_to_BarType FOREIGN KEY (BarTypeCode)
REFERENCES BarType (BarTypeCode)
);
CREATE TABLE A -- Subtype of ‘Bar’.
(
AId INT NOT NULL, -- PK and FK.
X INT NOT NULL, -- Particular column.
CONSTRAINT PK_A PRIMARY KEY (AId),
CONSTRAINT FK_from_A_to_Bar FOREIGN KEY (AId)
REFERENCES Bar (BarId)
);
CREATE TABLE B -- (1) Subtype of ‘Bar’ and (2) supertype of ‘A’ and ‘B’.
(
BId INT NOT NULL, -- PK and FK.
Y INT NOT NULL, -- Particular column.
CONSTRAINT PK_B PRIMARY KEY (BId),
CONSTRAINT FK_from_B_to_Bar FOREIGN KEY (BId)
REFERENCES Bar (BarId)
);
CREATE TABLE C -- Subtype of ‘Foo’.
(
CId INT NOT NULL, -- PK and FK.
Z INT NOT NULL, -- Particular column.
CONSTRAINT PK_C PRIMARY KEY (CId),
CONSTRAINT FK_from_C_to_Foo FOREIGN KEY (FooId)
REFERENCES Foo (FooId)
);
この構造を使用すると、ベーステーブル(またはリレーション)にNULLマークが格納されることを回避できます。これにより、データベースがあいまいになります。
整合性、一貫性、およびその他の考慮事項
データベースを実装したら、(a)各排他的スーパータイプ行が対応するサブタイプの対応物によって常に補完され、(b)そのようなサブタイプ行がスーパータイプ弁別子列に含まれる値と互換性があることを保証する必要があります。したがって、TRANSACTIONS
データベースでこれらの条件が満たされていることを確認するために、ACIDを使用すると非常に便利です。
データベースの論理的な健全性、自己表現性、および正確性を放棄するべきではありません。これらは、データベースをより強固にする側面です。
以前に投稿された2つの回答には、データベースとそのアプリケーションプログラムを設計、作成、管理する際に考慮に値する適切なポイントが既に含まれています。
VIEW定義によるデータの取得
必要なJOIN句を毎回書き込むなどせずに手元のデータを取得できるように、異なるスーパータイプサブタイプグループの列を結合するビューを設定できます。このようにして、目的のVIEW(派生したリレーションまたはテーブル)から簡単に直接SELECTできます。
ご覧のとおり、「テッド」コッドは間違いなく天才でした。彼が遺したツールは非常に強力でエレガントであり、そしてもちろん、互いにうまく統合されています。
関連資料
スーパータイプとサブタイプの関係を含む大規模なデータベースを分析する場合、次のスタックオーバーフローの質問に対して@PerformanceDBAによって提案された並外れた答えを見つけることができます。
注意
1. 情報モデリングの統合定義(IDEF1X)は、1993年12月に米国国立標準技術研究所(NIST)によって標準として確立された、非常に推奨されるデータモデリング手法です。(a) EF Codd博士が執筆した初期の理論資料にしっかりと基づいています。上の(b)は、エンティティリレーションシップによって開発されたデータのビュー、ドクター・PP・チェン。また、(c) Robert G. Brownによって作成された論理データベース設計手法についても。IDEF1Xが1次論理によって形式化されたことは注目に値します。