私は現在ウェブショップを構築しています。このショップでは、ユーザーは 、および 、 などのいくつかのオプションの追加フィルターで製品をフィルタリングできcategory
ます。brand
color
現在、さまざまなプロパティが別の場所に保存されていますが、タグベースのシステムに切り替えたいと考えています。理想的には、データベースに次のデータを含むタグを格納する必要があります。
product_id
tag_url_alias
(個性的)tag_type
(一意) (カテゴリ、product_brand、product_color など)tag_value
(一意ではありません)
最初の目的
1 ~ 5 個の特定のタグproduct_id
に関連付けられているを検索したいと考えています。タグは、SEO に適した URL から抽出されます。したがって、各タグの一意の文字列 ( ) を取得しますが、 . はわかりません。検索は交差するので、私の検索では、提供されたすべてのに一致するが返されるはずです。tag_url_alias
tag_type
product_id
tags
第二の目的
現在のフィルターに一致する製品を表示するだけでなく、ユーザーが提供する可能性のある他のカテゴリとフィルターの製品数も表示したいと思います。
たとえば、現在の検索では、次のタグに一致する製品を検索しています。
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 でこれを行う場合、このタイプのキャッシュされた結果を保存して結合する最良の方法は何でしょうか?