Sql 数据设计与分析;效率:从所有子组(嵌套)获取成员

Sql 数据设计与分析;效率:从所有子组(嵌套)获取成员,sql,.net,sql-server,performance,Sql,.net,Sql Server,Performance,我有两个表,它们定义了成员及其组,如下所示: [Table member] memberID | groupID 1 | 101 2 | 104 ... | ... [Table group] groupID | parentID 1 | NULL 101 | 1 102 | 1 103 | 101 104 | 103 ... | ... 在我的页面中,如果我想获取特定组(包括其子组)中的所有成员,例如

我有两个表,它们定义了成员及其组,如下所示:

[Table member]
memberID | groupID
1        | 101
2        | 104
...      | ...

[Table group]
groupID | parentID
1       | NULL
101     | 1
102     | 1
103     | 101
104     | 103
...     | ...
在我的页面中,如果我想获取特定组(包括其子组)中的所有成员,例如获取组1中的所有成员,我必须:

步骤1:获取组1及其子级及其子级的GroupID,然后

步骤2:从groupID所在的成员中选择*(……“步骤1中抓取的groupID”。…)

在我的数据库中,每个表中包含大约300万个成员和50K个组,如果请求的组是顶级节点,它有数千个子组,查询可能会变得非常慢。

有没有更好的方法为成员组关系重新设计这些表结构并使查询运行得更快


也欢迎使用缓存等替代解决方案。

即使您可以在sql server中存储分层数据

  • 就像你做的那样
  • 或者使用sql server高级数据类型
  • 但是SQLServer并不是一个真正的处理分层数据的工具,而且很难完成最简单的任务

    在您的情况下,最好的选择是为用户和组提供两个单独的表,例如

    用户

    UserID   UserName 
      1      User1
      2      User2
      3      User3
    
    GroupID   GroupName 
      1        Group1
      2        Group2
      3        Group3
    

    UserID   UserName 
      1      User1
      2      User2
      3      User3
    
    GroupID   GroupName 
      1        Group1
      2        Group2
      3        Group3
    
    最后是第三个表,用于存储
    用户
    及其
    成员的数据。其中
    UserID
    列引用返回到
    User
    表和
    GroupID
    列引用返回到
    Group

    用户组

    UserID    GroupID
      1          1
      1          2
      2          1
      2          2
      2          3
      3          3
    
    因此,您的表最终将具有以下关系

    User    -->   One to Many   --> UserGroup 
    
    Groups  -->   One to Many   --> UserGroup
    
                                   /------->  User    
    UserGroup --> Many to Many  --/
                                  \
                                   \-------> Groups  
    

    如果获取子组树的性能是主要问题,请查看树的嵌套集模型。修改一棵树需要付出更多的努力,但查询速度非常快。