这样能好些吧
产品表(Product) ProductID,ProductName,Category
人员表 人员ID,name,... 人员ID是唯一的
产品权限表 人员ID,Category ... 人员ID和Category是唯一的
select 产品表.ProductID,产品表.ProductName,产品表.Category
from 产品表 inner join 产品权限表 on 产品表.Category=产品权限表.Category
inner join 人员表 on 产品权限表.人员ID=人员表.人员ID
产品表(Product) ProductID,ProductName,Category
人员表 人员ID,name,... 人员ID是唯一的
产品权限表 人员ID,Category ... 人员ID和Category是唯一的
select 产品表.ProductID,产品表.ProductName,产品表.Category
from 产品表 inner join 产品权限表 on 产品表.Category=产品权限表.Category
inner join 人员表 on 产品权限表.人员ID=人员表.人员ID
产品表(Product) ProductID,ProductName
角色表 RoleID,RoleName (primary key[RoleID])
角色权限表 RoleID,ProductID (primary key[RoleID,ProductID],并与产品表建立级联关系)
人员表 RoleID,人员ID,name,... 人员ID是唯一的
产品表(Product) ProductID,ProductName,Category
人员表 人员ID,name,... 人员ID是唯一的
产品权限表 人员ID,Category ... 人员ID和Category是唯一的
select 产品表.ProductID,产品表.ProductName,产品表.Category
from 产品表 inner join 产品权限表 on 产品表.Category=产品权限表.Category
inner join 人员表 on 产品权限表.人员ID=人员表.人员ID1、似乎也只能如此了,但可以改进;
2、注意加索引来提高查询的效率,应该是组合索引。
3、以上可以改进,将inner join 的方式改为in (子查询的方式 )。即:
select * from 产品表 where 产品表.Category in (select Category from 产品权限表 where userId = @userId )
如果考虑到系统的灵活性,精确到类有点不适合,当产品类没有按权限归类时将会带来麻烦。
更妥当的是精确到每个产品, 精确到基本事实,这样有利于系统的扩展。
举个例子,按照上述做法,一般情况下前台都会使用 select * from 产品表 where 产品表.Category in (select Category from 产品权限表 where userId = @userId )
一旦这个规则不能满足用户的要求,产品表是最基本的表,引用的地方较多,将会给程序改动带来不便。如果精确到每个产品,那么就会变成select * from 产品表 where 产品表.产品ID in (select 产品ID from 产品权限表 where userId = @userId ) 那么我们可以把产品权限表当作中间层,通过上述权限规则生成这个表,假如规则发生改变,只要把生成算法修改即可,对程序不会带来影响。这是根据分层思想得出。它可以应用到操作权限、员工档案权限控制,像员工档案权限,有些企业控制到部门,有些企业控制到等级,有些企业控制到员工类型等,还有一些我们没有想到的,因为我们控制到个人是比较妥当的做法,因为没有比这更细的了。以不变应万变。