【问题标题】:Normalize a table with tightly coupled data规范化具有紧密耦合数据的表
【发布时间】:2017-01-17 21:34:09
【问题描述】:

我目前有一张表,里面存放着用来制作物品的材料

Item (material1, material2, material3)

最近添加了另一种材料。但是,我想规范化此表,以便将来添加新材料不需要将新列添加到数据库中。我将材料提取到下面的连接表中

ItemJuncMaterial (id, itemId, materialid)

但是,问题在于材料的顺序很重要。所以这个联结表不允许我根据材料运行这个查询来获取项目

select itemid from ItemJunMaterial where materialid in (1,2,3)

这可以返回使用 2,3,1 的物品,甚至可以使用两种材料 1,2。有没有更好的方法来拆分此表以对其进行规范化并使其更具动态性?

【问题讨论】:

    标签: sql sql-server-2012 normalization


    【解决方案1】:

    您应该考虑“物料清单”(BOM) 模式(请参阅herehere)。 BOM 的交集可以包含有关组成的额外信息,例如每个组件的数量。您可以轻松地将组件的顺序或优先级包含在该交集中。

    【讨论】:

    • 我对序列的唯一关心是在寻找你必须写select Itemid from ItemJunMaterial where matieralID = 1 and sequence =1 and materialid =2 and sequence = 2 etc..的项目时,但如果这是要走的路,那么这就是我必须做的
    • @bme2010 是的,您需要在选择单个记录时使用主键。如果该主键是复合键,那么您的where 子句中需要and。你会那么做吗?您多久会选择一次完整列表?在您的 0NF 结构中,Item (material1, material2, material3) 只需一次选择即可获得整个列表。在您的半规范化结构中,您还可以使用 where materialid in (1,2,3) 获取整个列表。
    猜你喜欢
    • 2011-05-24
    • 2017-05-09
    • 2012-11-12
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多