ORM ( englanniksi Object-Relational Mapping , Russian Object -Relational Mapping tai muunnos) on ohjelmointitekniikka, joka yhdistää tietokannat olioohjelmointikielten käsitteisiin luoden "virtuaalisen objektitietokannan ". Tälle tekniikalle on olemassa sekä omia että ilmaisia toteutuksia.
Tietojen kanssa on työskenneltävä luokkien, ei tietotaulukoiden perusteella, ja päinvastoin muuntaa luokkien termit ja tiedot DBMS:ään tallennettavaksi soveltuviksi tiedoiksi. On myös tarpeen tarjota käyttöliittymä CRUD -dataoperaatioille . Yleensä sinun on päästävä eroon tarpeesta kirjoittaa SQL-koodia vuorovaikutusta varten DBMS:ssä [1] .
Ratkaisu tietojen varastoinnin ongelmaan on olemassa - nämä ovat relaatiotietokannan hallintajärjestelmiä . Relaatiotietokannan käyttäminen oliotietojen tallentamiseen johtaa semanttiseen aukkoon , mikä pakottaa ohjelmoijat kirjoittamaan ohjelmistoja , joiden on kyettävä käsittelemään tietoja oliopohjaisella tavalla, mutta tallentamaan tiedot relaatiomuodossa. Tämä jatkuva tarve muuntaa kahden erilaisen datamuodon välillä ei ainoastaan vähennä huomattavasti suorituskykyä, vaan myös aiheuttaa vaikeuksia ohjelmoijille, koska molemmat tietomuodot asettavat rajoituksia toisilleen.
Relaatiotietokannat käyttävät taulukkoja, jotka edustavat yksinkertaista dataa. Muita tai niihin liittyviä tietoja on tallennettu muihin taulukoihin. Usein useita taulukoita käytetään yhden objektin tallentamiseen relaatiotietokantaan; tämä puolestaan vaatii JOIN -operaation saadakseen kaikki objektiin liittyvät tiedot sen käsittelemiseksi. Esimerkiksi muistikirjan tietojen tallentamista varten siellä on todennäköisesti vähintään kaksi taulukkoa: henkilöt ja osoitteet, ja ehkä jopa taulukko puhelinnumeroineen.
Koska relaatiotietokannan hallintajärjestelmät eivät tyypillisesti toteuta suhteiden fyysisen kerroksen relaatioesitystä, useiden peräkkäisten kyselyjen suorittaminen (viittaen samaan "oliosuuntautuneeseen" tietorakenteeseen) voi olla kohtuuttoman kallista. Erityisesti yksi kysely, kuten "etsi sellainen ja sellainen käyttäjä ja kaikki hänen puhelimensa ja kaikki hänen osoitteensa ja palauta ne tässä muodossa", on todennäköisesti nopeampi kuin sarja "Etsi käyttäjä". Etsi hänen osoitteensa. Etsi hänen puhelimensa. Tämä johtuu optimoijan työstä ja kyselyn jäsentämisen kustannuksista.
Jotkut ORM-toteutukset synkronoivat automaattisesti muistissa olevat objektit tietokannan kanssa. Tämän mahdollistamiseksi objektista SQL:ksi muuntavan SQL-kyselyn (luokka, joka toteuttaa tiedonsiirron tietokantatietokantaan) luomisen jälkeen vastaanotetut tiedot kopioidaan objektin kenttiin, kuten kaikissa muissa ORM-toteutuksissa. Tämän jälkeen objektin on tarkkailtava näiden arvojen muutoksia ja kirjoitettava ne tietokantaan.
Relaatiotietokannan hallintajärjestelmät osoittavat hyvää suorituskykyä globaaleissa kyselyissä, jotka vaikuttavat suureen tietokannan alueeseen, mutta oliopohjainen käyttö on tehokkaampaa, kun käsitellään pieniä tietomääriä, koska se vähentää semanttista kuilua objektin ja relaatiomuotojen välillä. tiedot.
Näiden kahden eri maailman samanaikaisen olemassaolon myötä relaatiotietokantojen kanssa työskentelyyn käytettävän objektikoodin monimutkaisuus lisääntyy, ja se tulee alttiimmaksi virheille. Tietokantaohjelmistojen kehittäjät ovat etsineet helpompaa tapaa saavuttaa objektiensa pysyvyys.
Monet paketit on kehitetty poistamaan tarve muuntaa objekteja tallennettavaksi relaatiotietokantoihin.
Jotkut paketit ratkaisevat tämän ongelman tarjoamalla luokkakirjastoja, jotka voivat tehdä nämä muunnokset automaattisesti. Koska tietokannassa on luettelo taulukoista ja ohjelman objekteista, ne muuntavat kyselyt automaattisesti tyypistä toiseen. "Person"-objektin kyselyn tuloksena (osoitekirjan esimerkistä) vaadittu SQL-kysely generoidaan ja suoritetaan, ja tulokset muunnetaan "maagisesti" "puhelinnumero"-objekteiksi ohjelman sisällä.
Ohjelmoijan näkökulmasta järjestelmän tulisi näyttää pysyvältä objektien varastolta. Hän voi yksinkertaisesti luoda objekteja ja työskennellä niiden kanssa tavalliseen tapaan, ja ne tallennetaan automaattisesti relaatiotietokantaan.
Käytännössä kaikki ei ole niin yksinkertaista ja ilmeistä. Kaikilla ORM-järjestelmillä on tapana esitellä itseään tavalla tai toisella, mikä vähentää mahdollisuutta jättää tietokanta jollakin tavalla huomiotta. Lisäksi tapahtumakerros voi olla hidas ja tehoton (etenkin luodun SQL:n suhteen). Kaikki tämä voi aiheuttaa sen, että ohjelmat toimivat hitaammin ja käyttävät enemmän muistia kuin käsin kirjoitetut ohjelmat.
Mutta ORM säästää ohjelmoijaa kirjoittamasta suuria määriä koodia, usein toistuvaa ja virhealtista, mikä lisää merkittävästi kehitysnopeutta. Lisäksi useimmat nykyaikaiset ORM-toteutukset sallivat ohjelmoijan tarvittaessa koodata SQL-kyselyt, joita käytetään tiettyihin toimiin (tietokantaan tallentaminen, lataus, haku jne.) pysyvällä objektilla.