表格不必要的冗余

时间:2010-03-20 23:58:20

标签: database-design

我的项目如下所示;这只是一个总结当然。但我正在使用“细节”表中显示的方法来表示“继承”的类型,可以这么说 - 因为“项目”和“可下载”将是相同的,除了每个都有一些额外的字段相关只对他们。

我的问题在于这种设计模式。这种事情在我们的项目中出现很多次 - 是否有更智能的方式来处理它?我基本上需要尽可能地规范化表格。我对数据库非常陌生,所以这对我来说非常困惑。

共有5个项目。奖项,项目,购买,代币和下载。它们都非常非常相似,除了每个都有一些仅与自身相关的数据。我已经尝试使用声明字段(如枚举器'Type'字段)和可空列,但我被告知这是一个糟糕的方法。我所做的是将所有类似的东西放在一个表中,然后每个类型都有自己的表引用“base”表中的列。

关系或交汇点会出现问题。将所有这些链接回客户。每种类型大约需要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 个答案:

答案 0 :(得分: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)

每个item属性引用一个项目。要构建项目,您只需收集它拥有的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

进行了一些博客