2011-04-01 2 views
0

Буду признателен за любую помощь, которую вы можете предложить - в настоящее время я пытаюсь принять решение о схеме для приложения для голосования, которое я создаю с помощью 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 

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

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

Спасибо,

_just_me

ответ

0

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

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

Я хотел бы использовать таблицу голосования, похожее на это:

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 для upvotes и -1 для downvotes, сумма (голосование) вернет счет, так же, как подсчитываются голоса при стеке.

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

  • Нет связанных вопросов^_^