Sobes.tech
Middle+

Co się stanie po usunięciu czytelnika, który ma na rękach książkę? Jak chronić integralność danych?

sobes.tech AI

Odpowiedź od AI

Jeśli usuniesz czytelnika, który ma wypożyczoną książkę, może dojść do niespójności w bazie danych lub strukturze danych: książka jest oznaczona jako wypożyczona, ale czytelnik już nie istnieje. Prowadzi to do utraty informacji o tym, kto wypożyczył książkę, i narusza integralność danych.

Aby chronić integralność danych, można zastosować następujące podejścia:

  • Ograniczenia na poziomie bazy danych: skonfiguruj klucze obce z ograniczeniem ON DELETE RESTRICT lub ON DELETE CASCADE. Na przykład, zabroń usunięcia czytelnika, jeśli ma wypożyczone książki.
  • Transakcje: podczas usuwania czytelnika sprawdzaj i aktualizuj powiązane wpisy (np. zwracając książki lub przekazując je innemu czytelnikowi) w jednej transakcji.
  • Logika aplikacji: przed usunięciem sprawdź, czy czytelnik nie ma aktywnych wypożyczeń, i w razie potrzeby zabroń usunięcia lub obsłuż wypożyczenia.

Przykład w Go z użyciem transakcji i sprawdzenia:

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("nie można usunąć czytelnika z wypożyczonymi książkami")
    }

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

    return tx.Commit()
}