Самый эффективный способ хранения данных голосования в базе данных MySQL (например, StackOverflow) - PullRequest
4 голосов
/ 23 декабря 2011

Я пытаюсь скопировать систему голосования SE. Пользователь на моем веб-сайте должен иметь возможность голосовать только за сообщения один раз, после чего они заблокированы. У меня есть две таблицы: users и posts.

Как хранить информацию о том, за какие сообщения проголосовал пользователь? Я думал о наличии столбца в posts, в котором будут храниться uid пользователей, которые проголосовали за него. Другая идея могла бы иметь столбец в users с id сообщениями, за которые он / она проголосовал.

Как мне это сделать? Я хочу принять во внимание масштабируемость и легко определить, является ли голосование действительным.

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Создание другой таблицы для хранения информации из таблиц users и posts:

CREATE TABLE votes (
      user_id INT
    , post_id INT
    , PRIMARY KEY (user_id, post_id)
);

При таком подходе:

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

Если вы не сохраняете значения как значения с разделителями (для размещения в одной ячейке)) или JSON, вы получите много строк только для одного поста.Но с другой стороны, это плохой подход.

Придерживайтесь создания новой таблицы, которая содержит отношение, определяющее «голосование».Таблица достаточно проста для проверки:

SELECT COUNT(t1.post_id) AS vote_count
FROM votes AS t1
WHERE 
    t1.user_id = SOME_INTEGER
    AND t1.post_id = SOME_INTEGER
4 голосов
/ 23 декабря 2011

Лучшая практика для чего-то, имеющего размер stackoverflow, - хранить отдельные голоса в отдельной таблице.Но также ведите подсчет полученных голосов в поле, непосредственно прикрепленном к сообщению.По мере роста размеров базы данных становится непозволительно дорого суммировать все голоса при каждом просмотре сообщения.

Сохранение этого производного поля относительно легко с помощью триггеров в этой таблице user / голосования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...