Yabancı anahtarlar olabilir koşullu ... çeşit yapılabilir. Her tablonun düzenini göstermezsiniz, bu yüzden ilişkilerinizi gösteren tipik bir tasarım:
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 ve BrickMorters aynı temel yapıya sahip olacaktı, ancak StoreType uygun şekilde sadece 'O' veya 'B' ile sınırlıydı.
Şimdi başka bir tablodan TransactionalStores'a (ve çeşitli mağaza tablolarına) bir referans istiyorsunuz ancak Kiosks ve BrickMorter ile sınırlısınız. Tek fark kısıtlama olacaktır:
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 )
);
Bu tabloda, FK başvurusu StoreType'ı 'K', 'O' veya 'B' olmaya zorlar, ancak alan kısıtlaması bunu yalnızca 'K' veya 'B' ile sınırlar.
Örnek olarak, TransactionStores tablosundaki mağaza türlerini sınırlamak için bir kontrol kısıtlaması kullandım. Gerçek hayatta, StoreType'ın bu tablo için bir FK olduğu bir StoreTypes arama tablosu muhtemelen daha iyi bir tasarım seçimi olacaktır.