SQL - 优化优先级,哪些适用?

时间:2014-05-10 16:37:35

标签: sql database

产品由一个或多个组件组成,组件具有单独的价格。

产品的成本是根据该产品中使用的组件成本计算的。

我应该在Product表中添加名为cost的列,因为它们不是动态的,或者每次购买产品时是否应该计算?

在速度,冗余和性能方面哪一个是合适的方法?

我希望情景很清楚。

5 个答案:

答案 0 :(得分:3)

除非您绝对确定成本永远不会改变,否则动态计算

答案 1 :(得分:2)

在我看来,你应该使用正常形式,除非你有证据表明这种方法存在性能问题。是的,如果您预先计算捆绑的价格,您将获得更好的性能,但现在您在数据完整性验证中增加了复杂性。这值得么?计算价格会动态地将您的响应时间降低到不可接受的水平吗?如果您只向几十个客户提供了几百种产品,那么他们就不会注意到差异。

您可能需要考虑第3个选项。如果您的数据库平台支持索引视图,则可以创建一个视图,该视图返回产品价格的计算列,这将为您提供非规范化方法的速度,而不会产生数据完整性风险。

答案 2 :(得分:2)

到目前为止,答案似乎都没有解决这个问题。价格通常是一个缓慢变化的维度。这意味着组件的相同价格在不同的时间点可能会有所不同。在提出缓慢变化的维度时,我通常会推荐Ralph Kimball的书"数据仓库工具包",无论最新版本是什么。

换句话说,EffDate表格中的价格应为EndDatePriceList。这样,您就可以知道任何时间点的价格。

除了在任何给定时间点组件的价格之外,您还应该跟踪产品中组件的价格。您可以使用ProductComponent关联/联结表来处理此问题。这将有如下列:

  • 产品编号
  • COMPONENTID
  • 货币(如适用)
  • 折扣(由Jonathan指出)
  • 纳税
  • 全价
  • 净价

全价将来自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美元(但必须先与您的客户达成一致)。