2017-04-12 123 views
0

我一直在試圖弄清楚什麼是處理顯示子數據的最好,最有效的方法。在我的具體情況下,我使用的是PHP和MySQL,但我認爲這更像是「通常以任何語言」的交易。如何避免在子數據循環中調用數據庫查詢

我的兩個想法是(在這個例子中,我將列出發票和其行項目)

  1. 加入的子數據(發票項目)作爲主數據(發票)只有一個單個查詢我的問題是,假設我在發票上有500個行項目(可能不太現實,但事情發生),那麼我會將整個發票數據從MySQL服務器發送到我的PHP腳本的500倍,聽起來很荒謬,因爲我只需要一次。

  2. 第二種選擇是,在循環發票並顯示總髮票數據的同時,選擇發票的行項目。當然,這現在正在更多次地聯繫數據庫500。

是否有任何其他選項用於處理這些數據,使邏輯上(使用給定的模式)?我幾乎100%肯定有,因爲我不相信我是第一個想到這個問題的人,但我想我很難找到正確的方式來搜索關於這個主題的更多信息。

回答

1

加入的子數據(發票項),以作爲只有主數據(發票)有一個單一的查詢

這是處理這一要求的傳統方式。它確實處理冗餘數據,並且存在一些開銷。

但是。

  1. 這就是它可以指定從客戶機到一個RDBMS壓縮連接的原因...壓縮減輕了冗餘數據的網絡開銷。
  2. 單個結果集中的冗餘數據比重複查詢的成本要低得多。

大多數人只是在這種應用程序中檢索冗餘數據。程序產品像Crystal Reports這樣做

如果它不適合你,你檢索並保存一個結果集爲您的主記錄...也許這樣的事情。

SELECT master_id, name, address, whatever 
    FROM master m 
    WHERE m.whatever = whatever 
    ORDER BY whatever 

然後,把那些到關聯數組由master_id

然後,檢索詳細記錄。

SELECT d.master_id, d.detail_id, d.item, d.unit, d.quantity 
    FROM detail d 
    JOIN master m ON d.master_id = m.master_id 
    WHERE m.whatever = whatever 
    ORDER BY d.master_id, d.detail_id, whatever 

你會得到與標記有master_id值所有相關的細節記錄(發票項目)的結果集。你可以讓他們在你的php程序中將它們匹配到主記錄。你基本上是在應用程序代碼中進行連接。

如果這聽起來像脖子上的痛苦太多了......只是去冗餘數據,並完成您的項目。如果必須的話,你可以隨時優化。

+0

哦哇我沒有想過在PHP中加入它。我會用我的真實數據建立一個基準,看看三種方法中的哪一種勝出。感謝你,我甚至沒有考慮過壓縮數據大小 –

+0

很好,經過了三種方法的大量測試後,在運行兩個查詢後將它們加入到PHP中,一次用於父數據,兩次用於所有子數據(至少在我的情況下)擊敗了另外兩個表現。每個父行的子數據調用顯然丟失了,並且根本沒有擴展,我認爲在我的情況下,查詢很難用所有額外的連接進行索引,所以查詢成了罪魁禍首。 –

+0

看起來好像查詢可以進行優化,但是如果您有大量數據要返回,冗餘數據選項可能會最快。 –