2009-09-30 65 views
1

我有一個包含對象的表,這樣的事情:分組記錄使用或不使用外鍵約束

PK ObjectId 
FK ObjectTypeId 
Description 
etc 

的對象需要進行分組。我得到了很多建議,所有這些都「有用」,有些我比其他人更喜歡。沒有一個是完美的,所以我正在努力解決任何特定的模型。

1 /添加一個自引用外鍵。這是乾淨的,但並不理想,因爲(a)沒有邏輯父項(它是一個組,而不是一個層次結構),(b)它可能是LINQ到SQL遍歷自引用層次結構的一個痛苦 - 需要檢查是否當前對象是一個「父」或「兒童」對象等

PK ObjectId 
FK ParentObjectId 

2 /添加父表&外鍵。這增加了限制,但Group表不包含任何有用的信息 - 它只存在提供GroupId約束的標識。

Table Object 
PK ObjectId 
FK GroupId 

Table Group 
PK GroupId 

3 /添加的GroupId沒有約束或外鍵。沒有數據完整性。理論是,當插入一個新的對象組時,每個對象都被賦予GroupId =第一個分配的ObjectId。可能是最簡單的最實用的解決方案。

例如

ObjectId GroupId 
... 
15   10 
16   16 
17   16 
... 
21   16 
22   22 

我的問題是哪些在理論和/或實踐中是最好的,以及爲什麼。或者,請告訴我一個更好的方法來做到這一點!我個人喜歡(2),因爲它是正常化的,但我被告知只有一個字段的表是不好的設計。想法和建議?

+0

是在sql server中實現的FK約束,並且您試圖跟蹤它們,還是您正在設計一個包含數據庫元數據的數據庫? –

+0

不確定你指的是哪個例子。我正在嘗試對對象進行分組,並且這些都是爲實現這一要求而提出的實現。 –

回答

1

從您提供的有限信息中很難推薦一個選項,因爲該方法取決於您對錶格的使用情況。存儲數據是一回事,但使用它是一個完全不同的問題。所有三個存儲數據都是檢索它的一種方式,但是您需要構建哪些查詢來加載它,將其聚合並搜索它?

我會實現每個方法,填充一小組數據,並嘗試編寫一些查詢來收集數據作爲您的應用程序。那麼使用桌子設計的任何問題或困難都將變得顯而易見。

您應該始終設計您的表格,以便數據檢索快速而簡單。你不應該爲了獲取數據而與桌子爭鬥。如果你發現自己與桌子爭鬥以獲取數據,那麼你設計得很差。你的桌子結構應該讓你的生活更輕鬆。

2

對於選項二,您可以隨時爲多個分組級別添加其他字段,用於描述,顯示順序和GroupParentID。另外,您可以在這些分組結構上實施安全性。

在我們的應用程序中,我們使用該結構。

+0

非常真實,但現在我假設我不需要任何這些。 –