2010-03-20 79 views
2

我的項目列表如下;這只是當然的一個總結。但是,我使用的是「細節」表中顯示的一種方法來表示一種「繼承」,可以這麼說 - 因爲「項目」和「可下載」將會是相同的,除了每一個都會有一些附加字段相關只對他們。不必要的冗餘表格

我的問題是在這種設計模式。這種事情在我們的項目中出現過很多次 - 是否有更聰明的方式來處理它?我基本上需要儘可能標準化表格。我對數據庫非常陌生,所以這對我來說都非常混亂。

共有5項。獎項,項目,購買,標記和下載。它們都非常非常相似,除了每個數據都有一些與自身相關的數據。我試圖使用一個聲明字段(如枚舉類型'字段)與可爲空的列,但我被告知這是一個不好的方法。我所做的是將所有相似的東西放在一個表中,然後每個類型都有自己的表,引用'基'表中的一列。

問題發生在關係或連接處。將所有這些鏈接返回給客戶。每種類型都需要大約2個額外的表來正確連接所有的數據 - 因此,我的數據庫變得非常非常大。這種行爲有更聰明的做法嗎?

Item 
ID  | GUID 
Name  | varchar(64) 

Product 
ID  | GUID 
Name  | varchar(64) 
Store  | GUID [ FK ] 
Details | GUID [FK] 

Downloadable 
ID  | GUID 
Name  | varchar(64) 
Url | nvarchar(2048) 
Details | GUID [FK] 

Details 
ID   | GUID 
Price   | decimal 
Description | text 

Peripherals [ JUNCTION ] 
ID  | GUID 
Detail  | GUID [FK] 

Store 

ID  | GUID 
Addresses | GUID 

Addresses 
ID  | GUID 
Name  | nvarchar(64) 
State | int [FK] 
ZipCode | int 
Address | nvarchar(64) 


State 
ID  | int 
Name  | varchar(32) 

回答

1

這種繼承對於關係型數據庫來說總是有點小把戲。你有什麼是一種方法,它是解決這個問題的最傳統的方法。你最終做了很多表的交叉,但這可能會很好。

另一種方法是採用一些非規範化並將這些表合併到一個表中。包含一個表示項目類型的類型字段,然後在該表格中包含所有字段的聯合。所以你會有一個像

ID | GUID 
Type | GUID [FK] 
Name  | nvarchar(64) 
State | int [FK] 
ZipCode | int 
Address | nvarchar(64) 
Name  | varchar(64) 
Url | nvarchar(2048) 
Store  | GUID [ FK ] 
Details | GUID [FK] 
... 

這意味着你有一堆在你的表中的空字段。

你也可以採取更加分散的方式,構建像

Item: 
ID | GUID 

ItemPropertyType: 
ID | GUID 
Name | nvarchar(50) 

ItemProperty: 
ID | GUID 
ItemID | GUID [FK] 
ItemPropertyTypeID | GUID 
charValue | varchar(64) 

每一項屬性引用一個項目在表中。要構建一個項目,您只需收集它擁有的ItemProperties。如果你想找到的所有項目,其中名稱是「賬單」,那麼你可以做

select ItemID from ItemProperties ip, ItemPropertyTypes ipn where ipn.ID = ip.ItemPropertyTypeID and ipt.Name='Name' and ip.charValue='bill' 

傑夫居然在博客一點關於這個話題http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html

+2

你的第一種方法聯繫業務含義爲行(類型#3 = 「下載」)。這通常不是一個好的做法,因爲該模型不能完全反映設計。你的第二種方法是基於元數據的,如果這是需要的,那很好,但是它往往會因系統中的大量數據而表現不佳,並且需要一些數據維護(孤兒行等)。這種方法也被稱爲實體屬性值或EAV。 – 2010-03-21 00:29:52

+0

對不起,讀回來聽起來比我想要的更傳誦和迂腐。 :) – 2010-03-21 00:44:05