Sobes.tech
Middle+

Kas nutiks, jei ištrinsite skaitytoją, kuris turi knygą? Kaip apsaugoti duomenų vientisumą?

sobes.tech AI

Atsakymas iš AI

Jei ištrinsite skaitytoją, kuris turi išduotą knygą, gali atsirasti neatitikimas duomenų bazėje arba duomenų struktūroje: knyga yra pažymėta kaip išduota, tačiau skaitytojas jau neegzistuoja. Tai sukelia informacijos praradimą apie tai, kas paėmė knygą, ir pažeidžia duomenų vientisumą.

Siekiant apsaugoti duomenų vientisumą, galima naudoti šiuos požiūrius:

  • Apribojimai duomenų bazės lygyje: sukonfigūruoti išoriniai raktai su ON DELETE RESTRICT arba ON DELETE CASCADE apribojimais. Pavyzdžiui, uždrausti ištrinti skaitytoją, jei jis turi išduotų knygų.
  • Transakcijos: trinant skaitytoją, patikrinti ir atnaujinti susijusius įrašus (pavyzdžiui, grąžinti knygas arba perkelti jas kitam skaitytojui) vienoje transakcijoje.
  • Programos logika: prieš trinant, patikrinti, ar skaitytojas neturi aktyvių išdavimų, ir jei turi, uždrausti trinimą arba valdyti išdavimus.

Pavyzdys Go kalba naudojant transakciją ir patikrinimą:

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("neįmanoma ištrinti skaitytojo, turinčio išduotų knygų")
    }

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

    return tx.Commit()
}