我有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组,如果请求的组是顶级节点,则它有数千个子组,查询可能会变得非常慢。
有没有更好的方法为成员组关系重新设计这些表结构并使我的查询运行得更快?
欢迎任何替代解决方案,如缓存。
答案 0 :(得分:1)
即使您可以在sql server中存储分层数据
hierarchyid
。但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