2011-11-03 98 views
1

我在如何設計一個表,必須有一個主鍵是兩個互斥表的外鍵的問題。主鍵是兩個不同的互斥表的外鍵

+----------------+   +-----------------+ 
|  PARTY |   + PERSON   + 
+----------------+   +-----------------+ 
| Unique ID (PK) | -|------O|-| Unique ID (FK) | 
| Party Type  |   | some details | 
|    |   +-----------------+ 
|    |    
|    |   +-----------------+ 
|    |   | BUSINESS  | 
|    |   +-----------------+ 
|    |   | Scheme Code (PK)| 
|    | -|------O|<| Serial No (PK) | 
|    |   | Unique ID (FK) | 
|    |   | some details | 
+----------------+   +-----------------+ 

+-----------+     +-----------------+ 
| PERSON | -|-----------O|<| BANK ACCOUNT | 
+-----------+     +-----------------+   
           | Account No (PK) | 
+-----------+     | Unique ID (FK) |   
| BUSINESS | -|-----------O|<| Scheme Code (FK)| 
+-----------+     | Serial No (FK) |   
           | some details | 
           +-----------------+ 
  1. 有4個實體。一方可以是個人或企業(但不能在同一時間)。一個人可以擁有一個或多個銀行賬戶,一個企業也可以擁有一個或多個銀行賬戶。

  2. 對於一個人,只能分配一個唯一ID。

  3. 對於一個企業,它可以共享相同的唯一方ID給它具有(計劃編號,序列號,和唯一ID)的獨特組合

  4. 黨的主鍵是唯一的ID「

  5. PERSON的主鍵是唯一的ID「

  6. 企業的主鍵是唯一的ID」, '方案代號' 和 '序列號'

  7. 銀行帳戶是p& rimary密鑰是PERSON和BUSINESS的所有密鑰的組合,唯一的公共外鍵是'唯一ID','Scheme Code'/'序列號'是僅限於BUSINESS的外部密鑰。

我認爲這個問題是在銀行帳戶實體。如果PARTY是商業用戶,所有主/外密鑰都被填充(唯一ID,方案代碼,序列號),則不存在任何問題。但是,如果PARTY是PERSON,則只會填充唯一ID並且其他兩個鍵將具有NULL值。我認爲不允許使用NULL主鍵。

回答

0

只要您確保PARTY與BUSINESS/PERSON是1:1,使BANK_ACCOUNT參考PARTY而不是BUSINESS或PERSON即可。

CREATE TABLE PARTY (
party_id INT PRIMARY KEY) 

CREATE TABLE PERSON (
    person_id INT PRIMARY KEY, 
    party_id INT FOREIGN KEY REFERENCES PARTY(party_id), 
    ...,) 

CREATE TABLE BUSINESS (
    business_id INT PRIMARY KEY, 
    party_id INT FOREIGN KEY REFERENCES PARTY(party_id), 
    scheme_code <TYPE>, 
    serial_no <TYPE>, 
    ...,) 

CREATE TABLE BANK_ACCOUNT (
    account_no INT PRIMARY KEY, 
    party_id INT FOREIGN KEY REFERENCES PARTY(party_id) 
    ...,) 

要實施業務規則#1,其中一方可以是企業或個人,但不能兩者都:你需要在企業或個人的PARTY.party_id檢查觸發/程序來實現。

對於規則2,PARTY與PERSON嚴格爲1:1,在(PERSON.person_id,PERSON.party_id)上創建複合/多列主鍵或唯一索引。 see here

對於規則#3,與規則#2相同的解決方案。如果您可以在(BUSINESS.party_id,BUSINESS.scheme_code,BUSINESS.serial_no)上擁有複合主鍵,則可以省略BUSINESS.business_id。

如果你能做到上述所有的規則,規則#7就變得無關緊要。您不需要在BANK_ACCOUNT中爲scheme_code/serial_no設置列。只需創建一個視圖並使用PARTY.party_id通過連接查找這些值。

+0

嗨Simofuri,謝謝你的回答。我的問題是,當BANK_ACCOUNT for BUSINESS將共享相同的account_no,但使用不同的scheme_code和serial_no。 PARTY是與商業的一對多關係。只要與scheme_code和serial_no的組合是唯一的,那麼BUSINESS就可以擁有相同的party_id。 –

+0

例如,scheme_code'1'下的BUSINESS'A'將與scheme_code'2'下的BUSINESS'A'共享相同的account_no'abc',但scheme_code'3'下的BUSINESS'A'將擁有不同的account_no'efg'。如果我們僅將BANK_ACCOUNT中的party_id作爲FOREIGN KEY引用PARTY,那麼我們如何確定BUSINESS_A'對於scheme_code'1'/'2'具有account_no'abc'並且對於scheme_code'3'具有account_no'def' ? –

相關問題