Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何将数字列表存储到数据库_Database_Database Design - Fatal编程技术网

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

Database 如何将数字列表存储到数据库,database,database-design,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 它应该能够按组、子组或用户进行搜索。我会这样做: Group: id NULL overgroup_id Membership: user_id group_id User: id overgroup_i

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

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

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

我会这样做:

Group:
  id
  NULL overgroup_id

Membership:
  user_id
  group_id    

User:
  id
overgroup_id=NULL的组是一个组,否则它是一个子组

要查找id为gid的组中所有用户的id,请执行以下操作:

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

下表结构作出以下假设:

  • 子组对于每个组都是唯一和不同的,并且与实际组不同(一对多关系,组不能用作子组)
  • 用户必须是至少一个子组的成员才能参与组

    分组表 群组ID(PK) 组名

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

    用户表 用户标识(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)
    
    从这里开始,您只需使用不同表之间的联接来执行搜索。例如,要返回属于某个组的所有用户:

    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
    
    等等。一开始考虑各种连接排列可能会很有挑战性,但这是一种非常灵活和可伸缩的安排

    希望有帮助