我在同一行上遇到过几个问题,但没有完全相同。
哪一个更好,在从MySql获取结果(通过连接几个表)或在MySql中物理地拥有另一个列时在PHP中执行一些基本计算,该列存储总数,同时插入新行然后检索它。
例如:销售的产品:
Item Price Quantity Discount
Item 1 55 100 10%
以上是销售表,价格列是从items表联合的。根据上述问题,我们可以使用PHP获取结果,执行Price X Quantity X 0.10
或者我们的表格如下所示:
Item Price Quantity Discount Amount
Item 1 55 100 10% 4950
现在哪个更好的方式做这么简单的任务?
答案 0 :(得分:2)
对所有情况都没有一揽子规则。许多因素会影响网站的性能和效率。所以没有单一的' Best'
如果你看一下像Magento这样的东西,它会做到两种方式。一方面,它具有完整的EAV结构,每个数据都被抽象出来并标准化为第n度。另一方面,出于性能原因,它还会在平面表中聚合预先计算的值。这包括折扣金额,基本价格,税额(基数和选择的货币)等。前者的情况在灵活性和稳健性方面最好,平面表在性能方面更好。
平面表显然在处理批量计算时更快,因为一切都已经解决了。但正如内核西雅图所指出的那样,它确实意味着对设置的任何更改都可能需要对每个值进行批量重新计算。对于订单历史等历史数据,您可能不想重新计算最终支付的实际金额,但在确定最佳解决方案时需要考虑必须这样做的可能性。
如果性能至关重要且计算运行成本高昂,那么您知道可能需要不时地批量刷新值,这样您就可以做出明智的决定来缓存它。
但如果它不是一个性能关键方面,或者计算成本高但不经常运行,那么将它们排除在数据库之外会更加清晰,因为它们实际上属于业务逻辑处理部分。应用程序即代码。
同样,有多种方法可以定义" best",因此它取决于具体情况。实际上,这只需要平衡需求 - 速度,清洁度,内存使用,处理器要求,磁盘空间使用,以及适应开发经理定义的任意数据结构的需求 - 您的决策需要考虑这些因素。
如果没有现实世界的问题需要解决,那么推测就是可以实现的。如果你的情况比较复杂,我很乐意看看并提出我的想法。
编辑:根据我自己的观察,Magento目录页面包含平面数据和超过200k的产品,在大约10-20秒内加载,没有启用页面缓存。当禁用平面数据并使用EAV结构时,需要几分钟。我现在不上班,所以我不能轻松获取我的分析数据,但它证明了在实际应用中没有单一的最佳解决方案。
答案 1 :(得分:2)
计算可以通过提取时的SQL查询执行,也可以在提取数据后执行。 SQL解决方案类似于
SELECT *, ((Price * Quantity) - ((Price * Quantity) * (Discount * .01))) AS Amount
FROM ...
在很多方面,这只是个人偏好,虽然当SQL开始变得非常复杂时,我觉得它很麻烦。
您可能想要避免的是将总数保存到数据库,除非它是一个永远不会改变的设定数量。如果您的总金额已保存,并且您在某个时候更改了折扣金额或数量,则可能会忘记更新总金额。如果您每次需要总数,则根据已知变量(quantity * price - discount)
进行计算,那么总数应始终准确。
答案 2 :(得分:1)
只需将计算添加到SELECT语句中即可。
样品:
SELECT
ItemID,
Price,
Quantity,
Discount
Price * Quantity * Discount AS Amount
FROM myTable
或使用视图检索所需数据,并将计算值附加为列。
这样计算出的值仅对请求有效,您不必向表中添加其他列。
答案 3 :(得分:0)
我会将预先计算的价格保留在表格之外。这样,如果您的折扣变为15%,则您不必每次都重新计算每行的值。
答案 4 :(得分:0)
我更喜欢上层表结构,我们可以通过计算来管理所有这些事情,我们不应该在DB中保留这样的计算,因为我们应该遵循RDBMS方法