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 個まで表示します。

結合を使用して選択を行うと、たとえば、1 ページあたり 25 項目のページ付けがあり、100 人のユーザーがクエリを実行している場合、データベースに過度の負荷がかかる可能性があると思います。したがって、これは良い解決策ではないと思います。

サブアイテムがアイテムに割り当てられるたびに、サブアイテムがアイテムに割り当てられるたびに、2つのテーブルを結合するように選択し、保存します。そこに結果があるので、後でそのフィールドのデータをフォーマットできます。たとえば、上記のリストでは、アイテム 3 の subitems_summary フィールドは「サブアイテム 2; サブアイテム 4; サブアイテム 7」になります。

どう思いますか?

4

2 に答える 2

0

アイテムのテーブルが本当に巨大でない限り、結合はこれを十分に速く行います。これは最もクリーンなソリューションなので、最初に実装する必要があります。次に、パフォーマンスを測定して、それが本当に遅すぎるかどうかを確認できます。十分に速いことがわかると思います。そうでない場合は、作成するクエリで頻繁に使用される列にインデックスを追加することもできます。これにより、DBMSは、選択できるより強力な最適化オプションを利用できるようになります。

通常、DBMSはこのようなクエリの最適化に非常に優れているため、カスタム最適化に入る前に、最初にクエリを実行できる速度を確認する必要があります。

于 2012-07-02T17:46:41.690 に答える
0

これ以上の回答が得られないので、私の意見を投稿します。

Oleksi が言うように、DBMS は結合されたクエリを実行するのに十分です。これは、訪問者数が少ない場合に当てはまります。しかし、スケーリングに目を向けると、これは複雑なことを行うための最適化された方法ではありません。

読んでみたい興味深いテクニックがあると思いますが、少なくとも少しは、最初からクエリを最適化することに重点を置いています。私の意見では、結合を意図的に使用することはお勧めできません。プロのサイトでは、その理由だけでフィールドを複製することをお勧めします。

とにかく、私が求めていたものを達成するには、これを行います: https://stackoverflow.com/a/11301759/267705

于 2012-07-12T22:27:20.463 に答える