Sobes.tech
Назад к вопросам
Middle+
4

Что произойдёт при удалении читателя, у которого на руках книга? Как защитить целостность данных?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

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()
}