为了表现而违反规范化规则是可以接受的吗?
it is acceptable to violate a rule of normalization in favor of performance?
我有一个数据库 table 'product' 与 table 'discount' 相关。
折扣 table 又与 'brand' 和 'category' 有关。
我需要知道每个产品的 'calculatedPrice' 然后对它们进行排序(大约 30.000 种产品)。
但是,这样查询就太慢了。
acceptable 违反规范化的第 3 条规则,将 'calculatedPrice' 添加为 db 中的列?
该列将每 5 分钟左右通过查询 运行 计算一次...
我没有看到任何其他解决方案。
我认为这取决于您的情况:例如,我有一个 table 曾经包含生成发票的信息,例如价格,还有发票发出时的增值税值.
增值税值会随着时间的推移而变化,但它不会影响以前发出的发票,因此避免问题的唯一方法是存储值本身而不是对 "constant values" table 的引用。实际上,这会在 table 内产生信息冗余,并可能在数据库内产生 "inconsistencies"。
也就是说,我会非常仔细地考虑您选择添加一列背后的原因(请注意,这些只是为了让您思考,而不是指责任何地方:)):
- 您确定 table 的几个连接会影响性能吗?
- 如果是这样,您确定问题不在您设计的其他地方吗?
- 您的所有产品是否始终需要
calculatedPrice
的值,或者您能否减少行数,只计算您实际需要的产品的值?
如果您对以上所有问题的回答都是 "Yes",请转到额外的栏目。
P.S.:在任何情况下,我都会避免 "a query run once every 5 min or so" 之类的事情:这会使您的系统出现同步问题和并发问题.如果折扣已更改,但您的 "update query" 尚未 运行,会发生什么情况?那么您的程序会检索旧值吗?
我有一个数据库 table 'product' 与 table 'discount' 相关。 折扣 table 又与 'brand' 和 'category' 有关。 我需要知道每个产品的 'calculatedPrice' 然后对它们进行排序(大约 30.000 种产品)。 但是,这样查询就太慢了。 acceptable 违反规范化的第 3 条规则,将 'calculatedPrice' 添加为 db 中的列? 该列将每 5 分钟左右通过查询 运行 计算一次... 我没有看到任何其他解决方案。
我认为这取决于您的情况:例如,我有一个 table 曾经包含生成发票的信息,例如价格,还有发票发出时的增值税值.
增值税值会随着时间的推移而变化,但它不会影响以前发出的发票,因此避免问题的唯一方法是存储值本身而不是对 "constant values" table 的引用。实际上,这会在 table 内产生信息冗余,并可能在数据库内产生 "inconsistencies"。
也就是说,我会非常仔细地考虑您选择添加一列背后的原因(请注意,这些只是为了让您思考,而不是指责任何地方:)):
- 您确定 table 的几个连接会影响性能吗?
- 如果是这样,您确定问题不在您设计的其他地方吗?
- 您的所有产品是否始终需要
calculatedPrice
的值,或者您能否减少行数,只计算您实际需要的产品的值?
如果您对以上所有问题的回答都是 "Yes",请转到额外的栏目。
P.S.:在任何情况下,我都会避免 "a query run once every 5 min or so" 之类的事情:这会使您的系统出现同步问题和并发问题.如果折扣已更改,但您的 "update query" 尚未 运行,会发生什么情况?那么您的程序会检索旧值吗?