Zamyšlení nad NoSQL

NoSQL je buzzword, který je tu s námi téměř už tři roky, přesto je pro mnohé lidi velkou neznámou, případně symbolem vzpoury proti zlým ošklivým přežitým enterprise SQL databázím. Rád bych se s vámi podělil o můj pohled na NoSQL, který je ovlivněn hlavně více než rokem používání Cassandry.

Co to je?

Především je důležité zdůraznit, co NoSQL není – rozhodně to není NO SQL, tedy trendy odmítání relačních databází. Zkratka NoSQL znamená Not Only SQL, tedy uvědomění si toho, že relační databáze není jediná možnost řešení persistence, že existují i alternativy, které mohou být v některých případech vhodnější.

U rozsáhlejších aplikací pak můžeme dojít k tomu, že na některá data je vhodná relační databáze, na jiná NoSQL databáze a na další data úplně jiná NoSQL databáze. Tento pragmatický přístup, kdy se mixuje použití více databází v jednom projektu, se často označuje jako polyglot persistence.

NoSQL databáze vznikaly (a vznikají) jako řešení reálných problémů – není to tedy bláznivý výmysl akademiků odtržených od reality, ale vysoce praktická záležitost. Zrod mnoha NoSQL databází je spjat s projekty, které se musely vypořádat s obrovským množstvím dat – Facebook (Cassandra), Google (BigTable), Amazon (Dynamo), LinkedIN (Voldemort) atd.

Použití NoSQL databáze může mít ale smysl i tehdy, pokud máme méně dat (které by v pohodě zvádla relační databáze) – třeba protože nějaká NoSQL databáze nabízí datový model, který je pro naši aplikaci přirozenější.

Ale zpět k úvodní otázce. NoSQL databáze je software pro perzistenci dat, který je alternativou ke klasickým relačním databázím (nic objevného). NoSQL databází existuje mnoho a dají se rozdělit z mnoha hledisek. Ve velmi specifických případech může dávat smysl vyvinout i vlastní NoSQL databázi (ale myslete na NIH).

Kdy použít NoSQL

Rozhodnutí, zda použít místo ověřené relační databáze neznámou NoSQL databázi, není jednoduché, a hlavně to není rozhodnutí jen technické, ale i ekonomické.

NoSQL databáze např. často nemají takové možnosti dotazování jako relační databáze. Zkuste se třeba zamyslet nad tím, jak by ovlivnilo vaši aplikaci, kdyby jedinou podporovanou DB operací bylo uložení řádku a jeho načtení podle nějakého ID (nepřeháním!). To vede k tomu, že je na vaši aplikaci přenášena odpovědnost (např. generování sekundárních indexů), kterou jste dosud považovali za samozřejmou součást databázového enginu. Použití NoSQL databáze tak často znamená kompletní redesign celé aplikace, takže hodně učení a práce pro aplikační programátory (kteří nepracují zadarmo).

Většina dnešních programátorů vyrůstala ve světě, kde jedinou možností uložení dat byla relační databáze. Umí tak s ní dobře pracovat (v čemž jim pomáhají léty vyladěné tooly), jsou na ni schopni napasovat jakýkoliv model a už při úvodním seznamování s novým projektem jim v hlavě automaticky naskakují tabulky a vazby mezi nimi. Takže stojí za zvážení, zda se opravdu vyplatí investovat čas (~peníze) do učení diametrálně odlišných technologií a zda nemůže být ekonomičtější použít léty ověřené relační databáze namísto nové sexy NoSQL databáze.

Tím nechci říct, že se má absolutně kašlat na vzdělávání a inovaci, ale situace na trhu práce je tristní a ne každý má to štěstí (já ano :-) ), že pracuje s bandou nadšených vývojářů, kteří čtou blogy, zajímají se o novinky v oboru a po večerech si zkouší nové technologie. Mnohdy člověk musí pracovat s lidmi, pro které je programování jen způsob obživy, odpracují si svých 8 hodin a tím to pro ně končí. A dělat s takovýmto týmem projekt, který používá NoSQL databázi, může být nákladné.

Náklady spojené s přechodem na NoSQL databázi se ale týkají celého týmu. Také vaši admini si budou muset umět poradit s novým SW v infrastruktuře, naučit se ho spravovat, zálohovat, tunit atp.

Takže?

Co jsem chtěl říct tímhle zamyšlením? NoSQL je zajímavá alternativa k zavedeným relačním databázím a rozhodně má své místo na trhu a proto doporučuji se o NoSQL databáze zajímat a nějaké si zkusit osahat. Pokud si proti nějaké NoSQL databázi zkusíte napsat jednoduchou aplikaci, neuvěřitelně vám to rozšíří obzory.

Nepoužívejte ale NoSQL databáze jen protože je to cool, protože by to mohlo být lepší nebo protože je používá konkurence. Řiďte se rozumem, ne emocemi. Dobře si spočítejte, co vám NoSQL přinese a jaké budou náklady. Pokud se už pro NoSQL rozhodnete, tak myslete na to, že se nemusíte úplně vzdávat pohodlné relační databáze – v projektu nemusíte používat jednu jedinou databázi…

