11

私は現在ウェブショップを構築しています。このショップでは、ユーザーは 、および 、 などのいくつかのオプションの追加フィルターで製品をフィルタリングできcategoryます。brandcolor

現在、さまざまなプロパティが別の場所に保存されていますが、タグベースのシステムに切り替えたいと考えています。理想的には、データベースに次のデータを含むタグを格納する必要があります。

  • product_id
  • tag_url_alias(個性的)
  • tag_type(一意) (カテゴリ、product_brand、product_color など)
  • tag_value(一意ではありません)

最初の目的

1 ~ 5 個の特定のタグproduct_idに関連付けられているを検索したいと考えています。タグは、SEO に適した URL から抽出されます。したがって、各タグの一意の文字列 ( ) を取得しますが、 . はわかりません。検索は交差するので、私の検索では、提供されたすべてのに一致するが返されるはずです。tag_url_aliastag_typeproduct_idtags

第二の目的

現在のフィルターに一致する製品を表示するだけでなく、ユーザーが提供する可能性のある他のカテゴリとフィルターの製品数も表示したいと思います。

たとえば、現在の検索では、次のタグに一致する製品を検索しています。

Shoe + Black + Adidas

さて、店の訪問者は、出来上がった製品を見て、他のブランドがどんな黒い靴を提供しているのか疑問に思うかもしれません. そのため、「ブランド」フィルターに移動し、リストされている他のブランドのいずれかを選択する場合があります。2 つの異なるオプションがあるとしましょう (実際には、これにはおそらくもっと多くのオプションがあります)。結果として、次の検索が行われます。

Shoe + Black + Nike > 103 results
Shoe + Black + K-swiss > 0 results

この場合、ブランド「K-swiss」がフィルターで利用可能な選択肢としてリストされている場合、検索結果は 0 件になります。

これは明らかにユーザーにとってかなりがっかりです...「ブランド」を「adidas」から「k-swiss」に切り替えると結果が0になり、フィルターからオプション全体が単純に削除されることを知りたいです。

カテゴリ、色などについても同じことが言えます。

実際には、これは 1 回のページ ビューで、私の主な目的で説明したフィルター処理された製品リストが返されるだけでなく、類似しているが異なる数百のリストが返される可能性があることを意味します。別のフィルター値を置き換えるか、既存のフィルター値に追加できるフィルター値ごとに 1 つ。

容量

データベースには最終的に次のものが含まれると思います。

250 ~ 1,000 の一意のタグ

そしてそれは含まれます:

10.000 から 100.000 のユニークな商品

現在のアイデア

Google で検索したところ、次の記事が見つかりました: http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html

その記事から判断すると、2 番目の目的を達成するために何百ものクエリを実行するのは、非常に時間がかかります。「toxy」の例は私のニーズには合っているかもしれませんし、最初の目的には受け入れられるかもしれませんが、2 番目の目的には容認できないほど遅くなります。

1tagをそれに関連付けられている に一致する個々のクエリを実行しproduct_id、それらのクエリをキャッシュしてから、結果の交差を計算することを考えていました。しかし、MySQL でこれらの交点を計算しますか? またはPHPで?MySQL を使用している場合、これらの個々のクエリをキャッシュする特定の方法はありますか、それとも必要なすべての適切なインデックスを提供していますか?

tagこれらの 2 つの/product_idセットの間の共通部分をキャッシュすることもかなり可能だと思います。交差の量は、 atag_typeが特定の値を 1 つしか持てないという事実によって制限されますが、このタイプのキャッシングを効率的に管理する方法がわかりません。繰り返しますが、これを MySQL で行うべきか PHP で行うべきかわかりません。また、MySQL でこれを行う場合、このタイプのキャッシュされた結果を保存して結合する最良の方法は何でしょうか?

4

2 に答える 2

3

Sphinx 検索エンジンを使用すると、この魔法を実現できます。非常に高速で、ワードフォームも処理できるため、SEO リクエストに役立ちます。

スフィンクスに関しては、「製品」というドキュメントを作成し、タグでインデックスを作成し、クエリに適切なランカー (MATCH_ALL_WORDS など) を選択し、さまざまなタグの組み合わせでバッチ リクエストを実行して、最良の結果を取得します。memcahed などのキャッシャーを使用することを忘れないでください。

于 2012-10-15T14:50:55.920 に答える
2

これはまだテストしていませんが、数百のクエリをトリガーするのではなく、1 つのクエリで 2 番目の目的を達成できるはずです...以下のクエリは、これが一般的にどのように機能するかを示しています。アイデアは、3 つの異なる要求を一度に結合し、専用の値でグループ化し、結果が得られたものだけを収集することです。

SELECT t1.product_id, count(*) FROM tagtable t1, tagtable t2, tagtable t3 WHERE 
t1.product_id = t2.product_id AND 
t2.product_id = t3.product_id AND
t1.tag_type='yourcategoryforShoe' AND t1.tag_value='Shoe' AND
t2.tag_type='product_color' AND t2.tag_value='Black' AND
t3.tag_type='brand'
GROUP BY t3.tag_value
HAVING count(*) > 0
于 2012-10-15T14:40:26.740 に答える