mysql - ведение списка подписчиков группы на веб-сайте

Я создаю сайт, где пользователи могут присоединиться к определенным группам. Теперь мне нужно сохранить набор пользователей в каждой группе и / или набор групп, к которым присоединился каждый пользователь. Поскольку MySql не поддерживает массивы, я не могу сказать, например, массив пользователей в группе (как поле в таблице "groups") или массив групп в пользователе (как поле в таблице "users"), Так как же мне этого добиться?

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

SELECT USERID FROM SUBSCRIPTIONS WHERE GROUPID=3 

или же

SELECT GROUPID FROM SUBSCRIPTIONS WHERE USERID=4

Это даст мне нужные списки. Это самый эффективный / стандартный способ сделать это или есть лучший способ?

2 ответа

Решение

Вы все правильно написали.

Обычно существует три типа отношений между записями в относительных базах данных:

  1. Один - один (например, user а также profile связаны через user.profile_id = profile.id)
  2. Один - много (user а также messages связаны через message.user_id = user.id)
  3. Очень много

Ваш случай - последний, и он всегда работает через 3-ю таблицу.

Для вашего случая это может быть users_subscriptions (user_id, subscription_id)

Пример запроса для выбора всех пользователей с их подписками:

SELECT u.name, GROUP_CONCAT(s.name) as `subscriptions`
FROM users u
JOIN users_subscriptions us ON us.user_id = u.id
JOIN subscriptions s ON us.subscription_id = s.id
GROUP BY u.id

Если я правильно понимаю ваш вопрос, это стандартный способ.

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

Другие вопросы по тегам