Assumi un'applicazione con un modello di dominio ricco con molte classi (ad esempio School
, Classroom
, Teacher
, Student
, Course
, Exam
, Submission
, ...) che rimanda a l'un l'altro. Modello e collegamenti sono mappati al database che utilizza FK e vincoli appropriati (senza eliminazione a cascata). Nel pannello di amministrazione l'utente ha pulsanti di eliminazione accanto a ciascun oggetto.
Il tentativo di eliminare un oggetto ha uno dei seguenti due risultati:
- l'oggetto non viene referenziato da nessun altro oggetto, quindi viene cancellato
- l'oggetto viene referenziato da almeno un altro oggetto in modo che non possa essere cancellato. Un avviso viene mostrato all'utente.
Ho due modi per implementarlo:
- prima dell'esecuzione dell'eliminazione sql, esegui tutte le query necessarie per scoprire se questo oggetto può essere eliminato. Se non è possibile, avvisa l'utente.
- vai avanti ed esegui l'eliminazione sql e se fallisce (a causa dei vincoli rdbms) cattura l'eccezione sql e avvisa l'utente che non può essere cancellato.
Entrambi i modi funzionano bene. Il primo modo mi consente di fornire all'utente un motivo dettagliato per cui l'oggetto non può essere cancellato (ad esempio viene referenziato dal 2% diCourse
s e dall'1% diClassroom
). Il secondo modo mi consente di risolvere l'intero problema non scrivendo alcun vincolo controllando il codice e facendo affidamento sull'implementazione solida (ed esistente) del db.
C'è una ragione per cui dovrei sicuramente sceglierne una rispetto all'altra?