如果這兩種可能性都可能永遠不會改變,那麼有一對空列的(有適當的外鍵)可能就夠了:
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 */
)
並根據需要重複其他表格。
你是什麼意思爲ClientID插入一個值? ClientID是您錯過的公司/人員表中的一個字段嗎? –