我想在我的数据库中存储一些产品数据。起初我以为有一个product
表和product info
表但不确定我是否应该将它们全部合并到一个表中。
实施例
Coke - 355 ml
Product.Name = Coke
ProductInfo.Size = 355
ProductInfo.UnitType = ml
Coke - 1 Liter
Product.Name = Coke (would not be duplicated...just for illustration purposes)
ProductInfo.Size = 1
ProductInfo.UnitType = L
如果我这样做的话当然我不会两次复制“名字”。我的计划是,我可以非常轻松地找到同一产品的所有尺寸,因为我所要做的就是查看任何给定项目的关系的许多方面。
这是问题所在,所有数据都将由用户驱动并输入。有人可能会写“Coke a Cola”而不是“Coke”,现在这将被视为2种不同的产品,就像我去看看是否已经输入了名为“Coke a Cola”的产品一样,但它不知道要检查“可乐”也是。
这导致我不得不像部分匹配那样尝试找到它但是如果某人有一些通用品牌会发生什么会变成“可乐”并且也会匹配。
这让我觉得也许没有必要将数据分开,对我而言,似乎很有可能一切都会成为它自己的产品。
答案 0 :(得分:2)
这两种方法都有其优点。保持它们分开,你称之为“产品”的表格,我称之为“品牌”,而“ProductInfo”是您的实际“产品”表,其中包含有关该品牌实际可销售商品的信息(12盎司可以或一瓶可乐)。
或者,您可以进一步将其标准化为品牌,产品(此处为可口可乐,可能与健怡可乐或不含咖啡因的可乐相对)和UnitSize(罐装或瓶装;这些不仅适用于可口可乐经典,也适用于健怡可乐,百事可乐或胡椒博士。
如果你对这个数据进行非规范化,那么你在命名方面并没有太多重复,但你正在复制相当多的度量单位数据。问题是确保产品记录的一致品牌化是否更有用(非规范化意味着您需要一些其他方法来确保您的产品具有相同的品牌),或避免两个表之间的连接(需要付出代价)加入,但如果你可以在索引字段之间加入,它通常很小。)
答案 1 :(得分:0)
使用两个表进行Header-Detail排列的唯一令人信服的理由是Coke
具有相同的属性,无论包装如何。现在,我没有看到任何这样的属性;所以一张桌子就可以了。你可能会说,“但我可能会在未来想到这样的东西。”这可能是制作两张桌子的原因;但是(与数据库模式的多种更改不同),当您知道有需要时,可能不会太难以分成两个表。
我看到了导致几乎匹配记录的错误。我认为这不是这个表级别的考虑因素,您应该将其作为记录编辑的一部分来处理。
答案 2 :(得分:0)
执行此操作的最佳方法是将您的产品或项目表放在其自己的表中,其中包含ID,SKU编号,简短描述,活动等字段...然后您将“很多”表保留在另一个表中可以在ID上加入的项目属性;一对多的关系。并且为了解决用户输入问题,您有一个与库存选择或项目选择相关联的组合框。这样就可以强制实施数据完整性。嗯,这就是我做到的。