首页新闻找找看学习计划

如何设计基于区域的权限系统?

0
悬赏园豆:80 [已解决问题] 解决于 2012-06-26 16:43

假如我们要设计一个大学里的招聘网站,招聘信息可以选择作用范围——校区、学校、区、市、省、全国。(注意这个地方并非是完全是父子关系,例如校区可能并不在一个区,甚至不在一个市)

当用户进入系统的时候,我们会根据其所在区域显示其可见的信息,他也可以通过选择区域来过滤信息。

目前我们的系统是这样实现的(注意SchoolZoneID、SchoolID、BoroughID、CityID、ProvinceID都是存在各自的表里面,它们是标识列,但是位数不同)

User表:

ID  Name  SchoolZoneID  SchoolID   BoroughID  CityID  ProvinceID

1   张三     200000           100000     1000          100     10

Info表:

ID  Title    RegionID

1    招聘    10000

 

当张三进入系统的时候,使用下面的语句查询其可见的信息:

SELECT *

FROM Info A

    INNER JOIN B

    ON A.RegionID=B.SchoolZoneID

         OR A.RegionID=B.SchoolID

         OR A.RegionID=B.BoroughID 

         OR A.RegionID=B.CityID 

         OR A.RegionID=B.ProvinceID

因为5个区域级别的位数不同,肯定是不会重复的,所以信息表中的RegionID直接存相应的ID就决定了其作用范围。这样很简单了,但是另一个问题就出现了:用户如何通过选择区域来过滤信息?例如:表中有三条信息的区域ID分别是200000、100000、1000,用户选择了某一个区(ID=1000),那我们应该把这三条信息都给他,因为这三条信息的作用范围都在这个区里面。

我们目前的解决方案是:建立视图,这个视图中只有两列(RegionID、ChildrenRegionID),是所有区域与其子孙区域的映射关系。当用户选择一个区域后,会使用下面的脚本进行查询:

SELECT *

FROM Info A

   INNER JOIN UV_RegionMapping B

  ON A.RegionID=B.ChildrenRegionID

WHERE B.RegionID=@SelectedRegionID

但是,这个视图比较复杂,且性能不佳,扩展性也差。

不知道各位有没有更好的设计?现在只处于设计阶段,可以任意修改、增加、删除表。

Domi.Z的主页 Domi.Z | 初学一级 | 园豆:125
提问于:2012-05-16 10:35
< >
分享
最佳答案
0

由于有校区的存在,无法完全使用编码的方法来解决。不过省、市、区、学校的关系我觉得可以使用编码的方式来设置。

但是有个问题呀。一个人是否可以存在于校区,但是不在一个学校里面呢?

为了查询方便,需要将信息数据与区域数据进行查询后,做到临时表中进行保存,用户访问的时候,直接通过临时表查询。否则一旦数据量很大的时候,视图也是很慢的。

收获园豆:80
迷路中的路人甲 | 初学一级 |园豆:93 | 2012-05-16 16:28

设计时,是否可以指定某种规则,并通过程序强制用户实施。

要看到本质,不要只局限在表面、地区上,抓住背后的本质。

如题,数据不是孤立的,是有相互依赖关系的。既然,管理者看到信息后,明白数据相互之间的关系,那一定可以实现的。

例如所说的校区问题。如果两个校区(不在同一城市)权限是一样的,那应存在某种标识,说明是校区。

结合多种条件,设计一个规则,让用户取履行,在数据库中保存。

lucika.zh | 园豆:57 (初学一级) | 2012-05-17 07:45
其他回答(3)
0

学习参观!

无之无 | 园豆:5085 (大侠五级) | 2012-05-16 11:00
0

比较方便的是通过编码来实现。通过编码长度来实现级别划分。如,一级100,二级100100等规则

lucika.zh | 园豆:57 (初学一级) | 2012-05-16 16:14
0

学习学习····

无敌小鸟 | 园豆:246 (菜鸟二级) | 2013-08-07 15:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册