这样能好些吧
产品表(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

解决方案 »

  1.   

    --如果产品比较多的情况,且更新比较频繁可加一个角色表来设置
    产品表(Product) ProductID,ProductName
    角色表     RoleID,RoleName   (primary key[RoleID])
    角色权限表  RoleID,ProductID (primary key[RoleID,ProductID],并与产品表建立级联关系)
    人员表      RoleID,人员ID,name,...          人员ID是唯一的
      

  2.   


    产品表(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 )
      

  3.   

    一般是按照上述做法。
    如果考虑到系统的灵活性,精确到类有点不适合,当产品类没有按权限归类时将会带来麻烦。
    更妥当的是精确到每个产品, 精确到基本事实,这样有利于系统的扩展。
    举个例子,按照上述做法,一般情况下前台都会使用 select * from 产品表 where 产品表.Category  in (select Category from 产品权限表 where userId = @userId )
    一旦这个规则不能满足用户的要求,产品表是最基本的表,引用的地方较多,将会给程序改动带来不便。如果精确到每个产品,那么就会变成select * from 产品表 where 产品表.产品ID in (select 产品ID from 产品权限表 where userId = @userId ) 那么我们可以把产品权限表当作中间层,通过上述权限规则生成这个表,假如规则发生改变,只要把生成算法修改即可,对程序不会带来影响。这是根据分层思想得出。它可以应用到操作权限、员工档案权限控制,像员工档案权限,有些企业控制到部门,有些企业控制到等级,有些企业控制到员工类型等,还有一些我们没有想到的,因为我们控制到个人是比较妥当的做法,因为没有比这更细的了。以不变应万变。
      

  4.   

    不管怎么样 先在 Category 上加索引再说