如何在数据库中对产品评级进行建模?

时间:2010-05-23 17:29:07

标签: mysql database-design rating-system

在数据库中存储产品评级的最佳方法是什么?我记得以下两个(简化,并假设一个MySQL数据库)场景:

  

在products表中创建两列,分别存储所有投票的数量和总和。使用列可以在运行时或使用查询获得平均值。

这种方法意味着我只需要访问一个表,简化了一些事情。

  

通过创建另一个表来存储评级来规范化数据。

这会将评级数据隔离到一个单独的表中,而产品表则提供有关可用产品的数据。虽然它需要加入或单独查询评级。

哪种方法最好,规范化或非规范化?

2 个答案:

答案 0 :(得分:32)

强烈建议使用不同的评级表来保持动态。不要担心数百(或数千或数万)的条目,这些都是数据库的花生。

建议:

产品
- id
- 姓名
- 等等

products_ratings
- id
- productId
- 评级
- 日期(如果需要)
- 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

答案 1 :(得分:1)

我知道我的回答并不是你真正要求的,但是你可能希望有机会通过你的系统促进新产品几乎不会超过旧产品。假设您将获得99%评级的产品。如果按照评级最高的产品进行排序,新产品将很难获得高价。