假如我们要设计一个大学里的招聘网站,招聘信息可以选择作用范围——校区、学校、区、市、省、全国。(注意这个地方并非是完全是父子关系,例如校区可能并不在一个区,甚至不在一个市)
当用户进入系统的时候,我们会根据其所在区域显示其可见的信息,他也可以通过选择区域来过滤信息。
目前我们的系统是这样实现的(注意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
但是,这个视图比较复杂,且性能不佳,扩展性也差。
不知道各位有没有更好的设计?现在只处于设计阶段,可以任意修改、增加、删除表。
由于有校区的存在,无法完全使用编码的方法来解决。不过省、市、区、学校的关系我觉得可以使用编码的方式来设置。
但是有个问题呀。一个人是否可以存在于校区,但是不在一个学校里面呢?
为了查询方便,需要将信息数据与区域数据进行查询后,做到临时表中进行保存,用户访问的时候,直接通过临时表查询。否则一旦数据量很大的时候,视图也是很慢的。
设计时,是否可以指定某种规则,并通过程序强制用户实施。
要看到本质,不要只局限在表面、地区上,抓住背后的本质。
如题,数据不是孤立的,是有相互依赖关系的。既然,管理者看到信息后,明白数据相互之间的关系,那一定可以实现的。
例如所说的校区问题。如果两个校区(不在同一城市)权限是一样的,那应存在某种标识,说明是校区。
结合多种条件,设计一个规则,让用户取履行,在数据库中保存。
学习参观!
比较方便的是通过编码来实现。通过编码长度来实现级别划分。如,一级100,二级100100等规则
学习学习····