Mis on kuristiku probleem?
Kuristiku probleem (inglise keeles chasm trap) tekib andmemudelis siis, kui mudel ei suuda esitada seost teatud olemite vahel. Tavaliselt on see tingitud valesti loodud või puuduvast seosest. Probleem avaldub, kui teatud päringute tegemisel kaotatakse andmeid või ei suudeta seost leida, tekitades "kuristiku" olemite vahele.
Sellel lehel uurime ühte tüüpilist stsenaariumit, demonstreerime probleemi interaktiivselt ja näitame, kuidas seda lahendada.
Näite stsenaarium
Kujutame ette ettevõtet, kus kehtivad järgmised reeglid:
- Iga töötaja võib kasutada ühte või mitut ametiautot (kuid mitte samaaegselt).
- Iga ametiauto võib olla korraga kõige rohkem ühe töötaja kasutuses.
- Iga ametiauto kuulub täpselt ühele osakonnale (nt turundusosakonna auto, müügiosakonna auto).
Probleemi olemus: Kui mudel on valesti loodud, siis autot, mis pole hetkel kellegi kasutuses, ei saa seostada ühegi osakonnaga, kuigi auto tegelikult kuulub osakonnale.
Vigane andmemudel
Oletame, et loome andmemudeli, kus auto ja osakonna vahel puudub otseühendus. Seos luuakse kaudselt läbi töötaja, kes autot kasutab. Selline mudel võib tunduda loogiline, kuid see peidab endas kuristiku probleemi.
Selle mudeli kohaselt saame auto osakonna teada ainult siis, kui leiame töötaja, kes autot kasutab, ja seejärel vaatame, millises osakonnas see töötaja töötab. Aga mis juhtub siis, kui autot hetkel keegi ei kasuta?
Interaktiivne demo: probleemi avastamine
Proovime pärida auto osakonda, kasutades vigast mudelit. Vali rippmenüüst auto ja vajuta nupule.
Lahendus: otseühenduse loomine
Probleemi lahendamiseks tuleb mudelit parandada. Peame looma otsese seose olemite Ametiauto
ja Osakond
vahele. See seos ("kuulub") tagab, et iga auto on alati seotud oma omanik-osakonnaga, sõltumata sellest, kas autot parajasti kasutatakse või mitte.
Uus mudel näeb välja terviklikum ja robustsem:
... ja lisaks on olemas otseühendus auto ja osakonna vahel.
Oluline tähelepanek: andmete terviklikkus
Pärast paranduse tegemist on ametiauto seotud osakonnaga kahel viisil: otse (Ametiauto -> Osakond
) ja kaudselt (Ametiauto -> Töötaja -> Osakond
). On kriitiliselt oluline tagada, et need andmed ei läheks omavahel vastuollu. Näiteks ei tohi tekkida olukorda, kus auto kuulub otse müügiosakonda, aga seda kasutav töötaja on turundusosakonnast.
Reaalses SQL-andmebaasis saab sellist andmete kooskõla tagada näiteks trigerite (triggers) abil, mis kontrollivad andmete sisestamisel või muutmisel, et töötaja osakond ja auto omanik-osakond vastaksid ärireeglitele.
Interaktiivne demo: parandatud mudel
Nüüd proovime teha sama päringu parandatud mudeliga. Vali sama vaba auto ja vaata, mis juhtub.
Kokkuvõte
Kuristiku probleem on klassikaline viga andmemodelleerimisel, mis tekib olulise otseühenduse puudumisest olemite vahel. See näide demonstreeris, kuidas sõltuvus kaudsest seosest (läbi töötaja) võib viia andmekaoni, kui vahepealne lüli (auto kasutaja) puudub.
Peamine õppetund: Veendu alati, et kõik olulised seosed olemite vahel on mudelis olemas, isegi kui tundub, et info on kaudselt tuletatav. See tagab andmete terviklikkuse ja päringute korrektsuse igas olukorras.