Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Návrh databáze - NoSQL vs SQL

SQL, nebo NoSQL? V tomto článku není cílem řešit, jestli mají pravdu zastánci relačních databází nebo zastánci NoSQL, ale podívat se konkrétně na to, jak by vypadal takový školní databázový návrh pro key-value databázi, a jak moc je odlišný od návrhu pro klasickou SQL databázi.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Minule se zde na Zdrojáku rozhořela debata pod tímto článkem. V diskuzi padlo dost argumentů proti SQL i pro SQL. V tomto článku se podíváme na to, jak by vypadal takový databázový návrh pro key-value databázi, a jak moc je odlišný od návrhu pro klasickou sql databázi. Také si shrneme výhody a nevýhody těchto řešení.

Zadání

Mějme takové klasické zadání, na kterém si studenti ve škole trénují návrh SQL databází. V zadání nebudeme zabíhat příliš do detailů a nebudeme ho rozebírat více než je třeba. 

Zadání je následující: Chceme vytvořit systém, který bude vypisovat program kin. Program může být týdenní nebo měsíční. V programu je uveden název kina ve kterém se hraje a adresa kina. Dále program bude obsahovat seznam filmů, což znamená, že u každého filmu bude jméno filmu, krátký popis, režisér filmu a také rok vzniku filmu. Dále bude možno vyhledávat, které kino hraje konkrétní film.

Analýza

Pokud půjdeme na věc klasicky, jak nás to naučili ve školních škamnách, tak okamžitě rozpoznáme entity Kino a Film s tím, že entita Kino má atributy adresa a název. Entita Film pak rok, režisér, jméno filmu, popis. Tyto entity pak mají vztah m:n, protože Kino může hrát (třeba i nehrát, to zadání neříká) libovolný počet filmů, a stejně tak film může být hrán v libovolném počtu kin. E-R diagram pak bude vypadat následovně:

 kino film

Z tohoto diagramu by v SQL vznikly 3 tabulky. Tabulka Kino pro záznam informací o kinech, tabulka Film pro záznam informací o filmech a tabulka Představení, která by říkala, který film se hraje ve kterém kině a kdy. Hotovo. Nyní napsat SQL dotazy a nějak ta data prezentovat a máme vystaráno. Víceméně si vystačíme s dvěma dotazy – první vypíše program a druhý vyhledá kino podle názvu filmu. 

Nyní se podíváme co udělat s tím samým případem, když máme k dispozici pouze key-value databázi. Nevím o žádné speciální metodice, podle které bych to navrhl, takže se přidržím předchozího návrhu, a ten denormalizuji. Do databáze uložím data tak, jak by vypadal výsledek provedeného SQL dotazu z předchozího příkladu. Jedná se tedy o data, která přímo vidí uživatel. Při výběru a výpisu dat nebude prováděna jiná operace než jejich formátování do výsledné podoby (například HTML stránka apod).

Začneme tím, jak bude vypadat uložený program kin. V zadání jsou dvě možnosti jak vypsat program: týdenní a měsíční. Jestli se jedná o týdenní či měsíční bude rozlišovat klíč. Každý záznam bude obsahovat Kino a jeho atributy a pak program, tedy seznam filmů s časem, kdy se hrají. V JSON notaci by zjednodušený měsíční program kin mohl vypadat následovně:

klíč hodnota
01/2010 [{Kino:{Adresa:Vá­clavák,Nazev:Ki­no Václavák}},{Pro­gram}]

Obdobný případ je výpis týdenních programů kin. Jinak bude vypadat klíč (týdnů je více než měsíců), ale hodnota bude mít formát stejný.

Ještě nám zbývá dodělat výpis seznamu kin, které hrají konkrétní film. To bude trochu oříšek. Máme dvě možnosti, jak se k tomu postavit. Jedna z nich je, že to budeme vyhledávat přímo buď v týdenních nebo měsíčních záznamech, a druhá možnost je, že si toto dáme stranou, film bude fungovat jako klíč a pod tímto klíčem bude uložen seznam všech kin, které kdy ten film uvedly. To by mohlo vypadat následovně:

klíč hodnota
7 statečných [{Adresa:Václa­vák,Nazev:Kino Václavák,Datum:02/01/20­10 15:00}]

