Структура базы данных рейтинговой системы - PullRequest
1 голос
/ 01 июня 2010

У меня есть две группы сущностей. Рестораны и пользователи. Рестораны могут быть оценены (1-5) пользователями. И рейтинг от каждого пользователя должен быть восстановлен.

Ресторан (id, имя, ....., total_number_of_votes, total_voting_points) Пользователь (id, имя ......)

Рейтинг (id, restaurant_id, user_id, rating_value)

Нужно ли мне хранить среднее значение, чтобы его не нужно было вычислять каждый раз? в какой таблице лучше всего хранить avg_rating, total_no_of_votes, total_voting_points?

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Хорошо, если вы где-то храните среднее значение; он будет точным только в последний раз, когда вы его рассчитали. (то есть у вас есть 5 отзывов; затем сохраните где-то средние значения. Вы получите еще 5 новых отзывов, и тогда сохраненное вами среднее значение будет неправильным).

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

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

0 голосов
/ 18 февраля 2016

Некоторые базы данных, например, PostGreSQL, позволяют хранить массив как часть строки. например,

create table restaurants (
    ...,
    ratings integer[],
    ...
);

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

...