2009-11-24 60 views
0

我有企業和DOMAINS表。每個企業的財產是它應該有一個主域,但它可以有多個域。我想出了這個表結構標誌列或外鍵?

+---------------------------------------+ 
| ENTERPRISES       | 
+----+--------------+-------------------+ 
| ID | Name   | Primary Domain ID | 
+----+--------------+-------------------+ 
| 1 | Enterprise A | 2     | 
| 2 | Enterprise B | 4     | 
+----+--------------+-------------------+ 

+---------------------------------------+ 
| DOMAINS        | 
+----+------------------+---------------+ 
| ID | Domain Name  | Enterprise ID | 
+----+------------------+---------------+ 
| 1 | ent-a.com  | 1    | 
| 2 | enterprise-a.com | 1    | 
| 3 | ent-b.com  | 2    | 
| 4 | enterprise-b.com | 2    | 
+----+------------------+---------------+ 

我的同事認爲這種替代結構:

+-------------------+ 
| ENTERPRISES  | 
+----+--------------+ 
| ID | Name   | 
+----+--------------+ 
| 1 | Enterprise A | 
| 2 | Enterprise B | 
+----+--------------+ 

+----------------------------------------------------+ 
| DOMAINS           | 
+----+------------------+---------------+------------+ 
| ID | Domain Name  | Enterprise ID | Is Primary | 
+----+------------------+---------------+------------+ 
| 1 | ent-a.com  | 1    | False  | 
| 2 | enterprise-a.com | 1    | True  | 
| 3 | ent-b.com  | 2    | False  | 
| 4 | enterprise-b.com | 2    | True  | 
+----+------------------+---------------+------------+ 

我的問題是,哪一個更有效/正確的嗎?

此外,在第一個示例中,我應該使用ID作爲主域列還是字符串值,因此ENTERPRISES表對DOMAINS表沒有循環依賴關係?

回答

1

圓形參考文獻都可以。通知依賴關係沒有。只要Primary Domain ID可以爲空,那麼你很好。否則,您將產生雞蛋或雞蛋的情況,如果沒有Enterprise,則無法創建Domain,但如果沒有Primary Domain ID,則無法創建Enterprise

我會選擇前者(您提出的解決方案),因爲您正在定義一對一的關係。雖然Enterprise->Domain關係是一對多關係,但Enterprise->Primary Domain關係是一對一關係。

3

兩者都是正確。但去FK。

你建議的人有較少的稀疏數據,而在第二個例子中,你可能有100個站點屬於同一家公司,所有IsPrimary設置爲False,只是一個域設置爲True

另外,在第一個場景中更容易實施一個主域,而在第二個場景中,您必須在代碼中編寫觸發器或檢查來查看是否有一個主域,主要領域在任何時候。

再次堅持FK。

0

在第一個模型中,你說企業應該有一個主域。展開一段時間,並說它將有一個主域。此時你會傾向於將該列標記爲不可空。

接下來的問題是,您將無法插入數據,因爲您創建了循環移轉。您不能插入沒有域的企業,並且無法在沒有企業的情況下插入域。

我更喜歡第一個模型,因爲它更清晰,更明確。您的模型強制要求有一個主域名,而第二個模型中沒有任何內容,所以您將被迫使用其他一些機制來強制執行此規則。