将用户添加到数据库中的多个组的最佳方法是什么?

问题描述 投票:3回答:5

在用户可以属于多个组的应用程序中,我目前将他们的组存储在名为groups的列中作为二进制文件。每四个字节是一个32位整数,即GroupID。但是,这意味着要枚举组中的所有用户,我必须以编程方式选择所有用户,并手动查明它们是否包含该组。

另一种方法是使用unicode字符串,其中每个字符都是表示组的整数,这使搜索变得容易,但有点像软糖。

另一种方法是创建一个单独的表,将用户链接到组。一栏称为UserID,另一栏称为GroupID

哪种方式最好?或者,还有更好的方法?

sql database
5个回答
10
投票

用户和组之间存在多对多关系。这需要一个单独的表来组合用户和组:

User: (UserId[PrimaryKey], UserName etc.)
Group: (GroupId[PrimaryKey], GroupName etc.)
UserInGroup: (UserId[ForeignKey], GroupId[ForeignKey])

要查找给定组中的所有用户,您只需说:

select * from User join UserInGroup on UserId Where GroupId=<the GroupId you want>

经验法则:如果您觉得需要在同一个字段中对多个值进行编码,则可能需要一个单独的表的外键。使用字节块或Unicode字符的技巧只是在一个字段中编码多个值的巧妙技巧。数据库设计不应该使用聪明的技巧 - 保存应用程序代码;-)


2
投票

我肯定会选择单独的表 - 当然是数据的最佳关系视图。如果您在UserID和GroupID上都有索引,则可以快速获取每个组的用户和每个用户的组。


1
投票

更加标准,可用和易于理解的方式是连接表。除了在大多数情况下具有合理的性能之外,它还很容易受到许多ORM的支持。如果你有理由说出一百万用户并且必须每半秒回答一次这个问题,那么只能以“聪明”的方式进入。


0
投票

我会做3张桌子。用户,组和用户组,用作交叉引用表以链接用户和组。在usersgroups表中,我将添加userId和groupId列并将它们作为主键。 BTW。有哪些命名约定可以命名这些外部参照表?


0
投票

这取决于您尝试做什么,但如果您的数据库支持它,您可以考虑使用角色。这样做的好处是数据库提供了围绕角色的安全性,您不必创建任何表。

© www.soinside.com 2019 - 2024. All rights reserved.