Вопросы о структурах баз данных и множестве функций аля Reddit - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть вопрос о том, как сайт закладок, такой как Reddit, будет управлять всеми «голосами», которые зарегистрировал пользователь.

Например, когда я (User_ID_292929) голосую за пост (Post_ID_282828) логически где-то в базе данных, он говорит, что User_ID_292929 проголосовал за Post_ID_282828.

Но как это будет структурировано в БД? Будет ли в таблице, которая обрабатывает профили пользователей, поле, заполненное значениями, разделенными запятыми, и будет ли оно взорвано и проверено, чтобы проверить, были ли проверены посты на загружаемой странице?

Я не ищу длинного ответа, а приведу пример программы или документации аналогичной структуры.

Спасибо

Ответы [ 5 ]

3 голосов
/ 14 декабря 2011

Если пользователь может проголосовать за определенный пост только один раз, тогда вы можете создать новую таблицу (назовем ее users_vote_posts ) с 2 столбцами ( user_id и * 1006).* post_id ).Установите оба параметра user_id и post_id в качестве составного первичного ключа.

Используя ваш пример, скажем, пользователь (User_ID_292929) голосует за сообщение (Post_ID_282828).Таблица будет выглядеть следующим образом:



    +---------+---------+
    | user_id | post_id |
    +---------+---------+
    |  292929 |  282828 |
    +---------+---------+

Если существует более одного типа голосования (например, голосование "за" или "против"), вы можете добавить еще один столбец, который определяет тип голосования (давайте назовем это voice_type ).

Теперь таблица будет выглядеть так:



    +---------+---------+-----------+
    | user_id | post_id | vote_type |
    +---------+---------+-----------+
    |  292929 |  282828 | up        |
    +---------+---------+-----------+

0 голосов
/ 14 декабря 2011

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

assoc_user_vote - имя таблицы

id - первичный ключ

идентификатор пользователя

voiceid

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

Этот шаблон поддерживает множество голосов определенного пользователя и соответствует рекомендациям по нормализации данных.http://en.wikipedia.org/wiki/Database_normalization

0 голосов
/ 14 декабря 2011

Я решил эту проблему для создаваемого мной сайта.

Как и Reddit, пользователь может войти в систему и увидеть более 20 историй на главной странице.

СОЕДИНЕНИЕ таблицы голосования против таблицы «Пользователь» и «История» не слишком эффективно для определения того, голосовал ли пользователь, вошедший в систему в данный момент, по каждой истории или нет.

Я выбрал гибридный подход: 1) Составление таблицы голосования (id, ID пользователя, Storyid) 2) Добавление столбца «Voted_Cache» в таблицу «История», которая представляла собой разделенный запятыми список (CSV) идентификаторов пользователей, которые проголосовали за историю.

Теперь, когда я загружаю 20 статей на домашней странице, я могу проверить, существует ли текущий столбец идентификатора пользователя в столбце story.Voted_Cache, вместо необходимости присоединяться к таблице голосования.

Таблица «Проголосовать» является официальной, чтобы сообщить мне, за какие статьи проголосовали, и столбец Voted_Cache можно перестроить из этой таблицы, если необходимо.

0 голосов
/ 14 декабря 2011

Это то, что называется многозначным атрибутом.Когда это происходит, у вас есть отдельная таблица, в которой указана нужная вам информация.Таким образом, вы можете иметь userid, postid.Тогда это будет ваш первичный ключ для этой таблицы, так как идентификаторы пользователя и вместе взятые будут уникальными, поэтому в базе данных не будет дубликатов или ошибок.Если вам нужна дополнительная информация о публикации, вы всегда можете использовать оператор запроса в запросе, чтобы получить дополнительную информацию о публикации или пользователе.

Кроме того, поскольку таблица меньше по размеру, вы можете кэшировать ее для более быстрого доступа, такие сайты, как reddit, будут широко использовать кэширование и кластеризацию.

0 голосов
/ 14 декабря 2011

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

...