Úprava schématu

Tak by to vypadalo, pokud by se zadání neměnilo a schéma, které jsme dostali na začátku, by bylo stejné po celou dobu používání aplikace. Reálně to tak není a vždy dochází k nějaké úpravě schématu. Každá úprava bude vyžadovat menší či větší programátorský zásah do aplikace, a to jak u NoSQL, tak i u klasické relační databáze. U relačního schématu musíme také provést změny databáze, které mohou být netriviálního charakteru. U NoSQL to není nutnou podmínkou. Ukážeme si proč.

Začneme zlehka, řekněme, že se nám sešlo více filmů, které mají více než jednoho režiséra. Takže je potřeba rozšířit naše schéma o tabulku režisér, a tu přes klíč připojit k filmům. Což znamená poměrně radikální přestavbu databáze, která může i chvilku trvat v závislosti na počtu řádek v databázi. A to došlo pouze k relativně malé změně, že potřebujeme více režisérů. Z hlediska NoSQL je to jedno, tak se do databáze uloží více režisérů a aplikace se upraví, aby s tím počítala. Hotovo.

Tady jistě někdo namítne, že od toho se dělá analýza a to byla chyba při návrhu. Ano, u tohoto příkladu se dá diskutovat, že to byla chyba při návrhu. Jenže co má dělat takový SaaS poskytovatel? SaaS aplikace se vyznačují tím, že jedna instance aplikace obsluhuje více zákazníků. Často se stane, že zákazník chce nějakou malou změnu (z pohledu zákazníka, u poskytovatele to může vyvolat menší paniku). Poskytovatel nemůže jen tak měnit schéma, nehledě na to, že požadavky zákazníků si často protiřečí. Takže musí myslet na nějakou možnost přizpůsobení. Což se děje různým způsobem, buď přímo použitím NoSQL databáze nebo návrhem SQL schématu tak, aby se s touto možností vyrovnal. (Dobrý příklad je třeba open source wiki –  XWiki)

Výhody a nevýhody

V případě key-value je vidět, že budeme čelit velké redundanci dat a udržování integrity dat bude úkol pro aplikaci. Jakákoliv oprava dat bude znamenat prohledat všechny záznamy, kde se daná data nacházejí. Což bude netriviální operace. Na druhou stranu bude výpis dat velmi rychlý, stejně tak zápis. Máme také možnost snadno přidat další atributy k filmům či kinům. Tyto atributy mohou být třeba jen dočasné. Tyto dočasné atributy bude muset umět obsloužit aplikace a vlastně bude i nositelem jejich popisu. V závislosti na zvolené databázi (Redis,TokyoCa­binet, Project Voldemort apod.) dostaneme i dobře škálovatelné řešení.

V případě relačního modelu máme známé výhody: Data jsou snadno udržovatelná, dobře se udržuje i datová integrita. Data také budou  zabírat méně místa na disku, protože nejsou redundantní. Změna výpisu může znamenat pouze změnu SQL dotazu, nebude třeba přegenerovat celou databázi. Máme také k dispozici více materiálu o tom, jak klasickou SQL databázi navrhovat a udržovat v chodu. Na druhou stranu, pokud se vyskytnou speciální atributy, bude  to znamenat změnu schématu, což u více záznamů není operace na pár vteřin. Ukládání dat bude pomalejší (ACID, dokud nejsou data uložena ve všech tabulkách, nelze zapisovat další). 

Oba modely je možné zkombinovat a dostat tak výhody obou. Tj data budeme mít uložena pěkně relačně, takže se nám bude dobře udržovat integrita dat, a pro výpis dat budeme používat key-value databázi. Což třeba dělá Facebook (data jsou uložena v relační databázi, ale většina je cachována pomocí memcached) nebo LinkedIn, které stojí za Project Voldemort.

NoSQL nejen na straně serveru

Mohlo by se zdát, že podobné principy jsou záležitostí pouze pro server, jenže blízká budoucnost vás vyvede z omylu. Lokální úložiště, jak je definuje HTML 5, jsou přesně typem NoSQL. A vzhledem k jejich možnostem a směřování vývoje k poměrně rozsáhlým webovým aplikacím je jisté, že velká část dat se bude u klienta uchovávat. Byť třeba jen proto, že mu zrovna vypadlo připojení k internetu. Proto je dobré se již teď zabývat tím, jak data ukládat a jak v nich lehce vyhledávat.

