Структура базы данных рейтинговой системы
У меня есть две группы лиц. Рестораны и пользователи. Рестораны могут быть оценены (1-5) пользователями. И рейтинг от каждого пользователя должен быть извлекаемым.
Ресторан (идентификатор, имя, ....., total_number_of_votes, total_voting_points) Пользователь (идентификатор, имя......)
Рейтинг (id, restaurant_id, user_id, rating_value)
Нужно ли хранить среднее значение, чтобы его не нужно было вычислять каждый раз? В какой таблице лучше всего хранить avg_rating, total_no_of_votes, total_voting_points?
2 ответа
Хорошо, если вы храните среднее значение где-то; он будет точным только в последний раз, когда вы его рассчитали. (т.е. у вас есть 5 отзывов; затем сохраните где-то средние значения. Вы получите еще 5 новых отзывов, и тогда сохраненное вами среднее значение будет неверным).
Мое мнение таково, что такая логика идеально подходит для среднего уровня. Вычисление среднего значения не должно быть очень ресурсоемким и действительно не должно влиять на производительность.
Если вы действительно хотите сохранить его в базе данных; Я бы, вероятно, сохранил бы их в своей таблице и обновил бы эти значения с помощью триггеров. Однако это может быть даже более ресурсоемким, чем его вычисление на среднем уровне.
Некоторые базы данных, например, PostGreSQL, позволяют хранить массив как часть строки. например
create table restaurants (
...,
ratings integer[],
...
);
Например, вы можете оставить последние 5 оценок в одном ряду с рестораном. Когда вы получите новый рейтинг, перетасуйте старые рейтинги и добавьте новый рейтинг в конце, затем вычислите среднее значение.