Tomaré esta pregunta desde el punto de vista del modelado.
Mientras no agregues ninguna relación que no esté realmente allí, estás a salvo. Si los agrega, obtendrá menos integridad en los datos (porque existe una redundancia) y un código más estrechamente acoplado.
El problema con las referencias circulares específicamente es que no he visto un caso en el que realmente se necesiten, excepto una: la propia referencia. Si modela árboles o gráficos, necesita eso y está perfectamente bien porque la auto-referencia es inofensiva desde el punto de vista de la calidad del código (no se agrega dependencia).
Creo que en el momento en que comienza a necesitar una referencia no automática, inmediatamente debe preguntar si no puede modelarla como un gráfico (contraiga las múltiples entidades en un nodo). Quizás haya un caso intermedio en el que se haga una referencia circular, pero modelarlo como gráfico no es apropiado, pero lo dudo mucho.
Existe el peligro de que las personas piensen que necesitan una referencia circular, pero en realidad no lo hacen. El caso más común es "El caso de uno de muchos". Por ejemplo, tiene un cliente con varias direcciones, de las cuales una debe estar marcada como la dirección principal. Es muy tentador modelar esta situación como dos relaciones separadas has_address y is_primary_address_of pero no es correcta. La razón es que es la dirección principal no es una relación separada entre los usuarios y las direcciones, sino que es un atributo de la relación tiene la dirección . ¿Porqué es eso? Debido a que su dominio está limitado a las direcciones del usuario y no a todas las direcciones que hay. Selecciona uno de los enlaces y lo marca como el más fuerte (principal).
(Voy a hablar sobre bases de datos ahora) Muchas personas optan por la solución de dos relaciones porque entienden que "primario" es un puntero único y que una clave externa es un tipo de puntero. Así que la clave externa debería ser la cosa a usar, ¿verdad? Incorrecto. Las claves externas representan relaciones, pero "primaria" no es una relación. Es un caso degenerado de una ordenación donde un elemento está por encima de todo y el resto no está ordenado. Si necesitara modelar un pedido total, por supuesto lo consideraría como un atributo de la relación porque básicamente no hay otra opción. Pero en el momento en que lo degeneras, hay una opción bastante horrible: modelar algo que no es una relación como una relación. De modo que aquí viene la redundancia de relaciones, que ciertamente no es algo que deba subestimarse. El requisito de unicidad debe imponerse de otra manera, por ejemplo, mediante índices parciales únicos.
Por lo tanto, no permitiría que se produjera una referencia circular a menos que esté absolutamente claro que proviene de lo que estoy modelando.
(nota: esto está ligeramente orientado al diseño de la base de datos, pero apostaría a que es bastante aplicable también a otras áreas)