これを特定の目的に適合させることなく、スーパータイプ-サブタイプモデルは「逆」になります。
したがって、DDLは次のようになります
CREATE TABLE Feed (
FeedID integer IDENTITY(1,1) not null
, FeedType char(1) not null
-- Common_Columns_Here
, Common_Column varchar(20)
);
ALTER TABLE Feed ADD CONSTRAINT pk_Feed PRIMARY KEY (FeedID) ;
CREATE TABLE Feed_A (
FeedID integer not null
-- A_Specific_Columns_Here
, A_Specific_Column varchar(20)
);
ALTER TABLE Feed_A ADD
CONSTRAINT pk_Feed_A PRIMARY KEY (FeedID)
, CONSTRAINT fk1_Feed_A FOREIGN KEY (FeedID) REFERENCES Feed(FeedID) ;
CREATE TABLE Feed_B (
FeedID integer not null
-- B_Specific_Columns_Here
, B_Specific_Column varchar(20)
);
ALTER TABLE Feed_B ADD
CONSTRAINT pk_Feed_B PRIMARY KEY (FeedID)
, CONSTRAINT fk1_Feed_B FOREIGN KEY (FeedID) REFERENCES Feed(FeedID) ;
CREATE TABLE Feed_C (
FeedID integer not null
-- C_Specific_Columns_Here
, C_Specific_Column varchar(20)
);
ALTER TABLE Feed_C ADD
CONSTRAINT pk_Feed_C PRIMARY KEY (FeedID)
, CONSTRAINT fk1_Feed_C FOREIGN KEY (FeedID) REFERENCES Feed(FeedID) ;
さて、この構造から読み取るために、まずビューを作成します
create view vFeed as
select
f.FeedID
, FeedType
, Common_Column
, A_Specific_Column
, B_Specific_Column
, C_Specific_Column
from Feed as f
left join Feed_A as a on (a.FeedID = f.FeedID and f.FeedType = 'A')
left join Feed_B as b on (b.FeedID = f.FeedID and f.FeedType = 'B')
left join Feed_C as c on (c.FeedID = f.FeedID and f.FeedType = 'C')
;
フィード A からのものであることがわかっているデータを選択したい場合に何が起こるか見てください。このクエリでは、 (および共通の列)FeedType
に属する列名のみが指定されていることに注意してください。Feed_A
select
FeedID
, Common_Column
, A_Specific_Column
from vFeed;
実行計画にはFeed
とFeed_A
テーブルのみが表示され、クエリ オプティマイザーはテーブル_B
と を除外したことに注意してください_C
。その2つに触れる必要はありません。
つまり、クエリで特定の列のみを使用するだけで特定のフィード データを要求し、オプティマイザーに他のすべてを整理させることができCASE ... WHEN ..
ます。例のアクロバットは必要ありません。