在用户可以属于多个组的应用程序中,我目前将他们的组存储在名为groups
的列中作为二进制文件。每四个字节是一个32位整数,即GroupID
。但是,这意味着要枚举组中的所有用户,我必须以编程方式选择所有用户,并手动查明它们是否包含该组。
另一种方法是使用unicode字符串,其中每个字符都是表示组的整数,这使搜索变得容易,但有点软糊涂。
另一种方法是创建一个单独的表,将用户链接到组。一列名为UserID
,另一列名为GroupID
。
哪种方式最适合这样做?或者有更好的方法吗?
答案 0 :(得分: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字符的技巧只是在一个字段中编码多个值的巧妙技巧。数据库设计不应该使用聪明的技巧 - 保存应用程序代码; - )
答案 1 :(得分:2)
我肯定会选择单独的表 - 当然是数据的最佳关系视图。如果您在UserID和GroupID上都有索引,则可以快速获取每个组的用户和每个用户的组。
答案 2 :(得分:1)
更加标准,可用和易于理解的方式是连接表。除了在大多数情况下具有合理的性能之外,它还很容易受到许多ORM的支持。如果你有理由说出一百万用户并且每半秒都要回答这个问题,那么只能以“聪明”的方式进入。
答案 3 :(得分:0)
我会制作3张桌子。用户,组和用户组,用作交叉引用表以链接用户和组。在usersgroups表中,我将添加userId和groupId列并将它们作为主键。 BTW。有哪些命名约定来命名这些外部参照表?
答案 4 :(得分:0)
这取决于您尝试做什么,但如果您的数据库支持它,您可以考虑使用角色。这样做的好处是数据库提供了围绕角色的安全性,您不必创建任何表。