2012-12-12 120 views
2

我想確保這是處理特定場景的最佳方法。數據庫映射 - 多個外鍵

比方說,我有三個主表我會保持它們的通用性。它們都有主鍵,它們都是獨立的表,沒有任何引用。

表1

PK 
VarChar Data 

表2

PK 
VarChar Data 

表3

PK 
VarChar Data 

這裏是場景中,我瓦特使用戶能夠評論上述每個表格上的特定行。但我不想創建一堆評論表。所以截至目前,我的處理就像這樣..

有一個評論表有三個外鍵列,每個列都引用上面的主表。有一個約束條件是隻能對這些列中的一列進行評估。

CommentTable

PK 
FK to Table1 
FK to Table2 
FK to Table3 
VarChar Comment 
FK to Users 

我的問題:這是處理問題的最佳方式是什麼?是否存在通用外鍵?或者我應該爲每個主表分別創建一個註釋表,即使數據結構完全一樣嗎?或者每個映射表都是更好的解決方案?

+2

我會去用這種方法 - OK,你有三個FK列,只有其中之一是將有一個價值。但是通過這種方法,您**可以**通過設置適當的外鍵約束來強制引用完整性。如果你有一個* generic * FK(例如一個FK *類型的列),那麼你就無法做到這一點 - 並且能夠強制引用完整性在數據庫設計範圍內比「保存」一列更重要或兩個.... –

回答

2

感謝所有的幫助人員,我能夠在我的同事的幫助下制定解決方案。我決定只使用一個,而不是多個映射表。

該映射表包含一組註釋,所以它沒有主鍵。並且每個組行都鏈接回評論。所以你可以有多個相同的組ID。一對多就是關係。

Database Group Table Concept

2

我的問題:這是處理這種情況的最好方法嗎?

帶有CHECK的多個FK只允許其中一個非NULL是一種合理的方法,尤其是對於像這種情況下的相對較少的表。

另一種方法是從共同的「父」表中「繼承」Table 1, 2 and 3,然後將註釋連接到父項。

查看herehere瞭解更多信息。

是否存在通用外鍵?

如果你的意思是一個FK可以從表格跳轉到表格,那麼沒有。

假設所有3個FKS是同一類型,理論上可以通過保持外國鍵值和引用的表名,然後執行它通過觸發器實現一些類似的,但聲明的約束應該是首選在這一點上,即使以稍微多一點的存儲空間的價格。

如果您 DBMS完全支持「虛擬」或「計算」欄,那麼你可以做一些類似上述的東西,但不是有一個觸發,基於FK值和表名3個計算列。這些計算列中只有一個在任何給定時間都是非空值,您可以像使用物理列那樣爲它們使用「正常」FK。

但是,當有許多「可連接」的表和你的DBMS在存儲NULL時不節儉時,所有這些都是有意義的。當只有3個或者甚至比這個多的時候,獲得的數據很少,但是您的DBMS僅在每個NULL字段上花費一個位。

或者我應該爲每個主表有一個單獨的註釋表,即使數據結構完全一樣嗎?

「數據結構」不是唯一重要的東西。 如果您碰巧有不同的約束約束(例如FK適用於其中一個,但不適用於其他),即使列是相同的,這將保證單獨的表。

但是,我猜這不是這種情況。

或者每個人的映射表是一個更好的解決方案?

我不完全相信你所說的「映射表」的意思,但你可以做這樣的事情:

enter image description here

不幸的是,這將允許一個單一的評論將被連接到多於一個表格(或者根本沒有表格),並且它本身就是你已經擁有的複雜功能。

說了這麼多,你的原始解決方案可能沒問題。


或者你願意將其存儲爲字符串,並與轉換,您應該不願意乾的活。

在實踐中,這不會真的是一個名稱(如在字符串) - 這將是一個整數與公知的預定值中的一個(或枚舉如果DBMS支持的話)識別所述表。