Sobes.tech
Middle+

Cosa succede quando si elimina un lettore che ha un libro in prestito? Come proteggere l'integrità dei dati?

sobes.tech AI

Risposta dell'AI

Se si elimina un lettore che ha un libro in prestito, potrebbe verificarsi un'incoerenza nel database o nella struttura dei dati: il libro appare come prestato, ma il lettore non esiste più. Ciò porta alla perdita di informazioni su chi ha preso in prestito il libro e viola l'integrità dei dati.

Per proteggere l'integrità dei dati, si possono usare i seguenti approcci:

  • Vincoli a livello di database: configurare chiavi esterne con il vincolo ON DELETE RESTRICT o ON DELETE CASCADE. Ad esempio, vietare l'eliminazione di un lettore se ha libri in prestito.
  • Transazioni: durante l'eliminazione di un lettore, verificare e aggiornare le registrazioni correlate (ad esempio, restituendo i libri o trasferendoli a un altro lettore) in una singola transazione.
  • Logica dell'applicazione: prima di eliminare, verificare che il lettore non abbia prestiti attivi, e in caso contrario, vietare l'eliminazione o gestire i prestiti.

Esempio in Go usando transazione e verifica:

func DeleteReader(db *sql.DB, readerID int) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer tx.Rollback()

    var count int
    err = tx.QueryRow("SELECT COUNT(*) FROM books WHERE reader_id = ?", readerID).Scan(&count)
    if err != nil {
        return err
    }
    if count > 0 {
        return fmt.Errorf("impossibile eliminare un lettore con libri in prestito")
    }

    _, err = tx.Exec("DELETE FROM readers WHERE id = ?", readerID)
    if err != nil {
        return err
    }

    return tx.Commit()
}