Küsimus

Anonüümne (15.04.2024 16:47)
Mis vahe on identifitseerival ja mitteidentifitseerival seosel tabelite vahel?

Vastus (18.09.2025 12:49):

Identifitseeriv seos tähendab, et lapsolemi identiteet sõltub täielikult vanemast. Kui vanemat pole, ei saa laps üldse eksisteerida, sest see on oma olemuselt vanema "osa". Näiteks tellimuse rida pole mõeldav ilma konkreetse tellimuseta, sest see pole iseseisev nähtus.
 
Mitteidentifitseeriv seos tähendab, et lapsel on oma iseseisev identiteet ja see võib eksisteerida ka ilma vanemata (või vähemalt tema olemus ei sõltu vanemast). Vanemaga on küll seos, aga lapse olemust see ei defineeri. Näiteks kasutajata auto on ikkagi auto, isegi kui seost kasutajaga enam ei ole. Seose kadumisel ei kaota auto identiteedina ära.
 
Peamine vahe:
  • Identifitseerivas seoses on laps osaline tervikus (olemuse poolest sõltuv).
  • Mitteidentifitseerivas seoses on laps iseseisev olem, millel lihtsalt võib olla seos teise olemiga.
 
SQL-andmebaasis realiseeritakse neid seosetüüpe erinevalt.

Identifitseeriv seos tähendab, et vanemtabeli reas olev võtmeväärtus aitab identifitseerida lapstabelis olevat rida. Seetõttu on vanemtabeli võti, mis on lapstabelis välisvõtmeks, osaks lapstabeli võtmest. Teiste sõnadega, lapsel pole oma identiteeti, vaid ta on identifitseeritav vanema kaudu, laps ei saa eksisteerida ilma vanemata ja koos vanemaga tuleks kustutada ka laps. Eelnevast nähtub, et selliste seoste puhul tuleks määrata kompenseeriv tegevus ON DELETE CASCADE.

Näiteks oletame, et igal isikul on null või rohkem meiliaadressi ja null või üks kasutajakonto. Need on andmed isiku kohta, kuid on pandud eraldi tabelitesse (Meiliaadress ja Kasutajakonto), mis on välisvõtme kaudu seotud tabeliga Isik. Seosed tabelite Isik ja Meiliaadress ning Isik ja Kasutajakonto vahel on identifitseerivad seosed.

Isik(isik_id, perenimi)
Primaarvõti (isik_id)

Meiliaadress(isik_id, e_meil)
Primaarvõti (isik_id)
Alternatiivvõti (e_meil)
Välisvõti (isik_id) Viitab Isik (isik_id)

Kasutajakonto(isik_id, parool, on_aktiivne)
Primaarvõti (isik_id)
Välisvõti (isik_id) Viitab Isik (isik_id)

Kontseptuaalses andmemudelis öeldakse olemitüüpide Meiliaadress ja Kasutajakonto kohta, et need on nõrgad olemitüübid (weak entity types).

Veel üks näide:

Tellimus (tellimuse_kood, loomise_aeg, summa)
Primaarvõti (tellimuse_kood)
 
Kaup (kauba_kood, nimetus, hind)
Primaarvõti (kauba_kood)
 
Tellimuse_rida(tellimuse_kood, kauba_kood, kogus, hind)
Primaarvõti (tellimuse_kood, kauba_kood)
Välisvõti (tellimuse_kood) Viitab Tellimus (tellimuse_kood)
Välisvõti (kauba_kood) Viitab Kaup (kauba_kood)
 
Kuna tellimuse rida on osa tellimusest (nende vahel on eksistentsiaalne seos), siis vastaval välisvõtme kitsendusel peaks olema ON DELETE CASCADE kompenseeriv tegevus.

Mitteidentifitseeriv seos tähendab, et last ei identifitseerita vanema kaudu, lapsel on oma identiteet ja nende vahel ei ole eksistentsiaalset sõltuvust. Vanemtabeli võti ei ole osa lapstabeli võtmest ja vastava välisvõtme puhul ei kasutata ON DELETE CASCADE.

Isik(isik_id, perenimi)
Primaarvõti (isik_id)

Tellimus (tellimuse_kood, tellija, summa)
Primaarvõti (tellimuse_kood)
Välisvõti (tellija) Viitab Isik (isik_id)

Veel üks näide:

Isik(e_posti_aadress, eesnimi, perenimi)
Primaarvõti(e_posti_aadress)
 
Auto (vin_kood, registri_nr, hetke_kasutaja)
Primaarvõti(vin_kood)
Välisvõti (hetke_kasutaja) Viitab Isik (e_posti_aadress)
 
Veerg hetke_kasutaja on mittekohustuslik, st lubab NULL-e.


Keskmine hinne: 5.0