我的项目如下所示;这只是一个总结当然。但我正在使用“细节”表中显示的方法来表示“继承”的类型,可以这么说 - 因为“项目”和“可下载”将是相同的,除了每个都有一些额外的字段相关只对他们。
我的问题在于这种设计模式。这种事情在我们的项目中出现很多次 - 是否有更智能的方式来处理它?我基本上需要尽可能地规范化表格。我对数据库非常陌生,所以这对我来说非常困惑。
共有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)
答案 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
进行了一些博客