产品由一个或多个组件组成,组件具有单独的价格。
产品的成本是根据该产品中使用的组件成本计算的。
我应该在Product表中添加名为cost的列,因为它们不是动态的,或者每次购买产品时是否应该计算?
在速度,冗余和性能方面哪一个是合适的方法?
我希望情景很清楚。
答案 0 :(得分:3)
除非您绝对确定成本永远不会改变,否则动态计算
答案 1 :(得分:2)
在我看来,你应该使用正常形式,除非你有证据表明这种方法存在性能问题。是的,如果您预先计算捆绑的价格,您将获得更好的性能,但现在您在数据完整性验证中增加了复杂性。这值得么?计算价格会动态地将您的响应时间降低到不可接受的水平吗?如果您只向几十个客户提供了几百种产品,那么他们就不会注意到差异。
您可能需要考虑第3个选项。如果您的数据库平台支持索引视图,则可以创建一个视图,该视图返回产品价格的计算列,这将为您提供非规范化方法的速度,而不会产生数据完整性风险。
答案 2 :(得分:2)
到目前为止,答案似乎都没有解决这个问题。价格通常是一个缓慢变化的维度。这意味着组件的相同价格在不同的时间点可能会有所不同。在提出缓慢变化的维度时,我通常会推荐Ralph Kimball的书"数据仓库工具包",无论最新版本是什么。
换句话说,EffDate
表格中的价格应为EndDate
和PriceList
。这样,您就可以知道任何时间点的价格。
除了在任何给定时间点组件的价格之外,您还应该跟踪产品中组件的价格。您可以使用ProductComponent
关联/联结表来处理此问题。这将有如下列:
全价将来自PriceList
表。我知道"全价"现在是ProductComponent
表的冗余,但令人惊讶的是这种冗余有多大用处。
然后,您只需使用此表将任何给定时间内任何给定产品的成本汇总在一起。您可以使用ProductComponent
表格轻松计算任何产品的价格。
答案 3 :(得分:1)
你应该有一个PriceList
表,它有ProductId和价格。
答案 4 :(得分:0)
我通常以相反的方式做到这一点: 每件具有自己价格的东西都是库存单位(或sku)。 每个sku都是一个产品。 然后,您可以将内容分组到'产品组','捆绑'或者'包裹'。 对于定价,它很难:我通常使用额外的数据库表,例如:
id | bundle_id | sku_id | discount
1 1 1 0
2 1 2 50%
3 2 3 0
4 3 4 10%
然后计算捆绑价格'动态(这允许捆绑价格小于组件的总和,甚至大于具有-ve折扣的组件的总和)
这也意味着随着sku价格的变化,捆绑价格会自动上下波动。 您可以进一步自动将价格四舍五入到最接近的0.99美元(但必须先与您的客户达成一致)。