Если эти две возможности, вероятно, никогда не изменятся, то, вероятно, будет достаточно пары обнуляемых столбцов (с соответствующими внешними ключами):
CREATE TABLE Reservations (
ReservationNo int not null,
PersonID int null,
CompanyID int null,
/* Other columns */
constraint CK_Reservations_PersonOrCompany CHECK
((CompanyID is null or PersonID is null) and COALESCE(CompanyID,PersonID) is not null),
/* Other constraints */
)
Если есть вероятность, что будет больше клиентов, тогда введитетаблица клиента:
CREATE TABLE Clients (
ClientID int not null,
ClientType varchar(10) not null,
/* Common columns for all client types */
constraint PK_Clients PRIMARY KEY (ClientID),
constraint UQ_Client_TypeCheck UNIQUE (ClientID,ClientType),
constraint CK_Client_ClientTypes CHECK
(ClientType in ('PERSON','COMPANY')) --Add more types later
/* Other constraints */
)
Затем в каждой таблице типов клиентов задайте правильный тип клиента:
CREATE TABLE Persons (
ClientID int not null,
ClientType as CONVERT(varchar(10),'PERSON'),
/* Columns unique to person client types */
constraint PK_Persons PRIMARY KEY (ClientID),
constraint FK_Persons_Clients FOREIGN KEY (ClientID) references Clients,
constraint FK_Person_ClientTypeCheck FOREIGN KEY (ClientID,ClientType)
references Clients (ClientID,ClientType)
/* Other constraints */
)
И, при необходимости, повторите для других таблиц.