Я хочу создать систему групп пользователей, которая имитирует групповую политику в мессенджерах.
Каждый пользователь может создать столько групп, сколько он хочет, но у него не может быть групп с повторяющимися именами, и он может добавить столько друзей, сколько он хочет, в любые группы.
Например, подруга Джона Джен может быть в «школьной» группе Джона и «коллеге» Джона одновременно. И это совершенно не зависит от того, как Джен помещает Джона в свою группу.
Я думаю о двух возможных способах реализации этого в таблице базы данных user_group.
1
user_group (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
group_name VARCHAR(30),
UNIQUE KEY (user_id, group_name)
)
В этом случае все группы, принадлежащие всем пользователям, будут иметь уникальный идентификатор. Таким образом, один только идентификатор может определить, какой пользователь и название группы.
2
user_group (
user_id INT,
group_id INT AUTO_INCREMENT,
group_name VARCHAR(30),
PRIMARY KEY (user_id, group_id),
UNIQUE KEY (user_id, group_name)
)
В этом случае group_id всегда начинается с 0 для каждого пользователя, поэтому может существовать много групп с одинаковыми значениями group_id. Но пара pk (user_id, group_id) уникальна в таблице.
какой способ лучше реализации и почему?
Каковы преимущества и недостатки для каждого случая?
EDIT:
добавил AUTO_INCREMENT к group_id во втором сценарии, чтобы гарантировать, что он автоматически назначается от 0 для каждого user_id.
EDIT:
«лучше» означает ...
- лучшая производительность в SELECT / INSERT / UPDATE друзей в группе, поскольку это будут наиболее часто используемые операции в отношении группы пользователей.
- надежность базы данных, например, какая будет более безопасной с точки зрения размера пользователя.
- популярность или общее предпочтение одного над другим.
- гибкость
- расширяемость
- удобство использования - проще в использовании.