2012-03-24 44 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)中計算出來,那麼總數應該總是準確的。