【问题标题】:how do i avoid a circular relationship in my class diagram如何在我的类图中避免循环关系
【发布时间】:2014-05-18 06:55:31
【问题描述】:

您好,我对我的数据库设计所面临的一些循环关系有疑问。我读了一些类似的问题,但无法解决我的问题,所以这是我的类图:

这是逻辑:

  • 文档属于DocumentType(发票、订单、..)
  • 一个 documentField ( date , address , nameClient , ... ) 属于一个 documentType (每个 documentType 都有其适当的字段
  • FieldValue 是 documentfield 的值,将保存在它属于 document 和 documentField 的数据库中,the value should be saved according to the fieldType ( date , char , long , double... )

但是,从数据库架构师的角度来看,这种循环关系是不正确的,因为它会导致完整性问题:

如果您知道如何处理此问题,欢迎发表评论。

提前感谢您的帮助。

【问题讨论】:

  • 你能提供一些关于“完整性问题”的具体例子吗?据我所见,如果您不对Document 施加1..* 基数限制,您的生活可能会更轻松。为什么不允许(还)没有实例的文档类型?
  • 在这种情况下我可以用什么基数替换 1..* 基数?
  • 1..* 是一个错误,它在 documentType 和 Document 之间是 0..* 而不是 1..*

标签: uml relationship circular-dependency class-diagram


【解决方案1】:

这里的情况比您的其他类似问题更简单。很明显,底部的两个类描述了抽象的文档结构,而顶部的两个类描述了具体的文档

抽象元素永远不应该依赖于具体的元素,所以只需使两个垂直关联单向并将它们指向抽象类。这将巧妙地打破循环依赖。

另外,我会进一步完善你的模型:

  • Document 和 FieldValue 之间的关联应该是一个组合
  • 应将一些较低的多重性更改为 0(而不是 1),以使您的模型实例化更加灵活(例如 - 为什么不允许没有 DocumentFields 的 Document?很明显,您迟早会添加一些字段,但您可以先创建一个空文档并保存)

更新:

【讨论】:

  • 你是说我应该将 FieldValue 与 DocumentField 和 Document 与 DocumentType 相关联吗?具有单向关联并保持 DocumentField 和 DocumentType 之间的关联?
  • 请查看更新。我会考虑将类 DocumentField 重命名为 FieldType,这将使情况以及定义(类型)和实例之间的分离更加清晰。
  • 我已经有一个包含字段类型的类 FieldType 例如:字段日期有一个字段类型:日期,字段地址有一个字段类型字符串等
【解决方案2】:

我实际上看不出你建模的目的。在我看来,您将元元素(DocumentType 和 DocumentField)与元元素的建模元素实例(Document 和 FieldValue)混合在一起。

Document-->DocumentType 关系的语义是什么?是“isA”关系吗?如果是这样,为什么不使用扩展/泛化(继承)或接口实现(实现)?

为什么需要逆向关系DocumentType-->Document?如果你能避免它,你就不会有循环关系。

[更新] 为什么不重命名 AbstractDocument 中的 DocumentType 并使其成为抽象类。 然后用扩展替换从 Document 到 DocumentType 的关联(泛化) 最后创建一个从 AbstractDocument 到自身的 1..* 关联

[更新2] 还要考虑根据您的解释,从 Document 到 DocumentType 的关联具有不同的语义,因此与从 DocumentType 到 Document 的关联不同(另一个关联)

【讨论】:

  • 文档有一个类型,我们可以处理发票、订单等...,我需要一个反向关系,因为文档类型可以有很多文档:例如:类型invoice 有很多发票作为文档保存在数据库中
  • 问题仅出在 documentType 和 document 上?我想也许 FieldValue 是问题
  • 我认为我对 AbstractDocument 的建议更优雅,为什么需要 FieldValue->Document 关系?
  • 因为一个文档有它正确的 fieldValues ,对于每个文档我们可以在 FieldValue 表中找到它的值
  • 我不明白 document 到 documentType 的关系如何有不同的语义,一个文档有一个类型,而一个 documentTYpe 有很多文档
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2021-10-23
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多