我即将进行的一个项目正在考虑涉及(我称之为)“抽象实体引用”的设计。这与更常见的数据模型设计大相径庭,但可能需要实现我们想要的灵活性。我想知道其他架构师是否有类似这样的系统的经验以及需要注意的地方。
该项目需要控制各种人员对各种实体(逻辑上:业务对象;物理上:数据库行)的访问。例如,我们可能想要创建如下规则:
- 用户 Alice 是 Z 公司的成员
- 用户 Bob 是 Y 组的经理,该组有用户 Charlie、Dave 和 Eve。
- 用户 Frank 可以为 [关键业务对象] X 以及 [关键业务对象组] U 中的 [关键业务对象] 输入数据。
- 用户 George 不是 T 公司的成员,但可以查看 T 公司的报告。
这个想法是我们有很多不同的安全对象、角色、组和权限,我们想要一个系统来处理这些。理想情况下,该系统一旦启动,几乎不需要对新情况进行编码;它应该非常灵活。
在“传统”数据设计中,我们可能有这样的实体/表:
- 用户
- 公司
- 用户/公司交叉引用
- 用户组
- 用户/用户组交叉引用
- CBO(“关键业务对象”)
- 用户/CBO 交叉引用
- CBO集团
- 用户/CBOGroup 交叉引用
- CBO/CBOGroup 交叉引用
- ReportAccess,这是用户和公司之间的交叉引用,专门用于访问报告
请注意大量的交叉引用表。这个系统不是很灵活,因为任何时候我们想要添加一种新的访问方式,我们都需要引入一个新的交叉引用表;这反过来又意味着额外的编码。
提议的系统让所有主要实体(用户、公司、CBO)在一个名为 Entity 的新表中引用一个值。(在代码中,我们可能会将所有这些实体作为 Entity 超类的子类)。然后有两个额外的表引用了Entity * Group,它也是一个Entity“子类”。* EntityRelation,它是任意类型(包括 Group)的两个实体之间的关系。这可能还会有某种“关系类型”字段来解释/限定关系。
这个系统,至少乍一看,看起来可以满足我们的很多要求。我们可能会在未来引入新的实体,但我们永远不需要额外的表来处理这些实体之间的分组和关系,因为 Group 和 EntityRelation 已经可以处理这些了。
但是,我担心这在实践中是否可能效果不佳。实体之间的关系将变得非常复杂,并且人们(用户和开发人员等)可能很难理解它们。而且,它们会非常递归;这将使我们依赖 SQL 的报告编写人员的工作变得更加困难。
有没有人有类似系统的经验?