2012-02-08 101 views
0

我們有一個PHP/MySQL的應用程序,其中用戶可以創建自己的「數據庫」,它可以變得相當複雜。在MySQL,它的結構爲一組屬性表,與像record_idfield_idfield_value列。我很清楚這種結構的優點和缺點,所以請考慮這一點不會改變。MySQL的自定義報表策略

我們已經有了一個自定義高級搜索系統,用戶可以通過在字段之間和之間使用布爾運算符,結合任何字段的條件來查詢這些數據庫。

現在我們必須實現報告功能,他們將能夠製作自己的報告。這可能包括一對多關係中的多組數據。

例如,考慮一個「人員」數據庫,其中每個人可能有多個聯繫人和多個地址。例如,通過我們的自定義搜索,很容易列出在美國出生的所有人。但我也想在結果集上顯示每個人的所有聯繫人和地址。

我可以看到兩個可能的解決方案:

  1. 單個SQL查詢與多個JOIN語句獲取的所有數據。在這種情況下,我可以有多個行的每個人根據自己有多少聯繫人和地址有,我不得不應付,關於PHP循環顯示(或組織)的結果。我擔心這會變得太複雜,因爲報告可能會有無限數量的一到多個信息塊(在我的示例中,我只有兩個地址和聯繫人)。

  2. 對於每個人,運行'n'個附加查詢,每個塊對應一個到多個數據。在我的例子中,這將是聯繫人的一個查詢,另一個是地址。這種方法會導致運行大量的查詢來構建整個報表。

我知道這兩種方法都有其缺點,但是有沒有一種「推薦」方式可以解決這種情況?

回答

1

這當然取決於您認爲您必須進行的檢索所有數據的查詢數量。從性能的角度來看,建議執行大連接,因爲它可以比多個小查詢處理得更有效率。

使用第二種方法比使用第一種方法會發現大型報告需要更長的時間。

+0

即使是在MySQL的?我的經驗是,MS SQL Server很好地處理了很多連接的大型查詢,但是MySQL看起來效率並不高。 – bfavaretto 2012-02-08 15:13:54

+0

當涉及到大型連接時,MySQL非常高效。我無法對您的具體情況發表評論,但有時它可以幫助您爲要加入記錄的列創建索引。這在某些情況下可以大大提高性能。 – Dan 2012-02-08 15:16:46

+0

我已經有幾個指標,但我猜DB結構是實際的瓶頸在這裏(和,正如我所說,我不能在這一點上改變它)。我會嘗試你的建議,我避免它,因爲我仍然無法弄清楚PHP循環所需的邏輯。 – bfavaretto 2012-02-08 15:23:30