2012-03-24 51 views
1

我在同一行遇到过几个问题,但没有完全一样的。在php或mysql中计算数据

哪一个更好,在从MySql获得结果(通过加入几个表)或在物理上在MySql中存在另一个列时存储总数,然后插入一个新行并检索它,然后在PHP中执行一些基本计算。

E.g:一个产品销往:

Item   Price  Quantity  Discount 
Item 1  55   100   10% 

上面是销售表,价格列是从项目表接头。基于以上问题,不是我们可以使用PHP来获取结果,执行Price X Quantity X 0.10或者我们我们的表可以如下所示:

Item   Price  Quantity  Discount Amount 
Item 1  55   100   10%  4950 

现在是做这样一个简单的任务的更好的办法?

类似的问题: Doing Calculations in MySql vs PHP

+0

[在MySQL vs PHP中进行计算](http://stackoverflow.com/questions/6449072/doing-calculations-in-mysql-vs-php) – 2012-03-24 13:05:40

+0

@DanLee,即在MySql中执行计算,我正在存储另一列中的值。 – Namit 2012-03-24 13:07:08

+0

如果添加另一列,并且在更新时不得不关注2个表格,我会坚持加入解决方案。因为这可能会变得混乱 – 2012-03-24 13:09:19

回答

2

对于所有情况都没有一揽子规则。影响网站性能和效率的因素很多。所以没有单一的'最好'。

如果你看看像Magento这样的东西,它可以做到这一点。一方面它具有完整的EAV结构,每个数据都被抽象出来并归一化到第n个等级。另一方面,出于性能原因,它还将平面表中的预先计算的值汇总。这包括折扣金额,基准价格,税额(以基础货币和选定货币)等等。前者在灵活性和稳健性方面最好,平坦表在性能方面更好。

平坦的桌子在处理批量计算时显然会更快,因为一切都已经算出来了。但是,正如核心指出的那样,它意味着对设置的任何更改都可能需要对每个值进行批量重新计算。对于历史数据(如订单历史记录),您可能不希望重新计算人们最终支付的实际金额,但在确定最佳解决方案时需要考虑可能性。

如果性能至关重要,并且计算运行起来很昂贵,那么知道您可能需要不时刷新批量值,这样您才能做出明智的缓存决定。但如果它不是一个性能关键方面,或者计算成本昂贵但不经常运行,那么将它们留在数据库之外是更加清洁的,因为它们实际上属于应用程序的业务逻辑处理部分,即代码。

同样有不止一种方式来定义“最佳”,所以它取决于具体情况。这实际上只是一个平衡需求的问题 - 速度,清洁度,内存使用率,处理器需求,磁盘空间使用率,以及适合开发经理定义的任意数据结构的需求 - 您的决定需要考虑这些因素。

没有一个现实世界的问题需要解决,投机是真正的所有可以给。如果你确实有更复杂的情况,我很乐意看看并提供我的想法。

编辑:从我自己的观察,一个Magento目录页与平面数据和超过200k产品加载约10 - 20秒,没有页面缓存启用。当平面数据被禁用并且使用EAV结构时,需要几分钟时间。我现在不在工作,所以我没有我的分析数据,但它证明了一个事实,即在现实世界的应用中没有单一的最佳解决方案。

0

我会保持预先计算出的价格表。这样,如果您的折扣更改为15%,则不必每次都重新计算每行的值。

0

我会与上表结构,我们可以管理所有这些事情由我们的计算,我们不应该保持这样的计算在DB喜欢,因为我们应该遵循RDBMS方法

1

只需计算添加到您的SELECT语句。

样品:

SELECT 
    ItemID, 
    Price, 
    Quantity, 
    Discount 
    Price * Quantity * Discount AS Amount 
FROM myTable 

或者使用视图来检索所需的数据和附加计算的值列。

这样计算的值只对请求有效,并且不必向表中添加额外的列。

2

计算可以通过提取时的SQL查询或关闭数据后执行。该SQL的解决办法是像

SELECT *, ((Price * Quantity) - ((Price * Quantity) * (Discount * .01))) AS Amount 
FROM ... 

在许多方面,这仅仅是一个个人喜好,虽然当SQL开始变得很复杂,我觉得杂乱地工作着。

你可能想要避免的是将总数保存到数据库中,除非它是一个永远不会改变的设定数量。如果您的总额被保存,并且在某个时候您更改了折扣金额或数量,则可能忘记更新总额。如果每次你需要总数,你从已知变量(quantity * price - discount)中计算出来,那么总数应该总是准确的。