数据库设计 - 如何实现用户组表?

Joo*_*oon 5 mysql database

我想制作在即时消息中模仿组策略的用户组系统.

每个用户可以根据需要创建任意数量的组,但是他们不能拥有重复名称的组,并且他们可以将任意数量的朋友放入任何组中.

例如,John的朋友Jen可以同时在John的"学校"小组和John的"同事"小组中.并且,它完全独立于Jen如何将John带入她的团队.

我正在考虑两种可能的方法在数据库user_group表中实现它.

1.

user_group (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
group_name VARCHAR(30),
UNIQUE KEY (user_id, group_name)
)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有用户拥有的所有组都将具有唯一ID.因此,id本身可以识别哪个用户和组的名称.

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)
)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,group_id总是从每个用户的0开始,因此,可能存在许多具有相同group_id的组.但是,pk对(user_id,group_id)在表中是唯一的.

哪种方式更好实现,为什么?每种情况有哪些优点和缺点?

编辑:在第二种情况下将AUTO_INCREMENT添加到group_id,以确保为每个user_id从0自动分配.

编辑:'更好'意味着...... - SELECT/INSERT/UPDATE朋友对组的更好表现,因为那将是关于用户组的最常用的操作. - 数据库的稳健性,就用户规模而言,它更安全. - 任何一方的受欢迎程度或普遍偏好. - 灵活性 - 可扩展性 - 可用性 - 更易于使用.

Joe*_*l C 3

就我个人而言,我会选择第一种方法,但这实际上取决于您的应用程序将如何工作。如果可以更改组的所有权或合并用户配置文件,则第一种方法比第二种方法更容易做到这一点。在第二种方法中,如果发生任何一种情况,您不仅需要更新user_group表,还需要更新与user_group. 这也将是多对多关系(一个组中有多个用户,一个用户将是多个组的成员),因此需要一个单独的连接表。在第一种方法中,这相当简单:

group_member (
  group_id int,
  user_id int
)
Run Code Online (Sandbox Code Playgroud)

对于第二种方法,它需要第三列,这不仅会更加混乱,因为您现在包含user_id两次,而且还需要 33% 的额外存储空间(这可能是也可能不是问题,具体取决于您期望的大小)你的数据库是):

group_member (
  owner_id int,
  group_id int,
  user_id int
)
Run Code Online (Sandbox Code Playgroud)

另外,如果您计划从 MySQL 迁移到另一个数据库平台,这种行为auto_increment可能不受支持。我知道在 MS SQL Server 中,auto_increment字段(identity在 MSSQL 中)将始终递增,而不是根据表上的索引变得唯一,因此要获得相同的功能,您必须自己实现它。