两个表的SQL主键

问题描述:

我在我的预定系统中有两个表(公司和人员)(这些是我拥有的TYPES OF CLIENT)。两个表的SQL主键

运营商表

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

个人表

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

他们唯一的区别是公司名称。

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

保留表

-ReservationNo 
-ClientID 

我如何可以插入客户端ID值?

+0

你是什么意思为ClientID插入一个值? ClientID是您错过的公司/人员表中的一个字段吗? –

您可以在指定客户类型(公司/人)的预订表中添加一列。 然后ClienID可以是PersonID/CompanyID。做一个加入寻找一个clientId是否对应于人物或公司是不是一个很好的设计

+0

感谢您的回答!你的答案和其他论坛一样,我会考虑的!谢谢! :) – TheOxblood

你应该合并“运营商表”和“个人表”,以“客户表” :)

-ClientID 
-Fname 
-Lname 
-Street 
-City 
-ContactNo 

,并创建“运营商表” 与

-CompanyID 
**-CompanyName** 
-ClientID 

,打造 “个人表” 与

-PersonID 
-ClientID 

OR

你合并“运营商表”和“个人表”,以“客户表”与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

为什么要在公司和个人表中引入更多的'ID'? “ClientID”确实足以识别它们。 –

+0

你是对的,这是令人生气的。我想到系统中的其他表已经在使用PersonID和CompanyID。我会纠正我的答案,以清理事情...... – b2ag

+0

也许我会为预订表创建另一列,以便为每项交易识别客户(公司或个人)。 – TheOxblood

如果这两种可能性都可能永远不会改变,那么有一对空列的(有适当的外键)可能就够了:

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

并根据需要重复其他表格。

+0

我感谢您的回答!谢谢! :) – TheOxblood