In primo luogo, mantenere i dati normalizzati (non ridondanti) il più possibile.
Se i dati sono completamente normalizzati, nessun singolo aggiornamento ai dati può renderlo incoerente.
Non è possibile mantenere sempre i dati normalizzati, in altre parole potresti non essere in grado di eliminare la ridondanza, nel qual caso può avere stati incoerenti.
La cosa da fare è quindi tollerare l'incoerenza e ripararla periodicamente con un qualche tipo di programma che lo attraversa e lo aggiusta.
C'è una strong tendenza a cercare di gestire strettamente la ridondanza tramite notifiche.
Questi non sono solo difficili da accertare che siano corretti, ma possono portare a enormi inefficienze.
(Parte della tentazione di scrivere notifiche sorge perché in OOP sono praticamente incoraggiati.)
In generale, tutto ciò che dipende dalla sequenza temporale di eventi, messaggi, ecc., sarà vulnerabile e richiederà tonnellate di codifica difensiva.
Gli eventi e i messaggi sono caratteristici dei dati con ridondanza, poiché comunicano le modifiche da una parte all'altra, cercando di prevenire l'incoerenza.
Come ho detto, se devi avere ridondanza (e le probabilità sono abbastanza buone devi), è meglio essere in grado di a) tollerare e b) ripararlo.
Se si tenta di prevenire l'incoerenza esclusivamente tramite messaggi, notifiche, trigger, ecc., Sarà molto difficile renderlo solido.