我的预订系统中有两个表(公司和人员),(这些是我拥有的客户类型)。
COMPANY TABLE
-CompanyID
**-CompanyName**
-Fname
-Lname
-Street
-City
-ContactNo
人员表
-PersonID
-Fname
-Lname
-Street
-City
-ContactNo
他们唯一的区别是COMPANYNAME。
然后每笔交易可以是公司或个人......
预订表
-ReservationNo
-ClientID
如何为ClientID插入值?
答案 0 :(得分:1)
您可以在预订表中添加一个指定客户类型(公司/人)的列。 然后ClienID可以是PersonID / CompanyID。进行联接以查找clientID是否与个人或公司相对应不是一个好的设计
答案 1 :(得分:1)
您应该将“COMPANY TABLE”和“PERSONS TABLE”合并到“CLIENTS TABLE”:)
-ClientID
-Fname
-Lname
-Street
-City
-ContactNo
并使用
创建“COMPANY TABLE”-CompanyID
**-CompanyName**
-ClientID
并使用
创建“PERSONS TABLE”-PersonID
-ClientID
或强>
将“COMPANY TABLE”和“PERSONS TABLE”合并为“CLIENTS TABLE”,其中包含NULL值
-ClientID
-PersonID (can be NULL)
-CompanyID (can be NULL)
**-CompanyName** (can be NULL or empty)
-Fname
-Lname
-Street
-City
-ContactNo
如果您不需要从PersonID / CompanyID映射以向后兼容其他表,那么您应该删除PersonID / CompanyID列(以及我提到的第一个案例的整个“PERSONS TABLE”)。之后,您可以使用“CompanyName NOT IS NULL”识别您的公司行。
如果您不想合并表,请考虑“Damien_The_Unbeliever”的回答。
但我认为你一定要合并这两个“人员表”。
答案 2 :(得分:1)
如果这两种可能性永远不会改变,那么拥有一对可以为空的列(带有适当的外键)可能就足够了:
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 */
)
并酌情重复其他表格。