我正在建立一个简单的电子商务网站与订单确认和创建。我应该计算订单总值,并将其插入数据库,还是应该在每次读取订单或对订单执行操作时计算?
wqsoz72f1#
数据库领域的最佳实践意味着规范化的数据,而存储可计算的值则违反了这一点。通常,你应该“永远不要”存储你可以计算的东西,除非你“绝对”确定两个值之间不会有差异。例如,如果您的订单包含两个100美元的项目,但订单设置为150美元,您认为应该发生什么?有时,存储可以计算的值是有理由的(通常与性能相关),但性能增益必须是“显著的”和“必要的”,并且消除或计划不一致的可能性。您可以使用触发器或物化视图等东西来消除这种可能性,并且可以通过更改业务逻辑来检测和修复问题,或者通过其他方式来计划它们。但通常,性能的提高并不值得为减轻潜在问题而付出额外的努力。毕竟,你看到有多少订单上有 * 数百万 * 个单独的项目?当然,除了美国国防部,航空母舰的材料清单列出了用于建造它的每一个螺母和螺栓:-)
ewm0tg9j2#
在你的事务数据库(即主要的,活的),你不应该存储计算值。把一打行加起来算不了什么。但是,在您的分析数据库(又名商业智能数据库,数据仓库)中,您肯定应该存储计算出的总数。
ajsxfq5m3#
最好不要存储可从表中现有列派生的值。有很多理由不这样做,如1.如果要更新任何基础列,则还必须更新派生列。1.表的大小将增加等等等等
3条答案
按热度按时间wqsoz72f1#
数据库领域的最佳实践意味着规范化的数据,而存储可计算的值则违反了这一点。
通常,你应该“永远不要”存储你可以计算的东西,除非你“绝对”确定两个值之间不会有差异。
例如,如果您的订单包含两个100美元的项目,但订单设置为150美元,您认为应该发生什么?
有时,存储可以计算的值是有理由的(通常与性能相关),但性能增益必须是“显著的”和“必要的”,并且消除或计划不一致的可能性。
您可以使用触发器或物化视图等东西来消除这种可能性,并且可以通过更改业务逻辑来检测和修复问题,或者通过其他方式来计划它们。
但通常,性能的提高并不值得为减轻潜在问题而付出额外的努力。毕竟,你看到有多少订单上有 * 数百万 * 个单独的项目?
当然,除了美国国防部,航空母舰的材料清单列出了用于建造它的每一个螺母和螺栓:-)
ewm0tg9j2#
在你的事务数据库(即主要的,活的),你不应该存储计算值。把一打行加起来算不了什么。
但是,在您的分析数据库(又名商业智能数据库,数据仓库)中,您肯定应该存储计算出的总数。
ajsxfq5m3#
最好不要存储可从表中现有列派生的值。
有很多理由不这样做,如
1.如果要更新任何基础列,则还必须更新派生列。
1.表的大小将增加
等等等等