领域模型定义关系

Domain model defining relationships

假设每个人都有权进行CRUD操作(每个人都是管理员类型的用户)。我已经在域图中显示了用户可以执行的 CRUD 操作,但是它变得非常混乱。我很好奇是否可以接受下图中所示的替代方法,因为乘法关系对于每个操作(创建、编辑、删除)

保持不变

分离的 CRUD

替代方法? (创建、编辑、删除)

简而言之

如果它变得凌乱,它可能缺乏关注点分离,或者代表并不真正需要的关联。

更多解释

需要关联吗?

UserXxx 之间的关联意味着两个 class 之间的 semantic relationship。这意味着 classes 的实例是 linked 而不仅仅是在操作时。所以 x 将能够找到更新它的 User(s),并且 u 会知道它更新的 Xxx 个实例。如果你想要一些审计线索,这种关联是有意义的,但这似乎不是你的目的。

换句话说,User 可能会执行一些 Xxx 的 CRUD 实例的操作这一事实不足以证明关联的合理性。

如果需要,是否代表你的想法?

现在看来您的关联是 can ...,即某种授权方案。您的图表表明每个用户都需要提前知道它可以更新的所有 Xxx。这是一个沉重的负担。这也意味着用户需要知道它可以创建的所有 Xxx;在它们被创建之前?这看起来有点不一致。

建模授权方案

如果您想设计一个授权系统,您可能不会 link 用户直接访问该对象,而是使用一些中介机制:

  • 为了表示用户可以创建新项目,您可能需要一些授权对象来说明可以创建的项目的特征。
  • 为了表示用户可以编辑、更新、删除项目,您可以像您设想的那样直接关联,如果某些管理员会维护此类授权。
  • 但您可能会有一些授权对象来告诉用户可以做什么(例如,用户“角色”/“配置文件”)以及项目的类别。
  • 同样可能存在一些管理 CRUD 授权的规则(例如,具有“编辑”角色的用户可以编辑分配给 he/she 的项目,但不能编辑其他项目)。使用此类规则而不是明确设计(冗余)授权可以为您节省大量不必要的额外关联(以及使授权与规则保持一致的额外约束)。

关注点分离

为了让事情继续变得混乱,你应该考虑:

  • 在您的模型中有一个单独的授权概念图
  • 使用一些通用的 CRUD 界面:然后用户将与 CRUD 界面相关联,而不必为每个可能的 class.
  • 复制所有内容

您的两个 class 模型的主要问题是 type/instance 级别之间的混淆。您的“可以 create/edit/delete”授权关系在特定用户和特定 对象CompanyProjectTicket),而是在特定用户和特定 对象类型 CompanyProjectTicket)之间,因此它不是两个普通对象类型之间的普通关联。

如果你想 describe/define 这种与 class 模型的授权关系,你需要定义一个像 ObjectType 这样的元 class 并表达你的对象类型(CompanyProjectTicket)是它的实例。