SQLite: Databáze pro váš web

Dynamické webové stránky mohou používat nejrůznější typy datových úložišť. Jedním z nich je velmi lehká a přitom výkonná databáze SQLite.

Webové stránky jsou v dnešní době nejčastěji spojovány s komponentami Apache, PHP a MySQL. Přitom ani jedna ze součástí však není nezbytná. Místo Apache může být Lighttpd nebo Nginx, místo PHP třeba Python a místo MySQL? Výběr je kupodivu docela velký. Většina webhostingů mívá sice v nabídce jen MySQL a případně i PostgreSQL, ale po prostudování konfigurace je obvykle možné najít i pět dalších databází.

Jedna z těchto pěti databází se může pyšnit tím, že umí jazyk SQL. Je to databáze SQLite, která si našla své místo zejména v mobilních přístrojích a také jako datové úložiště mnoha desktopových aplikací, zejména internetových browserů.

Nejedná se však o plnokrevnou databázi, jako výše jmenovaná sestřička. Není spuštěna jako démon, ale jedná se pouze o poměrně malou knihovnu, která je přilinkována k některému skriptovacímu jazyku. Neběží samostatně, ale umožňuje otevřít datový soubor a pracovat s ním prostřednictvím jazyka SQL.

Co všechno SQLite umí?

Základní povinností každé databáze je ACID: Atomicita, konzistence, izolovanost operací a trvanlivost dat. To vše splňuje. Dále je to CRUD, tedy schopnost databáze zapisovat, číst, modifikovat nebo mazat data dle požadavku aplikace. To také splňuje. Dále po takové databázi požadujeme znalost jazyka SQL na co nejvyšší úrovni. Zde SQLite také nezaostává a kromě řízení přístupových práv umí téměř vše, co má SQL databáze umět.

Co SQLite neumí?

SQLite nemá a ani nebude mít jednu důležitou vlastnost: Neumí korektně pracovat na sdíleném úložišti. Pokud by někdo chtěl SQLite používat přes NFS či Sambu, bylo by nejlépe, kdyby na to ihned zapomněl. Na síti totiž špatně funguje zamykání souborů kvůli přítomnosti vyrovnávacích pamětí.

Velmi často se setkávám s dotazem, jak tuto databázi zprovoznit sdíleně. Nijak. Nedělejte to. Použijte jinou databázi nebo si napište démona.

Polovičatá je i podpora Unicode. Jak autoři tvrdí, plná implementace Unicode by knihovnu zvětšila minimálně čtyřnásobně. Nebyla by pak „lite“. To nám však nebrání ukládat a číst data v UTF-8. Pokud bychom potřebovali například české řazení podle abecedy, museli bychom si ho sami dopsat do aplikace nebo do SQLite v jazyku hostitele.

Jak SQLite běží na webu?

Situace s PHP či Pythonem je zcela jiná. SQLite je přímo jejich součástí. Databázové soubory se lokálně otevírají v režii jádra operačního systému a nejsou tedy problémy s distribuovanými vyrovnávacími pamětmi. Zámky fungují tak jak mají i v případě, že se souborem pracují stovky skriptů současně.

Jak je to s podporou jazyka SQL? Databáze SQLite obsahuje podporu velké množiny příkazů jazyka SQL. Nenajdete v ní příkaz `GRANT`, ale je to tím, že SQLite neřeší přihlašování. Aplikace má přímý přístup k datovému souboru na disku. Přihlašování by bylo jen zbytečnou obstrukcí, která by se stejně dala obejít.

Databáze SQLite má pro vývojáře jednu zvláštní vlastnost: Místo pevné datové struktury má jen tzv. typovou afinitu. Do každého sloupce můžete zapsat hodnotu jakéhokoli typu, která je dle možností převedena na typ sloupce nebo ponechána jak je. Je to výhodné zejména v kombinaci s dynamicky typovanými jazyky, jako jsou právě PHP a Python.

Podpora transakcí je v SQLite samozřejmostí, integritní omezení a cizí klíče také. Najdeme zde i triggery. Nejsou zde vnořené procedury, ale vzhledem k tomu, že mezi aplikací a databází nedochází k síťovým přenosům, nejsou ani potřebné. Přímo v jazyku SQL je pak možné používat funkce napsané např. v PHP.

Jak je to s konkurenčním přístupem?

Konkurenční čtení je v SQLite vyřešeno. Při zápisu se však projevuje velmi kritizovaná vlastnost: Aplikace si po dobu vykonávání zapisující transakce zamkne celou databázi. Ostatní aplikace mohou v tentýž okamžik pouze číst původní data. Nově zapsaná data však vidí až po potvrzení transakce. Pokud potřebuje zapisovat víc procesů současně, řadí se do fronty.

