我的物品列出如下;当然这只是一个总结。但我正在使用“详细信息”表中显示的方法来表示一种“继承”类型,可以这么说 - 因为“项目”和“可下载”将是相同的,除了每个都有一些相关的附加字段只对他们而言。
我的问题是在这个设计模式中。这种事情在我们的项目中出现了很多很多次——有没有更智能的方式来处理它?我基本上需要尽可能地规范化表格。我对数据库非常陌生,所以这对我来说非常令人困惑。
有 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)
对于关系数据库来说,这种继承总是有点棘手。您所拥有的只是一种方法,而且是解决问题的最传统方法。您最终会进行大量的表格交叉操作,但这可能没问题。
另一种方法是采用一些非规范化并将表折叠成一个表。包含一个表示项目类型的类型字段,然后将该表中所有字段的并集合并起来。所以你会有一张像这样的桌子
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 即可。如果您想查找名称为“bill”的所有项目,那么您可以这样做
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 http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)