問題のいくつかの実世界の例私は、SQLとリレーショナルデータベースのみを使用して合理的な方法で解決する方法がわからないでしょう(おそらく私の過失)。
したがって、約30,000の製品を含む(一般的なリレーショナル)データベースがあります。今のところ大きなことはありません。これらの各製品には多くの属性があります。グループ(ケーブル、アンテナ、iphoneケース...約80)、品揃え(グループにいくらか似ている:車、ハイファイ、mp3、15のみ)、ブランド(30)などの一般的なものがあります。
次に、技術データが表示されます。各アイテムには、色、ケーブルの長さ、重量、体積などの多くのものがあります。約200のそのような値タイプと数千の値。
そして最も複雑なのは、これらの製品の多くは、ある車種(またはそれらのいくつか)またはある種のモバイルデバイスに属していることです。これらは、ブランド(アップル)モデル(ipad)タイプ(1,2,3,4)のような形式で、場合によっては生成された階層になっています。(車の場合も同様ですが、世代の代わりに年を構築しています)
問題のステップ1:
これらの各属性の商品の量が必要です。赤は何枚ですか?ケーブルグループにはいくつありますか?等々。
これは部分的にSQLで解決できます。それは多くのクエリとかなり醜いでしょうが、私は可能だと思います。遅くなるかもしれませんが、それをもっと醜くして、各テーブルにカウンターを保持し、変更のたびに更新することもできます。製品が複数ある可能性がある属性では特に難しい(iPhoneや他の12の携帯電話で動作するなど)
しかし、ここに問題のステップ2があります。
顧客が1つの属性を選択した場合(たとえば、赤い商品のみを表示したい場合)、すべてのカウンターをリアルタイムで更新します。つまり、非常に複雑なクエリを実行するか(とにかく速度が十分でない可能性があります)、属性の可能な組み合わせ(数十億)のカウンターを保持します。
私がこのプロジェクトを始めたとき、彼らはカウンターオプションを試してみて、属性の非常に小さなサブセット(グループ、品揃え、ブランド)に対してこれを行いました。コードは醜く、バグが多く、遅いものでした。さらに、製品のテーブルよりもはるかに大きいカウンターを備えたテーブルができました。
Apache Solrのファセットを使用することが実際の解決策でした。テーブルをドキュメントのリスト(製品ごとに1つ)にフラット化して、はるかに単純なクエリでリアルタイムでこのすべてのデータを取得できるようにします。