Pozdrav,
iako moj doprinos ovoj temi dolazi malo s odmakom probat ću ga dati zato jer nisu iznesene u potpunosti točne činjenice.
boby je pitao za neku referencu kako i gdje da počne učiti o noSQL bazama. Na to pitanje ne postoji odgovor zato što noSQL baza nije jedna neka nova baza a da postoje materijali za nju. noSQL je zapravo koncept a ne sama baza, pa tako imamo na tržištu desetke vrlo usješnih noSQL baza. Sve imaju neke zajedničke karakteristike ali su opet sve drastično različite. Npr. u skupinu noSQL baza spadaju MongoDb, CassandraDb, CouchDb, Riak, Redis, DynamoDb, Neo4j…
Sve te baze su noSQL baze a opet više/manje svaka je pogodna u nekim situacijama. Nema generalnog rješenja za sve. Ukratko usporedba pojedinih baza se dobro može ročitati u članku.
boby je rekao da su noSQL baze brže kada treba dohvatiti velike količine podataka. To je zaravo vrlo nedefinirana izjava. Klasične relacijske baze podataka su zapravo vrlo brze u dohvatu podataka. Sporost međutim nastaje kada imaš normaliziranu bazu i kada su podaci raštrkani u puno tablica i povezani su definiranim relacijama. Tada je za dohvat potpunih podataka potrebno napraviti JOIN između više tablica što je skupa operacije što se brzine tiće. prednost tog pristupa je što nema redudancije podataka. To znači da se neki podatak (npr. korisnikova adresa) nalazi samo na jednom mjestu pa je kada dođe do promjene potrebno promjeniti samo na jednom mjestu pa ne postoji mogućnost da negdje zaostanu stari podaci (koji se nisu promjenili). Sustavi za upravljanje relacijskim bazama podataka (RDBMS) uglavnom održavaju transakcijski sustav (npr. Oracle, SQL Server, IBM Informix itd.) pa su takvi sustavi vrlo pogodni npr. za bankarske sustave gdje ne smije biti mogućnosti pogreške.
Također, treba razjasniti što je to SQL. SQL (structured query language) je upitni jezik za relacijske baze podataka koji je definiran standardom. U pozadini SQL-a stoji striktno definiran matematički model koji je definirao Edgar Frank Codd. Kada se kaže sql baza podataka misli se na neki rdbms kao npr MySql, PostgreSql, Sql Server itd.
Tako da su relacijske baze podataka vrlo moćne, dugo su u upotrebi i bit će sigurno još jako dugo.
U praksi se vrlo često relacijske baze podataka denormaliziraju i to tako da se unosi redudancija podataka, a sve u svrhu smanjenja broja JOIN operacija među tablicama kako bi se dobilo na brzini. I to je uglavnom dovoljno dobra tehnika za velik broj slučajeva.
Ipak, u praksi se pokaza potreba za novi konceptima pa su tako nastale i drugačiji sustavi za upravljanje bazama podataka. Prvo su nastale tzv. objektno-relacijske baze podataka. Prijemjer takve je IBM Informix (to je ujedno relacijska i objektno-relacijska baza). To su baze koje imaju neka svojstva relacijskih i neka svojstva objektnih baza. Poanta je u tome da relacijske baze mogu spremiti samo jednostavne atomarne tipove podataka (npr. int, float, char itd.) dok objektno relacijske mogu i neke složenije tiove kao npr. lista integera.
U objektno orijentiranim aplikacijama je problem perzistencija podataka, tj. problem je spremiti neki objekt koji je složen u rel. bazu koja prima samo jednostavne tiove podataka. U takvim alikacijama je potrebno na neki način mapirati takve složene podatke u oblik koji je pogodan za spremanje u rel. baze. Često se koristi treći sustavi koji služe za takva objektno relacijska mapiranja (ORM). Primjeri takvih sustava su Hibernate za Java-u ili NHibernate za .NET.
Kako bi se riješio problem spremanja objekata u rel. baze razvijene su nativne objektne baze podataka u koje se jednostavno mogu pospremiti cijeli objekti. Primjer jedne dobre baze i vrlo jednostavne za korištenje je db4objects. I to je tzv. noSQL baza.
Općenito noSQL baze potiču redudanciju podataka u odnsu na relacijske, tj. ne postoje relacije/veze između podataka na razini samog sustava baze podataka. Tj. za povezanost između podataka se mora brinuti programer.
Svaka noSQL baza ima neke svoje karakteristike i ne može se reći ova je da je jedna bolja od druge generalno, jer su previše konceptualno različite i zapravo se više/manje svaka specijalizira za neku svrhu.
Npr. Neo4j je vjerojatno najbolja graph baza na tržištu i ako imamo aplikaciju koja je modelirana tako da imamo jako puno objekata koji su međusobno na neki način povezani onda je takva baza najpogodnija. Primjer takve baze je neka društvena mreža gdje imamo puno korisnika koji su povezani sa drugim korisnicima kao nekakvi prijatelji itd. Za detalje pogledati službene dokumentacije.
Redis npr. ima mogućnost spremanja podataka koji će se automatski izbrisati nakon definiranog vremena, pa ako imamo tako modeliranu aplikaciju redis će dobro oslužiti. K tome ima jako bogat set struktura podataka koji se mogu spremati, kao npr. povezane liste, setovi i sl. K tome je i izuzetno brz pa se često koristi umjesto memcached-a za cache-iranje podataka.
Neo4j i redis nemaju baš ništa zajedničko a ih se ne može uspoređivati i tamo gdje odgovara jedna baza druga za tu istu namjeru vjerojatno neće pasati. Želim reći da sve ovisi, kako je netko naveo, o samom modelu aplikacije i potrebama.
Sanel je rekao da većina noSQL baza podržava indeksiranje teksta dok to rlacijske baze ne podržavaju. To je zapravo dosta kriva formulacija. Apache Solr sustav za indeksiranje sadržaja koji je dao kao primjer nema nikakve veze sa samom bazom. Solr indekseru se mora dati sadržaj koji se želi indeksirati a taj sadržaj može biti pospremljen bilo gdje. Samo za primjer, uz Apache Solr najčešće se spominje Sphinx sustav za indeksiranje. Radio sam na razvoju nekoliko news portala kao što su npr. vecernji.hr ili zurnal24.si. News portalima je važno da imaju učinkovitu pretragu članaka. Svi podaci su bili sremljeni u MySql bazu ali oni podaci koji su bitni za brzo pretraživanje su dodatno spremljeni u Sphinx index. Isto tako su mogli biti spremljeni i u Solr, tako da sustavi za indekiranje nisu nikakva karakteristika noSQL baza već su to zasebni potuno neovisni sustavi.
Dalje je navedeno da su ti sustavi za indeksiranje teksta u noSQL bazama svjetlosnim miljama ispred sustava koji su ugrađeni u relacijske baze. Kao što sam rekao, Solr je odvojeni neovisni sustav koji nije karakteristika noSQL baza pa se onda to i ne može uspoređivati.
Neke rel. baze kao nr. MySQL ili PostgreSql imaju svoje sustave za indeksiranje. MySql ima tzv. “Fulltext search”. Stvar u praksi zapravo ide tako da i kada koristiš relacijsku bazu podataka a imaš potrebu za pretragom teksta tada moraš upogoniti neki pametni sustav za pretrau teksta kao što je Solr ili Sphinx, ali za sremanje podataka i dalje se može koristiti rel. baza.
Dakle, zaključak je da se ne može reći dali su bolje SQL ili noSQL baze jer sve ovisi o potrebama sustava. Drugo pitanje je bilo da li se mogu unutar iste aplikacije koristiti različiti sustavi baza podataka.
boby je negdje pročitao da se to ne može. To je naravno besmislica. Naravno da se može. I to se radi u većim aplikacijama koje za to imaju potrebu.
Npr. na projektu na kojem trenutno radim starvibes.com obilato koristimo nekoliko različitih sustava za upravljanje bazama podataka u isto vrijeme. Također i sustavi kao što su LinkedIn, Facebook i sl. koriste više različitih baza podataka, sustava za indeksiranje, sustava za cacheiranje itd.
Moglo bi se zaključiti da kod glomaznih sustava dolazi do potrebe za različitim bazama, no takvih sustava jasno nema jako puno.
Ne moram niti reći da je upravljanje različitim bazama u isto vrijeme izuzetno složeno, pa stoga boby dobro razmisli da li uopće imaš potrebu za time.
Za kraj… kako ne znam koje su potrebe aplikacije nemoguće je preporučiti neku noSQL bazu ali MongoDb je baza koja pokriva jako puno stvari i vrlo vjerojatno najviše odgovara raznim potrebama. Izuzetno je popularna, brzo se razvija, ima veliku zajednicu korisnika i odličnu dokumentaciju. Puno se koristi pa je svakako dobar potez naučiti dobro MongoDb.
No, na primjeru mog projekta, mi smo odustali od MongoDb-a i prešli smo na Amazon DynamoDb zato što kod MongoDb baze nije najbolje riješeno pitanje shardinga koje mislimo da će nam trebati. No sharding će biti potreban kada bude toliko puno paralelnih korisnika da sam Mongo postane usko grlo aplikacije, tj. kada Mongo ne bude mogao u razumnom vremenu poslužiti sve zahtjeve.
Ukoliko se ne radi o aplikaciji koja će jako skalirati takvih problema nema i Mongo je izvrsno rješenje.
Samo primjer kako odabir baze zapravo ovisi o potrebama.
Razdužio sam ovaj post više nego sam mislio. Nadam se da sam malo razjasnio stvari, tj. da nisam unio dodatnu pomutnju