关于crm客户管理权限的问题
业务需求是
1、销售员可以看见自己的客户
2、团队经理可以看见自己团队下所有销售员的客户
3、销售部的老总可以看见整个销售部门所有团队销售员的的客户
4、总经理看到所有的
最初这个东西,是08年做的
我当时是这样设计的
dept 部门表
user 人员表
cust 客户表
range范围权限表
range存储的是每个帐户拥有哪个部门的权限,两个字段
uid 员工id
ranges varchar(255)
如是普通人员则是空,
部门经理存部门表ID(5),或者有的部门经理管理两个部门(4,5)
老总们存(1,2,3,4,5)这样的部门ID标识
这样,在登陆时候,我就把每个人,主要是针对管理人员的所有部门权限ID,查出来,然后再对应查出来每个部门下的员工ID
放到session中,
如果$_SESSION['login']['user_ranges'] = '2,3,4,5,6,7';都是销售员的uid
在客户列表页面,cust表中,有uid标识这个客户的所属销售员
因此,经理们的列表的语句都是
select * from cust where uid in ($_SESSION['login']['user_ranges'])
最初数据量少,没感觉到什么
现在数据量大了起来,cust表近百万了,公司的销售员使用crm人数也有近400个,
公司权利较大的几个总查看列表时,那个条件,my god
uid in (300多个员工id)
速度明显慢了下来
有高手说in多的话,索引已经无效了,最好不要这样用in,直接连表都比这个强
当时我想着那么就连吧
select * from cust where uid in ($_SESSION['login']['user_ranges'])
这个语句是为了描述简单这样写的,但是实际项目中,因其他业务此语句已经关联了5个表
如果把权限也连上,要再加上4个表,晕,难道以后每要看列表权限都要关联近10个表么
请教这种情况该怎么个设计,求思路
另外,其他的这种oa,crm系统,他们的权限是如何设计的?
------解决方案--------------------
用IN应该没有问题,你uid 的索引创建了吗?
------解决方案--------------------in多了 确实索引无效 但这和直接连表效果一样