2012-07-02 75 views
1

我想從數據庫表中打印一個項目列表,並與每個項目一起列出相關子項目的一個小列表(最多10個項目)。在列表中獲取相關數據

例如,我有這2個表:

ITEMS 

id: integer 
name: string 


SUBITEMS 

id: integer 
name: string 
item_id: integer 

所以,一個項目可以有很多子項目。

我想打印是這樣的:

Item 1 
this item has: subitem 1, subitem 2, subitem 3 

Item 2 
this item has: subitem 4, subitem 5, subitem 6 

Item 3 
this item has: subitem 2, subitem 4, subitem 7 

我怎麼能得到這個在考慮性能?正如我所說,每個項目可以有許多子項目,但我會顯示最多10個。

如果我用加入做出選擇,我認爲它可能會過多的數據庫時,有一個分頁例如,每頁25個項目,以及100個用戶查詢。所以,我認爲這不是一個好的解決方案。

我曾想過一個解決方法,髒東西:向ITEMS表中添加一個名爲subitems_summary(文本類型)的新字段,並且每次將一個子項分配給一個項目時,我將使select成爲兩個表,並在那裏存儲結果,所以我可以稍後格式化來自該字段的數據。例如,在上面的清單中,Item 3的subitems_summary字段是:「subitem 2; subitem 4; subitem 7」。

您認爲如何?

+0

考慮一下你的「骯髒的解決辦法」不僅不爲的選擇,性能又插入,更新和刪除各個子項。 –

+0

我會使用'select *'並迭代結果集並打印非空值 – alfasin

回答

0

由於我沒有得到更多的答案,我會發表我的意見。

正如Oleksi所說,DBMS足夠運行連接的查詢。對於少量的訪問者來說這可能是事實。但要留意擴展,這不會是一個優化的方法來完成複雜的事情。

我認爲有一些有趣的技術我很喜歡閱讀,但我更傾向於從一開始就優化查詢,至少有一點。在我看來,故意使用連接並不是一個好主意。在專業網站中,最好是爲了這個原因複製字段。

總之,要達到什麼我問,我這樣做:https://stackoverflow.com/a/11301759/267705

0

除非你的物品表是真正巨大的,否則加入會足夠快地完成這項工作。這是最乾淨的解決方案,所以您應該首先實施。然後你可以測量性能,看看它是否真的太慢了​​。我想你會發現它會很快。如果沒有,您還可以嘗試將索引添加到在您製作的查詢中使用很多的列。這將使DBMS可以選擇更強大的優化選項。

您的DBMS通常非常擅長優化這些查詢,因此在進入自定義優化之前,您應該看看它可以多快地進行查詢。

+0

嗯,我認爲除非我使用子查詢,否則我不需要獲取它。而且這個要求更高。 –