Как разработать систему «Мне нравится» и «Мне не нравится»? - PullRequest
0 голосов
/ 28 апреля 2011

Мне нужно создать систему голосования.

Голоса, даже если они разные, могут относиться к двум объектам (на данный момент, но, вероятно, не сильно изменятся).

Две сущности - это Article & Comment, однако за комментарии можно голосовать только «за» (так же, как SO работает с ответами и комментариями).

Хотя, чтобы избежать принципа СУХО, я мог бы использовать объект голосования, а затем добавить таблицу отношений как для статьи, так и для комментария, но мой «голос» больше похож на «мне нравится» и «мне не нравится» «что мне нужно посчитать, то это не похоже на« +1 и / или -1 », поэтому я не уверен, что это может быть применено как к статье, так и к комментарию.

Есть идеи о том, как я могу спроектировать такую ​​систему?

Кстати, я использую Doctrine 2 и Zend Framework.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

ОК ... Я думаю, что это не то, что вам нужно, но здесь все идет ..

Вы действительно должны посмотреть это видео: Создание Web Reputation Systems

О проблеме: я думаю, что вы не должны смешивать Статьи и Комментарии в одну большую липучку.Они представляют разные типы объектов.

Я бы создал отдельные таблицы для CommentVotes и ArticleVotes, а затем имел бы строку в Comments и Articles с именем total_likes и для Articles дополнительно total_dislikes (такчто вам не нужно каждый раз пересчитывать сумму).

1 голос
/ 28 апреля 2011

Я не знаком с Doctrine, но ваша база данных будет выглядеть примерно так:

article_votes(
    article_id, 
    user_id,
    score,
    primary key( article_id, user_id )
);
comment_votes(
    comment_id,
    user_id,
    primary key( comment_id, user_id )
);

Для article_votes, оценка может быть +1 для лайка или -1 для нелюбви.Для comment_votes вы можете добавить столбец с оценками на случай, если в будущем вы захотите запретить антипатии.Первичный ключ не дает пользователям голосовать за статью или комментировать несколько раз.Чтобы получить общее количество лайков или дислайков, вы выбираете count WHERE score=1 или WHERE score=-1;чтобы получить совокупный балл за статью, вместо этого выберите сумму.

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

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

Таблица голосов

5 - статья, 6 - это комментарий

id   user  parent  vote
3      3     5      1   vote
4      3     6     -1   dislike
5      4     6      1   like

для получения голосов за статью

select count(votes) from votes where parent=ARTICLE_ID

Чтобы получить лайк / неприязнь к комментарии

select (select count(vote) from votes where vote=-1 and parent=3) as dislikes, (select count(vote) from votes where vote=1 and parent=3) as likes
...