【发布时间】:2014-06-03 03:59:44
【问题描述】:
我正在为一家商业公司构建一个应用程序,他们需要控制谁可以按项目和角色查看哪些报告,该报告可以属于一个项目,并且可以由多个角色(员工角色)查看。
因此,当提交报告时,它会被标记为项目和角色,例如 "project1" 和 {"manager","seller"} ,例如,从事 project1 工作并且是经理的员工可以看到此报告。
我现在的做法很大程度上取决于数组,这就是我所拥有的:
报表:
项目(字符串)
角色(字符串数组)
员工表:
项目(字符串数组)//员工工作/从事的所有项目
角色(字符串数组)//员工可以有多个角色
在查询员工可以看到的报告时,我会这样做:
select *
from reports
WHERE (employee.roles && report.roles) AND (report.project = ANY (employee.projects))
我用的是postgresql
问题是我认为这不会有很好的表现(我不确定)
我知道加快此查询的唯一方法是在报告(角色)列上创建 GIN 索引,以使重叠更快
除了性能这个技巧here,只是让我担心:
提示:数组不是集合;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用一个单独的表,其中每个项目将是一个数组元素。这将更容易搜索,并且对于大量元素可能会更好地扩展。
那么有没有更好的设计来做到这一点,或者这样就可以正常工作?
【问题讨论】:
标签: sql arrays database postgresql database-design