Prenderò questa domanda dal punto di vista della modellazione.
Se non aggiungi nessuna relazione che non sia effettivamente lì, sei al sicuro. Se li aggiungi, ottieni meno integrità nei dati (perché esiste una ridondanza) e codice più strettamente accoppiato.
La cosa con i riferimenti circolari in particolare è che non ho visto un caso in cui sarebbero stati effettivamente necessari tranne uno - riferimento personale. Se modellate alberi o grafici, avete bisogno di questo ed è perfettamente a posto perché l'auto-riferimento è innocuo dal punto di vista della qualità del codice (nessuna dipendenza aggiunta).
Credo che nel momento in cui inizi a richiedere un riferimento di non-autore, dovresti immediatamente chiedere se non puoi modellarlo come un grafico (collassa le entità multiple in un nodo). Forse c'è un caso tra cui si fa un riferimento circolare ma modellarlo come grafico non è appropriato ma ne dubito strongmente.
C'è il pericolo che le persone pensino di aver bisogno di un riferimento circolare ma di fatto non lo fanno. Il caso più comune è "Il caso uno dei molti". Ad esempio, hai un cliente con più indirizzi tra cui uno deve essere contrassegnato come indirizzo principale. È molto allettante modellare questa situazione come due relazioni separate has_address e is_primary_address_of ma non è corretta. Il motivo è che essere l'indirizzo principale non è una relazione separata tra utenti e indirizzi, ma è un attributo della relazione ha un indirizzo . Perché? Perché il suo dominio è limitato agli indirizzi dell'utente e non a tutti gli indirizzi che ci sono. Scegli uno dei link e contrassegnalo come il più strong (primario).
(Adesso parliamo di database) Molte persone optano per la soluzione a due relazioni perché capiscono che "primario" è un puntatore univoco e una chiave esterna è una specie di puntatore. Quindi la chiave esterna dovrebbe essere la cosa da usare, giusto? Sbagliato. Le chiavi esterne rappresentano le relazioni ma "primaria" non è una relazione. È un caso degenerato di un ordine in cui un elemento è soprattutto e il resto non è ordinato. Se avessi bisogno di modellare un ordinamento totale, lo considereresti come attributo di una relazione perché in fondo non esiste altra scelta. Ma al momento si degenera, c'è una scelta e piuttosto orribile - modellare qualcosa che non è una relazione come relazione. Quindi ecco che arriva - la ridondanza delle relazioni che non è certamente qualcosa da sottovalutare. Il requisito di unicità dovrebbe essere imposto in altro modo, ad esempio mediante indici parziali unici.
Quindi, non permetterei un riferimento circolare a meno che non sia assolutamente chiaro che proviene dalla cosa che sto modellando.
(nota: questo è leggermente sbilanciato rispetto al design del database, ma direi che è abbastanza applicabile anche ad altre aree)