Jan Kodera

Jan Kodera

Jan Kodera je technickým ředitelem ve startupu Abakowiki. Patří mezi největší propagátory moderních IT, jako je SaaS či cloud computing.

Kurz SEO - Praha, Brno

DW - Školení SEO
  • Jak fungují vyhledávače a co od nich můžete očekávat.
  • Analýza klíčových slov - kde hledat, jak slova vybrat, jak optimalizovat.
  • Metody linkbuildingu - jak získat zpětné odkazy aniž byste za ně museli platit.
  • Vyhodnocování SEO - nesledujte jen pozice.

Další informace o kurzu SEO »

Akce: Využijte last minute slevu na školení v Brně!

Přehled názorů

porad nevidim vyhodu
youda 31. 3. 2010 02:55
Nový
└ 
Re: porad nevidim vyhodu
Vembloud 31. 3. 2010 08:16
Nový
 
├ 
Re: porad nevidim vyhodu
Aleš Roubíček 31. 3. 2010 10:21
Nový
 
│
└ 
Re: porad nevidim vyhodu
Karel Minařík 31. 3. 2010 13:43
Nový
 
│
 
└ 
Re: porad nevidim vyhodu
Karel Minařík 31. 3. 2010 14:19
Nový
 
│
 
 
└ 
Re: porad nevidim vyhodu
volani.webnode.cz 27. 9. 2010 04:34
Nový
 
│
 
 
 
└ 
Re: porad nevidim vyhodu
Václav Novotný 27. 9. 2010 09:31
Nový
 
└ 
Re: porad nevidim vyhodu
kocour_easy 31. 3. 2010 11:26
Nový
pouzitie
ubelimubelimuk 31. 3. 2010 03:50
Nový
└ 
Re: pouzitie
Martin Malý 31. 3. 2010 23:59
Nový
 
└ 
Re: pouzitie
ubelimubelimuk 1. 4. 2010 11:57
Nový
 
 
└ 
Re: pouzitie
Martin Malý 1. 4. 2010 13:10
Nový
 
 
 
└ 
Re: pouzitie
ubelimubelimuk 1. 4. 2010 16:02
Nový
SQL+NoSQL
rooobertek 31. 3. 2010 08:58
Nový
NoSQL je pro Pankáče
Dušan Jícha 31. 3. 2010 09:47
Nový
├ 
Re: NoSQL je pro Pankáče
Ondra Satai Nekola 31. 3. 2010 09:56
Nový
│
├ 
Re: NoSQL je pro Pankáče
Dušan Jícha 31. 3. 2010 10:20
Nový
│
├ 
Re: NoSQL je pro Pankáče
ahl 31. 3. 2010 10:23
Nový
│
└ 
Re: NoSQL je pro Pankáče
Karel Zak 31. 3. 2010 14:08
Nový
│
 
└ 
Re: NoSQL je pro Pankáče
Jakub Vrána 31. 3. 2010 14:54
Nový
│
 
 
├ 
Re: NoSQL je pro Pankáče
Karel Zak 2. 4. 2010 09:55
Nový
│
 
 
│
└ 
Re: NoSQL je pro Pankáče
Karel 2. 4. 2010 10:51
Nový
│
 
 
└ 
Re: NoSQL je pro Pankáče
uf 16. 4. 2010 22:59
Nový
└ 
Re: NoSQL je pro Pankáče
backup 31. 3. 2010 10:24
Nový
 
├ 
Re: NoSQL je pro Pankáče
Dušan Jícha 31. 3. 2010 10:45
Nový
 
│
├ 
Re: NoSQL je pro Pankáče
backup 31. 3. 2010 11:14
Nový
 
│
│
└ 
Re: NoSQL je pro Pankáče
Vasek 31. 3. 2010 13:06
Nový
 
│
│
 
├ 
Re: NoSQL je pro Pankáče
JE 31. 3. 2010 14:54
Nový
 
│
│
 
