2011-09-18 78 views
1

我在我的預定系統中有兩個表(公司和人員)(這些是我擁有的TYPES OF CLIENT)。兩個表的SQL主鍵

運營商表

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

個人表

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

他們唯一的區別是公司名稱。

然後每筆交易可以是一個公司或個人..

保留表

-ReservationNo 
-ClientID 

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

+0

你是什麼意思爲ClientID插入一個值? ClientID是您錯過的公司/人員表中的一個字段嗎? –

回答

1

您可以在指定客戶類型(公司/人)的預訂表中添加一列。 然後ClienID可以是PersonID/CompanyID。做一個加入尋找一個clientId是否對應於人物或公司是不是一個很好的設計

+0

感謝您的回答!你的答案和其他論壇一樣,我會考慮的!謝謝! :) – TheOxblood

1

你應該合併「運營商表」和「個人表」,以「客戶表」 :)

-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

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

並根據需要重複其他表格。

+0

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