2011-08-20 42 views
0

我有一个组的树/层次结构和一个项目的SQL表,每个与一个组关联(即每个项目属于一个组)。我只需要选择与给定组或下面的组关联的行。根据分级权限选择行

例如。说这是组树:

A 
=> B 
    => D 
=> C 
    => E 
    => F 

A组选择项目将返回所有行,而选择了C组将选择在C,E和F(C的后裔),属于项目。

到目前为止,我想我可以通过以下两种方式之一实现这一点:

1.在列表

SELECT * FROM table WERE Group in ('C','E','F') 

编程确定后代的列表查询

前2. BITWISE运营商

SELECT * FROM table WHERE GroupBitMask & 52!=0 

(ie。按位'C'+'E'+'F'==位3 +位5 +位6 == 110100 == 52)

再次,这52将需要通过解析组树。 我想我可以强制限制最多64组。并为此使用64位掩码。

我不确定数据库是否会为此使用索引,或者只是扫描所有行以确定按位结果?

是否有任何其他(更好?)选择我需要的行的方法?

回答

1

一个简单的解决方案是将祖先存储为行的一部分:

Group  Path Other columns 
A   A  ... 
B   AB  ... 
C   AC  ... 
D   ABD  ... 
E   ACE  ... 
F   ACF  ... 

可以检索与单个查询的基本路径:

select Path from YourTable where Group = 'C' 

然后你就可以查询像所有的后代:

select * from YourTable where path like 'AC%' 

这表现非常好,主键(Group)(Path)上的索引。