│
└ 
Re: NoSQL je pro Pankáče
Vasek 31. 3. 2010 15:42
Nový
 
│
│
 
│
 
└ 
Re: NoSQL je pro Pankáče
JE 31. 3. 2010 17:27
Nový
 
│
│
 
│
 
 
├ 
Re: NoSQL je pro Pankáče
Vasek 31. 3. 2010 18:19
Nový
 
│
│
 
│
 
 
│
└ 
Re: NoSQL je pro Pankáče
JE 31. 3. 2010 19:36
Nový
 
│
│
 
│
 
 
└ 
Re: NoSQL je pro Pankáče
Karel 2. 4. 2010 11:15
Nový
 
│
│
 
│
 
 
 
└ 
Re: NoSQL je pro Pankáče
backup 2. 4. 2010 13:02
Nový
 
│
│
 
├ 
Re: NoSQL je pro Pankáče
backup 31. 3. 2010 22:08
Nový
 
│
│
 
└ 
Re: NoSQL je pro Pankáče
repulsive 12. 10. 2010 18:33
Nový
 
│
└ 
Re: NoSQL je pro Pankáče
JE 31. 3. 2010 13:18
Nový
 
│
 
├ 
Re: NoSQL je pro Pankáče
ondrah 31. 3. 2010 14:57
Nový
 
│
 
│
└ 
Re: NoSQL je pro Pankáče
JE 31. 3. 2010 15:10
Nový
 
│
 
│
 
└ 
Re: NoSQL je pro Pankáče
ondrah 1. 4. 2010 14:24
Nový
 
│
 
├ 
Re: NoSQL je pro Pankáče
Dusan Jicha 31. 3. 2010 21:11
Nový
 
│
 
└ 
Re: NoSQL je pro Pankáče
Martin Malý 31. 3. 2010 22:26
Nový
 
│
 
 
└ 
Re: NoSQL je pro Pankáče
JE 1. 4. 2010 10:01
Nový
 
├ 
Re: NoSQL je pro Pankáče
Ivan 31. 3. 2010 12:51
Nový
 
│
└ 
Java?
Franta Kučera 31. 3. 2010 14:57
Nový
 
│
 
└ 
Re: Java?
Ivan 31. 3. 2010 18:02
Nový
 
├ 
Re: NoSQL je pro Pankáče
ondrah 31. 3. 2010 12:55
Nový
 
└ 
Re: NoSQL je pro Pankáče
Karel 2. 4. 2010 10:58
Nový
 
 
└ 
Re: NoSQL je pro Pankáče
backup 2. 4. 2010 13:08
Nový
metodika pro návrh NoSql
Michal Augustýn 31. 3. 2010 09:52
Nový
└ 
Re: metodika pro návrh NoSql
Martin Malý 1. 4. 2010 00:10
Nový
Re: Návrh databáze - NoSQL vs SQL
Richard 31. 3. 2010 10:53
Nový
└ 
Re: Návrh databáze - NoSQL vs SQL
Michal Augustýn 31. 3. 2010 13:06
Nový
 
└ 
Re: Návrh databáze - NoSQL vs SQL
Franta Kučera 31. 3. 2010 17:07
Nový
 
 
└ 
Re: Návrh databáze - NoSQL vs SQL
Michal Augustýn 31. 3. 2010 19:12
Nový
 
 
 
├ 
XML v relační databázi
Franta Kučera 31. 3. 2010 23:28
Nový
 
 
 
│
└ 
Re: XML v relační databázi
Franta Kučera 1. 4. 2010 12:06
Nový
 
 
 
└ 
Re: Návrh databáze - NoSQL vs SQL
Pavel Stěhule 31. 3. 2010 23:34
Nový
key-value no-sql databaze maji radu vyhod
jkb 31. 3. 2010 10:59
Nový
└ 
Re: key-value no-sql databaze maji radu vyhod
Pavel Stěhule 1. 4. 2010 18:13
Nový
Možnosti v Javě
Milan Fořt 31. 3. 2010 18:50
Nový
assembler
Franta Kučera 1. 4. 2010 16:42
Nový
Až budou rozšířené SSD disky
Pepa 9. 2. 2011 20:09
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem