日期:2014-05-16  浏览次数:21119 次

关于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多了 确实索引无效 但这和直接连表效果一样