如何将数字列表存储到数据库

时间:2011-09-10 12:25:47

标签: database database-design

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

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

它应该能够按组,子组或用户进行搜索。

2 个答案:

答案 0 :(得分:0)

我就是这样做的:

Group:
  id
  NULL overgroup_id

Membership:
  user_id
  group_id    

User:
  id

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

要查找ID为gid且包含子组的组中的所有users_ids:

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

答案 1 :(得分:0)

下表结构做出以下假设:

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

    grouptable将     GroupID(PK)     组名

    SubGroupTable     SubGroupID(PK)     GroupID(GroupTable.GroupID上的FK)     SubGroupName

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

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

    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排列可能很有挑战性,但这是一种非常灵活和可扩展的安排。

    希望有所帮助!