2010-05-10 86 views
3

假設我有兩個表:的Sql查詢,組關係

Group 
(
    id integer primary key, 
    someData1 text, 
    someData2 text 
) 

GroupMember 
(
    id integer primary key, 
    group_id foreign key to Group.id, 
    someData text 
) 

我知道,我的SQL語法不正確:)希望是非常明顯的。我的問題是這樣的:我想加載一個組記錄和與該組關聯的所有GroupMember記錄。正如我所看到的,有兩種選擇。

一個單一的查詢:

SELECT Group.id, Group.someData1, Group.someData2 GroupMember.id, GroupMember.someData 
FROM Group INNER JOIN GroupMember ... 
WHERE Group.id = 4; 

兩個查詢:

SELECT id, someData2, someData2 
FROM Group 
WHERE id = 4; 

SELECT id, someData 
FROM GroupMember 
WHERE group_id = 4; 

第一溶液只有是一個數據庫往返的優點,但是具有返回冗餘數據的缺點(所有組數據爲每個組成員重複)

第二種解決方案不會返回重複的數據,但會涉及到數據庫的兩次往返。

這裏有什麼可取的?我想有一些門檻,如果組大小變得足夠大,返回所有冗餘數據的成本將大於額外數據庫調用所涉及的開銷。我應該在這裏考慮什麼其他的東西?

感謝, 喬丹

+0

下面我回答,但你使用的是什麼數據庫? – Jeremy 2010-05-10 15:00:50

+0

我正在使用postgres。 – Jordan 2010-05-10 15:36:21

回答

3

如果你真的想要的結果加入,我相信它始終是更有效地做在服務器級別的加盟。 SQL處理器旨在匹配數據集。 如果您確實需要2個sql語句的結果,您總是可以在一個批處理中以分號分隔發送兩個語句,並且返回兩個結果集並返回一個往返數據庫。

1

如果你每次都要向數據庫發送一個單組記錄,那麼我會選擇第二個選項。如果您正在檢索多個組記錄和關聯的組成員記錄,請使用聯接,因爲它會更快。

2

數據最終如何使用是一個重要和未知的因素。

我建議大多數應用程序的單一查詢方法。正確的索引將使查詢比兩種查詢方法更有效。

如果您需要選擇多個組,則單個查詢方法還具有保持有效的優勢。

-2

在這樣一個簡單的查詢中,我會嘗試在一個查詢中執行它。兩次數據庫調用的開銷可能會超過查詢中額外的SQL處理時間。

工會的條款會爲你做到這一點:

SELECT id, someData1, someData2 
FROM Group 
WHERE id = 4 
UNION 
SELECT id, someData, null 
FROM GroupMember 
WHERE group_id = 4; 
+0

你會如何區分組別記錄和其他?爲什麼你會認爲這些列是兼容的? – JeffO 2010-05-10 15:06:26

+0

問題沒有問區分組記錄,並根據給定的資料,someData領域是沒有指定長度的文本。 – 2010-05-10 15:10:56

0

一般而言,這取決於你想顯示什麼類型的數據。

如果您顯示的是單個組及其所有成員,則兩個選項之間的性能差異可以忽略不計。

如果您顯示了許多組及其所有成員,則必須爲每個後續組執行數據庫往返操作的開銷將超過您從接收少量數據獲得的任何好處。

你可能想在你的推理

  • 結果集的大小要考慮一些其他的東西 - 對於許多團體和成員,你的結果集的大小可能成爲大小的限制因素,以獲取和保持它在記憶力增加。第二種選擇可能會發生這種情況。您可能需要考慮分頁數據,以便一次只檢索某個子集。

  • 延遲加載 - 如果你只得到一些團體的成員,或用戶請求的成員一組在同一時間,考慮延遲加載。這意味着只需要額外的查詢就可以在需要時獲取組的成員。這隻在某些使用情況下才有意義,但它可能比預先檢索所有數據更有效。

0

根據數據庫的類型和您的前端應用程序,你可以回報一次旅行(在例如SQL Server 2005中存儲過程)兩個SQL語句的結果。

如果要創建一個需要從組表許多領域的報告,您可能不希望數據與第一查詢量的增加。

如果這是某種類型的數據錄入應用程序,您可能已經向用戶展示了組數據,所以他們可以在where子句中填入組ID(或者最好通過某個參數),現在他們需要成員結果。

0

這真的,真的,真的取決於你使用會使數據。

如果您想組裝一個郵件羣組的成員列表,並且您需要爲要發送給成員的每封信的羣組名稱,並且您沒有用於羣組級別,那麼單個連接的查詢很有意義。

但如果說,你的編碼主從屏幕或報告,以及每個組的頁面,並在本集團及會員級別顯示信息,則兩個單獨的查詢可能是最有用的。

除非您檢索的數據量非常大(數以萬計的每組數百個成員或類似數量級的組),否則您不太可能看到兩種方法的性能差異很大。