我如何在类图中避免循环关系

时间:2014-05-18 06:55:32

标签: uml relationship circular-dependency class-diagram

您好我对我在数据库设计中遇到的一些循环关系有疑问。我读了几个类似的问题,但无法解决我的问题,所以这是我的类图: enter image description here

这是逻辑:

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

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

如果你有任何想法如何解决这个问题,欢迎发表评论。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

此外,我会进一步完善您的模型:

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

<强>更新

enter image description here

答案 1 :(得分:0)

我实际上无法看到您的建模目标。在我看来,你将元元素(DocumentType和DocumentField)与元元素的构建元素实例(Document和FieldValue)混合。

Document的语义是什么 - &gt; DocumentType关系?它是一个&#34; isA&#34;关系?如果是这样,为什么不使用扩展/泛化(继承)或接口实现(实现)?

为什么需要反向关系DocumentType - &gt; Document?如果你可以避免它,你就不会有循环关系。

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

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