дизайн базы данных для «последователей» и «последователей»? - PullRequest
29 голосов
/ 04 февраля 2011

Уважаемые эксперты / программисты по базам данных:

У меня есть таблица mysql с информацией о пользователях, например

id      user_id         name etc.
1       userA            
2       userB   
3       userC
..      ..
..      ..

Я хочу создать такую ​​функцию, как «следить» за другими пользователями, например, Twitter,Пользователь A может следовать за пользователем B, или пользователь B может следовать за пользователем A, или оба могут следовать друг за другом.Для этого я должен создать 1 таблицу, скажем, последователи

id      user_id     follower_id
1           userA       userB
2           userC       userA
3           userA       userC
4           userB       userC
5           userX       userA

Теперь я хочу выяснить, кто следует за пользователем A.Мне бы очень хотелось: выбрать * из подписчиков, где user_id = userA. Это выберет userB и userC.Вот что мне нужно.

Теперь я хочу выяснить, за какими людьми следует пользователь А (например, в приведенной выше таблице пользователь А следит за пользователями С и userX. Затем я должен запустить что-то вроде Select * из подписчиков, где follower_id = userA.

Мой вопрос заключается в том, является ли этот дизайн базы данных правильным для этой проблемы (учитывая избыточность и оптимизацию базы данных?) Или может быть лучший подход, чем этот? Спасибо.

Ответы [ 4 ]

14 голосов
/ 04 февраля 2011

В целом, ваш дизайн правильный.

Но, если user_id уникален в таблице «users», вам не нужен столбец «id» в «users». (Отдельная таблица, содержащая уникальный «id» и уникальный «user_id» довольно необычна.) Вам также не нужен столбец «id» в таблице «последователи».

Первичный ключ в «последователях» должен быть (user_id, follower_id), и убедитесь, что у каждого из этих столбцов есть внешний ключ, ссылающийся на «user_id» в «users».

4 голосов
/ 04 февраля 2011

Общий совет.Используйте целые числа для идентификаторов, а не строк.Существует значительная разница в производительности.Поэтому удалите users.user_id и переименуйте users.id в users.user_id.Во-вторых, у вашей таблицы фолловеров должны быть индексы user_id и follower_id.Опять же, существует значительный выигрыш в производительности.Мне также нравится идея создания уникального индекса (user_id, follower_id), вызова этого первичного ключа и удаления столбца идентификатора.

3 голосов
/ 21 апреля 2017

Вот мой дизайн.

Id    userId(PK)  followerId     followedDate         unfollewedDate
1     123         456            YYYY-MM-DD HH:MI:SS  YYYY-MM-DD HH:MI:SS
...   ...         ...            ...                  ...

Я предположил, userId - followerId Комбинация уникальна. Даты могут быть полезны. Например, я думаю о том, чтобы использовать, если пользователь отписался и повторил через 5 минут, он не генерирует уведомления. Я предполагаю, что пользователь сделал это по ошибке. И я могу проанализировать следующую статистику по дате.

1 голос
/ 04 февраля 2011

Да, ваш дизайн - это обычный способ справиться с отношениями «многие ко многим». Выполните поиск «моделирование базы данных многие-ко-многим», и вы найдете множество ресурсов, дающих вам примеры этого.

Добавление внешних ключей из таблицы отношений в таблицу пользователей.

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

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

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