Что лучший подход к хранению оценок продукции в базе данных? Я имею в виду следующие два (упрощенный, и принятие дб MySQL) сценарии:
Создайте два столбца в таблице продуктов для хранения числа и суммы всех голосов соответственно. Используйте столбцы для получения среднего числа во время выполнения или использование запроса.
Этот подход означает, что я только должен получить доступ к одной таблице, упростив вещи.
Нормализуйте данные путем составления дополнительной таблицы для хранения оценок.
Это изолирует данные оценок в отдельную таблицу, оставляя таблицу продуктов для предоставления данных по доступным продуктам. Хотя это потребовало бы соединения или отдельного запроса для оценок.
Какой подход является лучшим, нормализован или денормализованным?
Настоятельно рекомендуется использовать разные таблицы для рейтингов, чтобы все было динамично. Не беспокойтесь о сотнях (или тысячах, или десятках тысяч) записей, это все арахис для баз данных.
Предложение:
table products
- 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
Я знаю, что мой ответ - это не то, о чем вы на самом деле просите, но вы, возможно, захотите иметь возможность облегчить эти новые продукты с помощью вашей системы, которые почти никогда не смогут превзойти старые продукты. Скажем, вы получите товар с рейтингом 99%. Новым продуктам будет очень сложно получить высокий рейтинг, если вы отсортируете их по продуктам с наивысшим рейтингом.