22

製品評価をデータベースに保存するための最良の方法は何ですか? 次の 2 つの (単純化され、MySQL データベースを想定した) シナリオを念頭に置いています。

products テーブルに 2 つの列を作成して、すべての投票の数と合計をそれぞれ格納します。列を使用して、実行時またはクエリを使用して平均を取得します。

このアプローチは、1 つのテーブルにアクセスするだけでよいことを意味し、物事を簡素化します。

評価を格納する追加のテーブルを作成して、データを正規化します。

これにより、評価データが別のテーブルに分離され、製品テーブルが利用可能な製品に関するデータを提供するようになります。ただし、評価には結合または別のクエリが必要です。

正規化されたアプローチと非正規化されたアプローチのどちらが最適ですか?

4

3 に答える 3

41

物事を動的に保つために、評価用の別の表を強くお勧めします。数百 (または数千または数万) のエントリについて心配する必要はありません。これはすべてデータベースのピーナッツです。

提案:

テーブル製品

  • ID
  • 名前

テーブルproducts_ratings

  • ID
  • 製品番号
  • 評価
  • 日付(必要な場合)
  • ip (必要に応じて、二重評価を防ぐためなど)

製品のすべての評価を取得1234:

SELECT pr.rating
FROM products_ratings pr
INNER JOIN products p
  ON pr.productId = p.id
  AND p.id = 1234

製品の平均評価1234:

SELECT AVG(pr.rating) AS rating_average -- or ROUND(AVG(pr.rating))
FROM products_ratings pr
INNER JOIN products p
  ON pr.productId = p.id
  AND p.id = 1234;

また、平均評価とともに製品のリストを取得するのも同様に簡単です。

SELECT
  p.id, p.name, p.etc,
  AVG(pr.rating) AS rating_average
FROM products p
INNER JOIN products_ratings pr
  ON pr.productId = p.id
WHERE p.id > 10 AND p.id < 20 -- or whatever
GROUP BY p.id, p.name, p.etc;
于 2010-05-23T17:49:44.090 に答える
3

私の答えがあなたが実際に求めているものではないことはわかっていますが、あなたのシステムを搭載した新製品が古い製品に勝ることはほとんどないということを促進したいと思うかもしれません. 99% の評価の製品が得られるとします。評価の高い商品で並べ替えると、新商品が高くつくのは非常に難しいでしょう。

于 2010-05-23T17:35:28.743 に答える