Назад к вопросам
OZON
Middle+
4
Что произойдёт при удалении читателя, у которого на руках книга? Как защитить целостность данных?
Компании, где спрашивали
Ответ от нейросети
sobes.tech 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()
}