2个表的SQL主键

时间:2011-09-18 07:04:48

标签: sql database key

我的预订系统中有两个表(公司和人员),(这些是我拥有的客户类型)。

COMPANY TABLE

-CompanyID
**-CompanyName**
-Fname
-Lname
-Street
-City
-ContactNo

人员表

-PersonID
-Fname
-Lname
-Street
-City
-ContactNo

他们唯一的区别是COMPANYNAME。

然后每笔交易可以是公司或个人......

预订表

-ReservationNo
-ClientID

如何为ClientID插入值?

3 个答案:

答案 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 */
)

并酌情重复其他表格。