mysql - ведение списка подписчиков группы на веб-сайте
Я создаю сайт, где пользователи могут присоединиться к определенным группам. Теперь мне нужно сохранить набор пользователей в каждой группе и / или набор групп, к которым присоединился каждый пользователь. Поскольку MySql не поддерживает массивы, я не могу сказать, например, массив пользователей в группе (как поле в таблице "groups") или массив групп в пользователе (как поле в таблице "users"), Так как же мне этого добиться?
Мое текущее решение состоит в том, чтобы поддерживать таблицу групповых подписок, в которой есть поля для userID и groupID. Поэтому, когда мне нужен любой из этих двух списков, я могу сделать,
SELECT USERID FROM SUBSCRIPTIONS WHERE GROUPID=3
или же
SELECT GROUPID FROM SUBSCRIPTIONS WHERE USERID=4
Это даст мне нужные списки. Это самый эффективный / стандартный способ сделать это или есть лучший способ?
2 ответа
Вы все правильно написали.
Обычно существует три типа отношений между записями в относительных базах данных:
- Один - один (например,
user
а такжеprofile
связаны черезuser.profile_id = profile.id
) - Один - много (
user
а такжеmessages
связаны черезmessage.user_id = user.id
) - Очень много
Ваш случай - последний, и он всегда работает через 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
Если я правильно понимаю ваш вопрос, это стандартный способ.
Вы создали "сводную таблицу", которая находится между пользовательской таблицей и таблицей групп и хранит отношения между ними. Это способ хранения отношений "многие ко многим" в реляционных базах данных. Как вы правильно сказали, вы можете извлечь всех членов группы или все группы для этого члена.