2010-03-20 86 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