Příspěvek byl publikován v rubrice Programování a jeho autorem je Augi. Můžete si jeho odkaz uložit mezi své oblíbené záložky nebo ho sdílet s přáteli.

10 komentářů u “Zamyšlení nad NoSQL

  1. „Většina dnešních programátorů vyrůstala ve světě, kde jedinou možností uložení dat byla relační databáze.“

    Myslim, že ti tam vypadly úvozovky u slova „programátorů“…

  2. @Augi – NoSQL jsem zkoumal a nerozumím přínosu v žádné (praktické) situaci. Praktickou situací tedy nemyslím vývoj Facebooku pro miliardu lidí, ale běžný lokální projekt pro desítky tisíc users denně ;)

    To málo, co NoSQL databáze nabízí se dá +/- identicky udělat i v relační databázi, ale když chci něco navíc, musím aplikačně programovat, zatímco v SQL databázi jen napíšu mírně složitější SELECT, INSERT, UPDATE (WITH JOIN).

    Spousta složitých integrací se dá vyřešit přes jednoduché VIEW na více tabulek a INSTEAD OF INSERT/DELETE/UPDATE triggery.

    Do relační databáze se dá ukládat libovolně strukturované XML a pracovat s ním jako s tabulkou.

    Tvůj článek mi na otázku „Proč jít do NoSQL a omezit své možnosti“ neodpověděl…

  3. Radku, článek si ani nekladl za cíl odpovědět na tuhle otázku. A že jsi to od článku s NoSQL v názvu čekal, je přesně ten důvod, proč jsem tenhle článek psal ;-)
    O NoSQL se totiž všude píše veskrze pozitivně, ale už se nemluví o tom, že použití NoSQL s sebou nese i hromadu dalších starostí, které člověk s relační databází řešit nemusí, a přechod tak není rozhodně zadarmo. A už vůbec se nemluví o tom, že většina lidí NoSQL nepotřebuje. Takže cílem článku bylo spíš říct „Proč nejít do NoSQL“ (viz poslední odstavec). Ano, možná první český článek o NoSQL, který není jen chvalozpěvem :-)

    Takže souhlas – pro běžný lokální projekt s desítkami tisíc users denně opravdu není podle mého názoru přínosem přechod na NoSQL.

    Pokud má ale někdo rád nové technologie (a zaměstnavatel mu to zaplatí, příp. má na to čas), tak to může být pěkné cvičení, které se mu třeba může vyplatit v budoucnu, až mu bude nabídnut větší projekt.

  4. To se mi ulevilo, že nemusím přecházet na Cassandru a všechny ty skvělé funkce SQL Serveru 2008 programovat od píky znovu!

  5. Perfekny clanok. Musim len podporit tvoje doporucenie skusit si naprogramovat drobnu aplikaciu s NoSQL. Sam som takuto prilezitost dostal. Tvoja veta „Zkuste se třeba zamyslet jak by ovlivnilo vaši aplikaci, kdyby jedinou podporovanou DB operací bylo uložení řádku a jeho načtení podle nějakého ID“ presne vystihuje o co v takej aplikacii ide a co sa clovek pri jej pisani nauci.

    Zaujimave to bolo aj pre admina, ktory mi supportoval MemcachedDB. On potom skusenosti zuzitkoval, ked sme cely PHP hosting upgradovali, tak aby ukladal sessions do Memcache.

    Dnes uz by som vedel presnejsie odhadnut, kde NoSQL pouzit (v aplikaciach, ktore naznacoval Radek vyssie), napr. pri udajoch s nestalym poctov parametrov. Kazdopadne treba mysliet racionalne, novy projekt zacat s relacnou DB (ktora vie prekvapivo dobre skalovat) a na NoSQL sa presuvat postupnym iterovanim.

  6. @srigi Začínat nový projekt s jasně danou databází nebo relačním schématem je holý nesmysl. Kdy jen tahle šílená představa návrhu SW vymizí? Stojí to strašně moc peněz a je to neefektivní…

  7. Líbí se mi sekce „Kdy použít NoSQL“, která je spíš o opaku :)

    Z mého pohledu je to hlavně o strachu, jak bych si poradil s mnoha situacemi, které v průběhu životního cyklu aplikace můžou vyvstat (typicky nějaké složitější dotazy) a nedokážu naprosto odhadnout, kolik práce by s tím bylo v NoSQL. Zatím jsem vyrozuměl, že NoSQL je hlavně o výkonu / škálování v poměrně extrémních situacích, což asi není to, co by většinu z nás trápilo.

  8. S tymto clankom sa stotoznujem, najma ocenujem, ze niekto zacal komunikovat moznosti kombinovania NoSQL a SQL. Mnohe NoSQL prednasky a clanky, ktore som videl a cital boli plne dogmatizmu ktory ludi odradil od uvah na nasadeni na specificke ulohy.
    Napr. CAP teorema plati, ale nikde nie je napisane, ze sa neda obist a ze vzdy je mozne nad poziadavkou nad C mavnut rukou.(napr. cez aplikovanie CQRS, Augi vie na co myslim, vsak?)
    Malokora prednaska mohla presvecit napr. ludi, ze aj v priprade nie public webovych aplikacii moze mat NoSQL svoje miesto.

Napsat komentář

Vaše emailová adresa nebude zveřejněna.

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>