2015-07-31 2 views
1

Я намерен внедрить систему голосования в моем веб-приложение (reactJs, флюс, nodejs + экспресс-сервер)система голосования с неравными голосов

Многие пользователи (в тысячах) могут голосовать и их голоса не равны. От 1 до 100. Они могут голосовать за или против. Мне нужно иметь среднее арифметическое для всех голосов в моей базе данных. У меня есть тысячи страниц с системами голосования. Как я могу это реализовать? Я думаю, я мог бы хранить все голоса с каждой страницы в одной ячейке таблицы базы данных. Когда мне нужно будет оказывать средний голос на внешнем интерфейсе, я буду получать JSON объект так:

{ page1: [1,22,5,7,32,...~1000 more numbers] } 

и использовать JS на стороне клиента, чтобы вычислить среднее арифметическое.

Это хорошая идея? Может быть, есть другой способ?

ответ

2

В этом случае не потеряете ли вы отношения между кем проголосовали?

Я предпочел бы хранить голоса во многих таблицах, ссылающихся на голосование пользователя, проголосовавшего элемента и стоимости голосования.

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

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

С учетом этих данных вы можете реализовать более надежную ценность голосования, чем простое среднее ... но это совершенно другое дело.

1

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

Table 1: 
UserID (int), NumberOfVotes (int) 

Table2: 
PageID (int), UserID (int), ForOrAgainst (binary 1=for, 0=against) 

Тогда для подсчета голосов вы можете просто присоединиться таблицы и SUM (NumberOfVotes) для, и вычитать SUM (NumberOfVotes) по отношению к данному PageId.

Here's an SQLFIDDLE, который суммирует голоса за данную страницу. Обратите внимание, что вам понадобится второй запрос (или два подзапроса), чтобы получить голосу против AGAINST.

Смежные вопросы