外部キーは条件付きで作成できます。各テーブルのレイアウトは表示しないため、関係を示す典型的なデザインを次に示します。
create table TransactionalStores(
ID int not null auto_increment,
StoreType char not null,
..., -- other data
constraint CK_TransStoreType check( StoreType in( 'B', 'K', 'O' )),
constraint PK_TransactionalStores primary key( ID ),
constraint UQ_TransStoreTypes unique( ID, StoreType ) -- for FK references
);
create table Kiosks(
ID int not null,
StoreType char not null,
..., -- other Kiosk data
constraint CK_KioskStoreType check( StoreType = 'K' ), -- kiosks only
constraint PK_Kiosks primary key( ID, StoreType ),
constraint FK_Kiosks_TransStores foreign key( ID, StoreType )
references TransactionalStores( ID, StoreType )
);
OnlinesとBrickMortersは同じ基本構造を持ちますが、StoreTypeは必要に応じて「O」または「B」のみに制限されます。
ここで、別のテーブルからTransactionalStoresへの(およびさまざまなストアテーブルへの)参照が必要ですが、キオスクとBrickMorterに限定されます。唯一の違いは制約にあります。
create table Employees(
ID int not null,
StoreID int,
StoreType char,
..., -- other Employee data
constraint PK_Employees primary key( ID ),
constraint CK_Employees_StoreType check( coalesce( StoreType, 'X' ) <> 'O' )), -- Online not allowed
constraint FK_Employees_TransStores foreign key( StoreID, StoreType )
references TransactionalStores( ID, StoreType )
);
この表では、FK参照によりStoreTypeが強制的に「K」、「O」、または「B」のいずれかになりますが、フィールド制約によりさらに制限されて「K」または「B」のみになります。
説明のため、TransactionStoresテーブルのストアタイプを制限するためにチェック制約を使用しました。実際には、StoreTypesがそのテーブルのFKであるStoreTypesルックアップテーブルは、おそらくより良い設計選択でしょう。