Lipido 的想法很好,但不幸的是,提议的解决方案有一个明显轻微但重要的缺陷,并且不涵盖您的第三个要求:角色可能存在并且不受任何用户文档关系的影响。建模为关联类,角色只能作为用户和文档对象之间的链接实例存在。在这个解决方案中,一个角色不能被定义为一个独立的实例!此外,它不允许角色重用。
在这里,您有两种解决方案可以解决此问题。您应该根据附加条件在其中选择(见注释):
- 所有 3 个概念(用户、文档、角色)相互独立存在,可以自由独立地创建和查询
- “访问”的新概念模拟了用户在特定文档的上下文中具有角色(或多个角色)的事实。有两种方法可以对 Access 进行建模,具体取决于它是否应该有更多自己的属性(参见图表)。访问作为一个独立的类允许重用角色。在这两种解决方案中,Access 恰好有 1 个文档、1 个用户和 1 个或多个角色。
- 用户可以对他有权访问的每个文档拥有 1 个或多个角色
- 所有可能的查询都是可能的 - getAllUsers、getAllDocuments、gettAllRoles、getUsersRoles(Document)、getRoles(User, Document) 和类似的。
更新(评论后)
这是一个解释对象运行时结构的对象图(它基于第二个类图,具有关联类而不是 n-ry 关联):
请参阅评论中的注释。并不是说 Access 实例既是类又是关联实例(链接)。这就是为什么它总是有两个关联类的单个实例,在这种情况下只有一个角色。另一方面,每个用户都可以访问多个文档 (0.. ),并且每个文档可以被 0 个或多个用户 (0.. ) 访问。