我想制作在即时消息中模仿组策略的用户组系统.
每个用户可以根据需要创建任意数量的组,但是他们不能拥有重复名称的组,并且他们可以将任意数量的朋友放入任何组中.
例如,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朋友对组的更好表现,因为那将是关于用户组的最常用的操作. - 数据库的稳健性,就用户规模而言,它更安全. - 任何一方的受欢迎程度或普遍偏好. - 灵活性 - 可扩展性 - 可用性 - 更易于使用.
就我个人而言,我会选择第一种方法,但这实际上取决于您的应用程序将如何工作。如果可以更改组的所有权或合并用户配置文件,则第一种方法比第二种方法更容易做到这一点。在第二种方法中,如果发生任何一种情况,您不仅需要更新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 中)将始终递增,而不是根据表上的索引变得唯一,因此要获得相同的功能,您必须自己实现它。
| 归档时间: |
|
| 查看次数: |
6400 次 |
| 最近记录: |