Middle+
Какво ще се случи при изтриване на читател, който има книга на ръка? Как да защитим целостта на данните?
sobes.tech AI
Отговор от AI
Ако изтриете читател, който има книга в заем, може да възникне несъответствие в базата данни или структурата на данните: книгата е посочена като заета, но читателят вече не съществува. Това води до загуба на информация за това кой е взел книгата и нарушава цялостта на данните.
За защита на цялостта на данните могат да се използват следните подходи:
- Ограничения на ниво база данни: конфигурирайте външните ключове с ограничение
ON DELETE RESTRICTилиON DELETE CASCADE. Например, забранете изтриването на читател, ако има заети книги. - Транзакции: при изтриване на читател проверявайте и актуализирайте свързаните записи (например, връщане на книгите или прехвърляне към друг читател) в една транзакция.
- Логика на приложението: преди изтриване проверете дали читателят няма активни заеми, и ако има, забранете изтриването или управлявайте заемите.
Пример на Go с използване на транзакция и проверка:
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("невъзможно е изтриване на читател с книги в заем")
}
_, err = tx.Exec("DELETE FROM readers WHERE id = ?", readerID)
if err != nil {
return err
}
return tx.Commit()
}