Как мне оптимизировать приложение для голосования для составления ежемесячных графиков? - PullRequest
0 голосов
/ 01 апреля 2011

Буду признателен за любую помощь, которую вы можете предложить - в настоящее время я пытаюсь выбрать схему для приложения для голосования, которое я создаю с помощью PHP / MySQL, но я совершенно не знаю, как его оптимизировать.Ключевыми элементами являются разрешение только одного голоса на пользователя на элемент и возможность построения диаграммы с подробным описанием главных элементов месяца на основе голосов, полученных в этом месяце.

Пока что исходная схема:

Items_table
 item_id
 total_points
 (lots of other fields unrelated to voting)

Voting_table
 voting_id
 item_id
 user_id
 vote (1 = up; 0 = down)
 month_cast
 year_cast

Так что мне интересно, будет ли это случай выбора всей информации из таблицы голосования, где month = currentMonth & year = currentYear,как-то запустить подсчет и группировку по item_id;если так, как бы я поступил так?Или мне лучше создать отдельную таблицу для ежемесячных диаграмм, которая будет обновляться с каждым голосованием, но тогда я должен быть обеспокоен требованием обновить 3 таблицы базы данных за голос?

Я не особенно компетентен -если он показывает - так очень хотелось бы любую помощь / руководство, которое кто-то может предоставить.

Спасибо,

_just_me

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Я бы использовал таблицу голосования, подобную этой:

create table votes(
  item_id
 ,user_id
 ,vote_dtm
 ,vote
 ,primary key(item_id, user_id)
 ,foreign key(item_id) references item(item_id)
 ,foreign key(user_id) references users(user_id)
)Engine=InnoDB;

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

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

create view votes_monthly as
select item_id
      ,year(vote_dtm)  as year
      ,month(vote_dtm) as month
      ,sum(vote) as score
      ,count(*)  as num_votes
  from votes
 group
    by item_id
      ,year(vote_dtm)
      ,month(vote_dtm);

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

Обратите внимание, что я использовал count(*) и sum(vote). Счетчик (*) будет возвращать количество поданных голосов, тогда как сумма возвращает число положительных голосов. Однако, если вы изменили столбец vote, чтобы использовать +1 для повышающих голосов и -1 для понижающих голосов, сумма (голосование) вернула бы счет, очень похожий на то, как рассчитываются голоса в стеке.

0 голосов
/ 01 апреля 2011

Я бы не стал добавлять отдельные таблицы для месячных графиков;чтобы пользователи не могли отдавать более одного голоса за элемент, вы можете использовать уникальный ключ для голосования на_таблице (item_id, user_id).Что касается сводки, вы должны быть в состоянии использовать простой запрос, как

select item_id, vote, count(*), month, year 
from voting_table 
group by item_id, vote, month, year
...