【问题标题】:What is the best way to add users to multiple groups in a database?将用户添加到数据库中的多个组的最佳方法是什么?
【发布时间】:2008-09-18 11:10:40
【问题描述】:

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

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

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

以下哪种方式最好?还是有更好的办法?

【问题讨论】:

    标签: sql database


    【解决方案1】:

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

    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 上都有索引,则可以快速获取每个组的用户和每个用户的组。

      【讨论】:

        【解决方案3】:

        更标准、更实用、更易理解的方式是连接表。除了在大多数情况下具有合理的性能外,它还很容易得到许多 ORM 的支持。只有在你有理由的情况下才以“聪明”的方式输入,比如一百万用户并且必须每半秒回答一次这个问题。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-12-17
              • 1970-01-01
              • 2019-03-14
              • 1970-01-01
              • 1970-01-01
              • 2011-03-09
              • 2012-05-26
              相关资源
              最近更新 更多