Как мне моделировать рейтинги продуктов в базе данных? - PullRequest
19 голосов
/ 23 мая 2010

Каков наилучший подход к хранению рейтингов продуктов в базе данных?Я имею в виду следующие два (упрощенный и предполагающий MySQL db) сценария:

Создайте два столбца в таблице продуктов, чтобы сохранить число и сумму всех голосов соответственно.Используйте столбцы, чтобы получить среднее значение во время выполнения или с помощью запроса.

Этот подход означает, что мне нужно получить доступ только к одной таблице, упрощая вещи.путем создания дополнительной таблицы для хранения рейтингов.

Это позволяет разделить данные рейтингов в отдельную таблицу, оставив таблицу продуктов для представления данных о доступных продуктах.Хотя для оценки потребуется объединение или отдельный запрос.

Какой подход лучше, нормализован или денормализован?

Ответы [ 2 ]

32 голосов
/ 23 мая 2010

Настоятельно рекомендуется использовать другую таблицу оценок Не беспокойтесь о сотнях (или тысячах или десятках тысяч) записей, это все арахис для баз данных.

Предложение:

стол продукты
- id
- имя
- и т. д.

таблица рейтинг продуктов
- 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 голос
/ 23 мая 2010

Я знаю, что мой ответ - это не то, о чем вы на самом деле просите, но вы, возможно, захотите иметь возможность содействовать тому, чтобы новые продукты с вашей системой почти никогда не превосходили старые продукты. Скажите, что вы получите продукт с рейтингом 99%. Новым продуктам было бы очень сложно получить высокие результаты при сортировке по продуктам с самым высоким рейтингом.

...