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中存储分层数据
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
如果获取子组树的性能是主要问题,请查看树的嵌套集模型。修改一棵树需要付出更多的努力,但查询速度非常快。