簡體   English   中英

2個表的SQL主鍵

[英]SQL Primary Key for 2 tables

我的預訂系統中有兩個表(“公司”和“人”),(這些是我的“客戶類型”)。

公司表

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

人桌

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

他們唯一的區別是COMPANYNAME。

然后,每筆交易可以是COMPANY或PERSON。

預訂表

-ReservationNo
-ClientID

如何為ClientID插入值?

您可以在預訂表中再添加一列,以指定客戶類型(公司/人員)。 然后,ClienID可以是PersonID / CompanyID。 進行聯接以查找clientID是對應於個人還是公司不是一個好的設計

您應該將“ COMPANY TABLE”和“ PERSONS TABLE”合並到“ CLIENTS TABLE” :)

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

並使用創建“ COMPANY TABLE”

-CompanyID
**-CompanyName**
-ClientID

並創建“ PERSONS TABLE”

-PersonID
-ClientID

要么

您將像這樣的NULL值合並“ COMPANY TABLE”和“ PERSONS TABLE”到“ CLIENTS TABLE”

-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”的答案。

但是我認為您絕對應該合並這兩個“人員表”。

如果這兩種可能性永遠不會改變,那么擁有一對可為空的列(帶有適當的外鍵)可能就足夠了:

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

並根據需要重復其他表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM