2011-03-17 109 views
0

假設我們有表A,B和C,然後我們希望表Z包含第TYPE列,它告訴我們Z中的記錄與A,B和C的哪個表相關聯。單獨的ID字段的單獨列?

爲了使用索引,爲列表A_IDB_IDC_ID中的每個表分配一個單獨的列會更好嗎?

或者是有什麼理由使用通用列TYPE_ID可能會更好的性能?

+0

我不擔心表現,但正確性。你打算如何加入表格 - 用動態SQL查找表格名稱? SQL中不支持您正在嘗試執行的操作。我會盡量避免整個情況。但是,如果你必須,Z應該有外部引用,唯一的原因就是z是持有的 - 引用外鍵。 – 2011-03-17 22:54:52

回答

1

使用type_id然後使用fk_id不會很好,因爲索引的選擇性是33%,這太高而無法使用。你總是在fk_id上索引(而不是鏈接到A,B,C) - 這可能需要在3個值之間打斷(如果id被所有3種類型使用)。存儲方面,索引從不存儲空值,所以存儲在索引中的項目的絕對數量,單個(fk_id)還是多個(a_id,b_id,c_id)將是相似的。

如果您是從確切的fk_id(來自A,B,C)開始,那麼按照該順序在(fk_id,type_id)上使用唯一索引可以快速識別所需的記錄。

這似乎是爲了簡單和簡潔,兩列在這裏比3好。

1

這有時是架構代碼的氣味。

如果您正在考慮將此列作爲Z中的單個列,是否意味着A,B,C中只有一個可以適用於Z?

在我決定之前,我真的說我必須更多地瞭解實體和使用模式。訪問來自已知的A,B或C,還是從Z端驅動的補充信息?如果它是從Z端驅動的,你是否想要獲得所有的A,B和C列,然後從應用程序中選擇性地使用它們,或者只需要將Zs與As或Zs一起使用,即通常知道子類型?此外,如果A,B和C有足夠的列,則可以從Zs行中分離出來(如果它們每個都是1-1)(即,您可以將列設置爲Z並且僅爲NULL)

只是爲了完整性,這可能給你更多的引用完整性(因爲與單個列,你不能是一個FK爲三個表)是有表Z_A,Z_B,Z_C:

隨着模式:

Z_A: 
Z_ID REFERENCES (Z.ID) 
A_ID REFERENCES (A.ID) 

Z_B: 
Z_ID REFERENCES (Z.ID) 
B_ID REFERENCES (B.ID) 

Z_C: 
Z_ID REFERENCES (Z.ID) 
C_ID REFERENCES (C.ID) 

所有的ID在每個表中都是唯一的,這樣就可以很好地限制一切,除非沒有任何聲明來阻止Z在多個表中沒有觸發器(您不能對SQL Server中的UNION ALL的索引視圖的唯一約束)。

雖然它似乎增加了表的數量,但它們通常可以包裝到視圖中。

+0

適用於架構代碼異味。儘管可能只是模式氣味足夠好 – 2011-03-17 22:24:12

+0

「如果您正在考慮將其作爲Z中的單個列,是否意味着A,B,C中只有一個可以適用於Z?「每個a,b,c記錄都可以有0個關聯的z記錄 – erikvold 2011-03-19 18:59:20

+0

@Erik Void - 現在我更加困惑了,這聽起來像一排也沒有關聯的Z行,所以從Z到A,B,C)沒什麼意義,我需要更多地瞭解表格的實際含義 - 正在模擬什麼? – 2011-03-19 22:08:53