数据设计&效率:从所有子组中获取成员(嵌套)

时间:2016-05-21 12:28:55

标签: sql .net sql-server performance

我有2个表定义成员及其组如下:

[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组及其子女及其子女的子组ID ...

     

步骤2:SELECT * FROM成员WHERE groupID in(.....“groupIDs in step 1”....)

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

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

欢迎任何替代解决方案,如缓存。

1 个答案:

答案 0 :(得分:1)

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

  1. 你的方式。
  2. 或使用sql server advance数据类型hierarchyid
  3. 但SQL服务器并不是处理分层数据的工具,执行最简单的任务变得非常困难。

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

    用户

    UserID   UserName 
      1      User1
      2      User2
      3      User3
    

    <强>组

    GroupID   GroupName 
      1        Group1
      2        Group2
      3        Group3
    

    最后是第三个表来存储Users及其Group成员资格的数据。其中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