【问题标题】:how to store list of numbers to database如何将数字列表存储到数据库
【发布时间】:2011-09-10 12:25:47
【问题描述】:

您好,我正在尝试将组、子组和用户信息存储在数据库 (SQLite) 中。一个组可以有多个子组,用户可以属于多个组/子组,如下所示。

  • 第 1 组具有子组 a、b、c 和用户 A、B。
  • 第 2 组具有子组 d、e 和用户 B、C、D。
  • 子组 d 有用户 B,D,属于组 2。
  • 用户 B 属于组 1,2 和子组 a,c,d。

应该可以按组、子组或用户进行搜索。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    下表结构做了以下假设:

    1. 子组对于每个组都是唯一且不同的,并且不同于实际的组(一对多关系,并且组不能用作子组)。
    2. 用户必须是至少一个子组的成员才能加入组

      组表 组 ID (PK) 组名

      子组表 子组 ID (PK) GroupID(GroupTable.GroupID 上的 FK) 子组名

      用户表 用户 ID (PK) 用户名

    现在,创建一个多对多关系表,在一个或多个子组中建立用户参与:

    User_Sub_Groups
        UserID (FK on UserTable.UserID)
        SubGroupID (FK on SubGroupTable.SubGroupID)
    

    如果组也可以是子组,那么 nulvinge 提供的示例是一种选择,尽管我会稍有不同:

    GroupTable
        GroupID (PK)
        GroupName
    
    UserTable
        UserID (PK)
        UserName
    
    SubGroupTable
        ParentGroupID (Composite Key on GroupsTable.GroupID)
        SubGroupID (Composite Key on GroupsTable.GroupID)
    
    UserGroupsTable
        UserID (Composite Key on UserTable.UserID)
        GroupID (Composite Key on GroupsTable.GroupID)
    

    从这里,您只需使用各个表之间的 JOIN 来执行您的搜索。例如,返回属于某个组的所有用户:

    SELECT     
        tblUser_Group.GroupID, tblUser.*
    FROM         
        tblUser_Group 
    INNER JOIN  
        tblUser ON tblUser_Group.UserID = tblUser.UserID
    WHERE 
        tblUserGroup.GroupID = @GroupID
    

    返回特定用户所属的所有子组:

    SELECT    
        tblGroup.GroupName AS SubGroupName
    FROM         
        tblUser_Group AS UG 
    INNER JOIN
        tblUser ON UG.UserID = tblUser.UserID INNER JOIN
        tblGroup_SubGroup AS GSG ON UG.GroupID = GSG.SubGroupID INNER JOIN
        tblGroup ON GSG.SubGroupID = tblGroup.GroupID
    WHERE     
        tblUser.UserID = 1
    

    等等。一开始考虑各种 JOIN 排列可能具有挑战性,但这是一种非常灵活且可扩展的排列。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      我会这样做:

      Group:
        id
        NULL overgroup_id
      
      Membership:
        user_id
        group_id    
      
      User:
        id
      

      具有 overgroup_id = NULL 的组是一个组,否则它是一个子组。

      要查找具有 id gid 和子组的组中的所有 users_id:

      select user_id
      from Membership
      where group_id=gid
      or group_id in
          (select group.id from Group where overgoup_id=gid)
      

      【讨论】:

        猜你喜欢
        • 2012-07-17
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2011-01-19
        • 2013-05-14
        • 2012-06-30
        相关资源
        最近更新 更多