Klucze obce można uzależnić ... w pewnym sensie. Nie pokazujesz układu każdej tabeli, więc oto typowy projekt pokazujący twoje relacje:
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 i BrickMorters miałyby tę samą podstawową strukturę, ale z StoreType ograniczonym tylko do „O” lub „B”, stosownie do przypadku.
Teraz chcesz mieć odniesienie z innej tabeli do TransactionalStores (i poprzez nią do różnych tabel sklepu), ale ograniczone do Kiosków i BrickMorter. Jedyną różnicą byłoby ograniczenie:
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 )
);
W tej tabeli referencja FK wymusza StoreType na „K”, „O” lub „B”, ale ograniczenie pola dodatkowo ogranicza ją tylko do „K” lub „B”.
Dla ilustracji użyłem ograniczenia sprawdzającego, aby ograniczyć typy sklepów w tabeli TransactionStores. W rzeczywistości tabela wyszukiwania StoreTypes z StoreType będącym FK dla tej tabeli prawdopodobnie byłby lepszym wyborem projektowym.