Hoću bazu, neću RDBMS
July 3, 2007 – 12:16 amDavno prije, u dalekoj galaksiji, ljudi su koristili dBase i u njega spremali podatke u recorde, od kojih je svaki imao nekoliko polja. Onda su se relacijske baze podataka spustile iz znanstvenih krugova k običnim smrtnicima, i oni pametniji prepoznali su da je pametnije slagati relacije između koreliranih podataka nego trpati podatke u neugodne flat liste.
Onda se web, pa nedugo zatim PHP i MySQL koji su bili toliko dobra kombinacija da je svima bilo očito da su RDBMsovi očigledan način za spremanje podataka na web servisima.
Trenutno su u modi Railsi, Django, Turbogears i tome slični web frameworci, koji se među ostalim trse i svojim ORM (Object Relational Mapper)-ima, odnosno layerima koji sjede između aplikacije i baze i pretvaraju pristupanje objektima aplikacije u SQL querye.
SQL čistunci općenito pljuju po ORMovima, zato jer mapiranje između objekata u aplikaciji i relacija nije jednoznačno, i praktički je drugačije za svaki pojedini slučaj - u praksi to znači da niti jedan ORM nije optimalan, te da ako ga se koristi na “naivan” način može se poprilično narušiti performanse sustava.
Ali, sve nekako imam osjećaj da greška u ovom slučaju nije na strani ORM-a, nego RDBMS-a kao takvog. Zašto bi morali sve podatke organizirati kao nizove n-torki kojima možemo raditi unije, presjeke i sve ostale divne stvari iz baze? RDBMS nije silver bullet. Ovisno o tipu podataka, za neke primjene je sjajan, ali za neke je jednako smislen kao i stari dBase princip recorda.
Trenutno radim na jednoj TurboGears aplikaciji, za koju moram imati neke persistentne objekte s nekim podacima. Prirodan način organizacije ovih objekata je stablo / graf, svaki objekt ima reference na mnoge druge. Optimalna organizacija ovih podataka u RDBMsu se može postići spretnom kombinacijom raznih tablica, keyeva i pametnih selectova, ali ja se ne želim zamarati SQL-om, imam objekte i želim izravno manipulirati njima. Ako iskoristim neki ORM nad recimo MySQLom, i pretvaram se da su to obični objekti, garantirano mi je da ću imati veliki overhead u SQL upitima.
Ono što bih zapravo želio je neki način serijalizacije pojedinih objekata u memoriji koji čuva reference između pojedinih objekata, ali ne forsira strukturu stabla (odnosno promjena podataka određenog objekta i njegov update na “disku” ne znači da se istovremeno moraju zapisivati i objekti koje on referencira, ako oni nisu mijenjani - pythonov shelve/pickle je blizu, ali ima problem sa ovime).
Dakle poštovano moje mnogobrojno čitateljstvo, što mislite o ovakvom pristupu, te znate li za takvu nekakvu “bazu”?
Update: Hvala na komentarima i linkovima, zahvaljujući kojima sam naišao na ZODB i Durus projekte, koji mi izgledaju obećavajuće (kako favoriziran Python programski jezik, usredotočio sam se na komponente pisane za njega, ali bilo bi zanimljivo čuti i ima li Ruby ili čak PHP neki pandan ovome).


8 Responses to “Hoću bazu, neću RDBMS”
Samo bubam, možda sam sasvim fulao: CouchDb? http://couchdb.com
By Berislav Lopac on Jul 3, 2007
Ne znamo, ali javi kad otkriješ. Treba i nama :)
By puzz on Jul 3, 2007
hm. pickle? :)
By klax on Jul 3, 2007
ZODB mozda ??
By strangy on Jul 3, 2007
Zakaj ne isprogramirati aplikaciju na DB razini u Postgresu recimo (sa funkcijama, trigerima itd), na taj način dobiti nekakav API tih funkcija i njih koristiti u svojoj aplikaciji? (Nikad nisam to probao, ali mi se čini dobrom idejom.)
By Orbiscerbus on Jul 3, 2007
@bero: Sa početne stranice nekako mi se čini da je to pandan nekom google baseu, a ne komponenta/library koju se može reuseati za imat bazu u vlastitom projektu. Nažalost netko im je vandalizirao wiki na kojem su valjda opširniji podaci, tako da nisam mogao izvući puno više o njima.
@klax: Pickle is close, but no cigar :D Problem sa Pickleom mi je da on prati reference, pa tako ako picklaš neki objekt, serijalizirat ćeš i sve objekte koje on referencira, a ako u bazi imam podatke koji se međusobno referenciraju, onda moram picklati/unpicklati uvijek cijeli taj skup, što baš nije neko rješenje.
@strangy: Tako nešto sam imao na umu! Čuo sam i prije za ZODB ali sam mislio da je to neki ORM nad RDBMSovima kojeg koristi Zope, pa nisam previše bacio oko na to.
Googlajući za dokumentacijom naišao sam i na Durus projekt, koji je lightweight implementacija ZODBa, a kako volim početi s nečim manjim vjerojatno ću i to malo pogledati.
By senko on Jul 3, 2007
@Orbiscerbus: Kvalitetni wrapperi nad SQLom za neku specifičnu primjenu se sigurno mogu ručno napisati (ili na razini triggera / sql funkcija, ili na razini wrappera u samom programu), ali problem s time je da tako nešto specifično za određenu aplikaciju, dakle treba to svaki put iznova pisati.
Mislim da za neke primjene (kao što je persistencija objekata) RDBMS jednostavno nije najbolji pogodak, pa me zato zanima koje alternative postoje za te primjene.
Ukoliko se za nešto koristi relacijska baza, slažem se da sve operacije nad podacima u njoj treba raditi na što nižoj/neposrednijoj razini, idealno viewovima/triggerima/funkcijama.
By senko on Jul 3, 2007