1

我有一个包含角色的表。许多用户可以分配给一个角色。可以将权限分配给一个角色,将权限授予该角色的所有用户。

当我为拥有 50000 人的角色分配权限时,我实际上创建了 500 个权限分配。

对于分配给角色的每个权限,我指定了一个复杂的计算,在确定每个具有该角色的个人具有何种类型的权限访问时必须进行该计算。例如,如果我将“READ_EMAIL”权限分配给“ACCOUNTANT”角色,那么在我这样做时,我还包含一个变量,该变量指定允许哪些邮箱类型,因为有多种邮箱类型并且会计师应该只有访问其中的某个组。

因此,当我想找出哪些人可以访问哪些特定邮箱时,我不仅要加入我的权限、角色和用户表,而且我需要进行查找,因为在空间中难以解释的原因是时间消耗并且不能更快。

我遇到的问题是,当我在视图中公开所有计算的权限分配(加入所有这些表 + 进行复杂、耗时的计算)时,需要很长时间。

我突然想到,我可以简单地创建一个用户角色权限表,该表是通过将用户分配给角色或通过将权限分配给角色来激活的触发器来填充的。每当将权限分配给角色时,它都会为每个具有该角色的个人插入一条记录,并在那时进行复杂的查找,将 500 条记录放入该表中。每当将用户分配给角色时,它都会生成任何权限+复杂的查找。从这个表到角色分配表和权限分配表会有外键,并带有级联删除。

角色分配的权限很少见,所以如果速度大大减慢也没关系。对我的表的 99.99999% 的访问是 SELECT。

这种方法有什么缺点吗?我需要实时数据。我只是在设计自己的提交物化视图吗?还有其他建议吗?

4

1 回答 1

2

听起来您确实在设计自己的提交物化视图。您是否有理由不能在此处仅使用提交时物化视图来缓存结果?

刷新物化视图的失败将导致事务的提交操作失败,这将强制回滚。因此,数据和物化视图实际上不可能不同步。基于触发器的解决方案更有可能最终出现错误(特别是如果同时在多个会话中进行更改)。我宁愿把同步逻辑的编写留给 Oracle。

于 2010-10-05T14:21:39.433 回答