代码之家  ›  专栏  ›  技术社区  ›  Vincent McNabb

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

  •  3
  • Vincent McNabb  · 技术社区  · 16 年前

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

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

    另一种方法是创建一个单独的表,将用户链接到组。一列调用 UserID 还有一个叫 群氓 .

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

    5 回复  |  直到 16 年前
        1
  •  10
  •   Tom H zenazn    14 年前

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

    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
  •  2
  •   Nick Pierpoint    16 年前

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

        3
  •  1
  •   Vinko Vrsalovic    16 年前

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

        4
  •  0
  •   Jonathan Sampson    16 年前

    我要做三张桌子。用户、组和用户组,用作链接用户和组的交叉引用表。在usersgroups表中,我将添加userid和groupid列,并将它们作为主键。顺便问一下,命名这些外部参照表有哪些命名约定?

        5
  •  0
  •   AJ.    16 年前

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