Prenderò questa domanda dal punto di vista della modellazione.
Fintanto che non aggiungi relazioni che in realtà non ci sono, sei al sicuro. Se li aggiungi, otterrai meno integrità nei dati (causa ridondanza) e codice più strettamente associato.
La cosa con i riferimenti circolari in particolare è che non ho visto un caso in cui sarebbero stati effettivamente necessari tranne un riferimento personale. Se si modellano alberi o grafici, è necessario ed è perfettamente a posto perché l'autoreferenzialità è innocua dal punto di vista della qualità del codice (nessuna dipendenza aggiunta).
Credo che nel momento in cui inizi a aver bisogno di un non-auto-riferimento, dovresti immediatamente chiedere se non puoi modellarlo come un grafico (comprimere le entità multiple in uno - nodo). Forse c'è un caso tra cui si fa un riferimento circolare ma modellarlo come grafico non è appropriato ma ne dubito fortemente.
Esiste il pericolo che le persone pensino di aver bisogno di un riferimento circolare, ma in realtà non lo fanno. Il caso più comune è "Il caso uno dei tanti". Ad esempio, hai un cliente con più indirizzi da cui uno dovrebbe essere contrassegnato come indirizzo principale. È molto allettante modellare questa situazione come due relazioni separate has_address e is_primary_address_of ma non è corretto. Il motivo è che essere l'indirizzo principale non è una relazione separata tra utenti e indirizzi ma è invece un attributo della relazione con indirizzo. Perché? Perché il suo dominio è limitato agli indirizzi dell'utente e non a tutti gli indirizzi presenti. Scegli uno dei link e lo contrassegni come il più forte (primario).
(Adesso parliamo di database) Molte persone optano per la soluzione a due relazioni perché comprendono "primario" come 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 relazioni ma "primaria" non è una relazione. È un caso degenerato di un ordinamento in cui un elemento è soprattutto e il resto non è ordinato. Se avessi bisogno di modellare un ordine totale, ovviamente lo considereresti come l'attributo di una relazione perché sostanzialmente non c'è altra scelta. Ma nel momento in cui la degeneri, c'è una scelta piuttosto orribile: modellare qualcosa che non è una relazione come relazione. Quindi ecco che arriva la ridondanza delle relazioni che non è certo qualcosa da sottovalutare.
Quindi, non permetterei che si verifichi un riferimento circolare a meno che non sia assolutamente chiaro che proviene dalla cosa che sto modellando.
(nota: questo è leggermente distorto per la progettazione del database, ma scommetto che è abbastanza applicabile anche ad altre aree)