Jak je to s výkonem?

Vývojáři sami tvrdí, že SQLite není náhradou velkých databází, ale spíš náhradou `fopen()`. Pokud budeme od takové databáze požadovat komplexní dotazy, nejspíš s výkonem spokojeni nebudeme. Stačí se však podívat na velké množství skriptů válejících se v hlubinách Internetu: Většina u nich vytahuje data z jedné tabulky nebo provádí jen několik málo spojení více tabulek. Při tomto použití nás výkon SQLite příjemně překvapí.

Proč používat SQLite pro web?

SQLite má velmi příznivou licenci Public Domain. Můžeme ji tedy bez omezení používat v komerčních i nekomerčních aplikacích. Také výkon je u aplikací, které data převážně čtou (u webu je to typicky přes 90 %) vynikající. Množství databází je omezeno pouze velikostí dostupného diskového prostoru, stejně jako i velikost databáze.

Vývojáře však bude spíš zajímat, jakým způsobem bude s databází pracovat.

Jak je to s verzemi?

V současné době jsou k dispozici tři verze:

  • SQLite 2 – zastaralá verze, pro nové projekty by se již neměla používat
  • SQLite 3 – produkční verze, kterou doporučuji pro ostré nasazení
  • SQLite 4 – nejnovější verze, se kterou jsem se ještě pořádně neseznámil

Tyto verze jsou udržovány paralelně, každá z nich používá jiný formát datového souboru. V PHP jsou v současné době stále k dispozici ovladače pro SQLite 2.

Verzi SQLite 3 je v PHP doporučeno používat pouze prostřednictvím třídy PDO. Knihovnou PDO, která zajistí vazbu mezi databází a strukturami či objekty v PHP, se budu zabývat příště.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 45

Přehled komentářů

Tomáš Neumí správně řadit?
Vlastimil Pospíchal Re: Neumí správně řadit?
Honza Kral Re: Neumí správně řadit?
Vlastimil Pospíchal Re: Neumí správně řadit?
janek Re: Neumí správně řadit?
Vlastimil Pospíchal Re: Neumí správně řadit?
Martin Sura Re: Neumí správně řadit?
Vlastimil Pospíchal Re: Neumí správně řadit?
David Grudl Re: Neumí správně řadit?
Martin Velmi pomalé vložení řádku do tabulky
Vlastimil Pospíchal Re: Velmi pomalé vložení řádku do tabulky
Martin Re: Velmi pomalé vložení řádku do tabulky
Vlastimil Pospíchal Re: Velmi pomalé vložení řádku do tabulky
okbob Re: Velmi pomalé vložení řádku do tabulky
Vlastimil Pospíchal Re: Velmi pomalé vložení řádku do tabulky
Martin Re: Velmi pomalé vložení řádku do tabulky
uplnej vypatlanec Re: Velmi pomalé vložení řádku do tabulky
uplnej vypatlanec Re: Velmi pomalé vložení řádku do tabulky
uplnej vypatlanec Re: Velmi pomalé vložení řádku do tabulky
Honza Kral Re: Velmi pomalé vložení řádku do tabulky
Martin Re: Velmi pomalé vložení řádku do tabulky
David Grudl Co se to děje se Zdrojákem?
Vlastimil Pospíchal Re: Co se to děje se Zdrojákem?
Honza Černý Re: Co se to děje se Zdrojákem?
head Re: Co se to děje se Zdrojákem?
blizz OODBMS / pst RDBMS
jirkakosek Re: OODBMS / pst RDBMS
Vlastimil Pospíchal Re: OODBMS / pst RDBMS
Petr Prchal Chjo...
jakubvrana Využití SQLite
David Grudl Re: Využití SQLite
jakubvrana Re: Využití SQLite
David Grudl Re: Využití SQLite
jirkakosek Re: Využití SQLite
Vlastimil Pospíchal Re: Využití SQLite
jirkakosek Re: Využití SQLite
Vlastimil Pospíchal Re: Využití SQLite
jakubvrana Re: Využití SQLite
Martin Re: Využití SQLite
klw Re: Využití SQLite
honza sqlite funguje
Martin Ještě dotaz na znalé SQLite
Vlastimil Pospíchal Re: Ještě dotaz na znalé SQLite
Martin Doplnění
Martin
Zdroj: https://www.zdrojak.cz/?p=9478