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

时间:2020-03-06 14:20:48  来源:igfitidea点击:

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

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

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

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

解决方案

联接表是更标准,可用和可理解的方式。除了在大多数情况下具有合理的性能外,许多ORM都容易地支持它。仅当我们有理由(例如,一百万用户)并且不得不每半秒钟回答一次该问题时,才以"明智"的方式输入。

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

我们在用户和组之间具有多对多关系。这需要一个单独的表来将用户与组组合:

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字符的技巧只是在一个字段中编码多个值的巧妙技巧。数据库设计不应使用巧妙的技巧将其保存为应用程序代码;-)

我要打3张桌子。用户,组和用户组,用作交叉引用表以链接用户和组。在usersgroups表中,我将添加userId和groupId列,并将它们作为主键。顺便提一句。有哪些命名约定来命名这些外部参照表?

这取决于我们要执行的操作,但是如果数据库支持,则可以考虑使用角色。这样做的好处是数据库提供了围绕角色的安全性,我们不必创建任何表。