我将从建模的角度考虑这个问题。
只要您不添加实际上不存在的任何关系,就可以保证安全。如果确实添加它们,则数据的完整性会降低(因为存在冗余),并且代码耦合度会更高。
具体来说,使用循环引用时,除了一个-自引用,我还没有看到实际上需要它们的情况。如果您对树或图形进行建模,则需要这样做,因为从代码质量的角度来看,自引用是无害的(没有添加依赖项),因此完全可以。
我相信,当您开始需要非自我参考时,应立即询问是否不能将其建模为图形(将多个实体折叠成一个节点)。也许您之间有一个循环参考,但是将其建模为图形是不合适的,但我对此表示高度怀疑。
人们认为他们需要一个循环参考,但实际上并不需要。最常见的情况是“一对多情况”。例如,您有一个具有多个地址的客户,应将其中的一个地址标记为主要地址。将这种情况建模为两个独立的关系has_address和is_primary_address_of很诱人,但这是不正确的。原因是作为主要地址不是用户和地址之间的单独关系,而是它是具有地址的关系的属性。这是为什么?因为其域仅限于用户的地址,而不是那里的所有地址。您选择一个链接并将其标记为最强(主要)。
(现在要谈论数据库)许多人选择双向关系解决方案,因为他们理解“主”是唯一的指针,而外键则是一种指针。因此,外键应该是要使用的东西,对吗?错误。外键表示关系,但“主”不是关系。这是排序的退化情况,其中一个元素高于所有元素,其余元素不排序。如果您需要对总订购进行建模,那么您当然会将其视为关系的属性,因为基本上没有其他选择。但是,当您退化它时,有一种选择和一个非常可怕的选择-将非关系模型化为关系模型。因此,关系冗余无疑是不容小under的。
因此,除非绝对清楚它来自我正在建模的事物,否则我不允许循环引用。
(注意:这与数据库设计略有偏差,但是我敢打赌它也同样适用于其他领域)