Zrovna píšu takovou jednoduchou Java EE aplikaci. Funkcionalita je daná, vychází z požadavků – pojďme se tedy podívat na technologie: např. to, co vyřeším pomocí jednoho SQL nebo XPath dotazu, bych psal v „čistém Céčku“ na kolik logických řádků? Skutečně by to bylo méně kódu a byl by přehlednější? Konverzi a filtrování dokumentů bych měl dělat místo v XSLT taky v C? Opravdu by to bylo efektivnější a čitelnější? Měl bych raději použít „plain text“ a souborový systém a napsat si nad tím na zelené louce „pár funkcí v Céčku“, místo abych použil relační databázi, kterou již napsal, odladil a otestoval někdo jiný? Nepřijde mi to jako dobrý nápad – takový software by byl mnohem dražší, vývoj by trval déle a údržba a rozvoj by byly obtížnější.
a nejde jen o to napsat to v C, ale proc tam jsou obludnosti
jako: sql, xpath, xslt.
ja si lepsi svet predstavuji jako misto, kde neni sql databaze.
misto toho jsou ruzne filesystemy pro ruzne pouziti (male/velke soubory, read-only, komprimovane....)
misto xml muze byt zase filesystem s textovymi, obrazkovymi, hudebnimi soubory.
staci takovy filesystem zatarovat a mate v nem totez co v xml.
takze filesystem je prirozena reprezentace stromu, vsecko ostatni lze udelat pomoci toho.
Hmm, a ktery filesystem ti v transakci secte hodnoty v souborech, nastavi jim prizkank zpracovano a vlozi vysledek do jineho souboru? Proste SQL ma sve pouziti, a je rozsirena prave pro to, ze dovoluje oprostit se od popisu jak se k vyslednemu fungovani dostat. Jen popises co ma byt vysledkem. Diky tomu je mnoho programu citelnejsich a snadneji spravovatelnych, polovina jejich funkcionality je totiz schovana ve fungovani SQL serveru. Z tohoto pohledu maji vyrazne mene logickych radek nez bez SQL.
Všechno nejde udělat pomocí stromu. Co takhle DAG, nebo nějaký úplně obecný graf? A jinde je zase strom zbytečně obecný. Relace je tabulka a cpát na ni strom je imho zbytečné. Proč napasovávat SQL (a relační databáze obecně) na stromy, když ty stromy budou stejně degenerované (alespoň z vnějšího pohledu)?
Mimochodem co indexy? Filesystém zaindexuje podle primárního klíče (název souboru), ale co ty další? Pokud přidám další pomocné soubory nemám nakonec zase implementaci relační databáze?
A k tomu xml : Jak bude vypadat ten soubor, které ty obrázkové, textové a hudební soubory složí dohromady? Takhle přece vypadají *.odt a podobně. Je to zip s hromadou souborů a jedním xml, které říka jak je to spojené dokupy.
Doc není proprietální filesystém v souboru. Doc je memorydump (nebo hodně jednoduchá serializace) COM objektů z wordu. KISS princip dotažený do dokonalosti :) Jen to kapku drhne.
A odt je plný xml, takže by měl být v kontextu tohohle článku špatný, ne? A Java je přece zlo taky. A v tom jaru se to zlé xml taky najde.
> vsecko ostatni lze udelat pomoci toho.
Však ono to tak je také uděláno, drtivá většina SQL strojů stojí a padá na API filesystému a pokud aplikace potřebuje velké data, tak se nedávají do SQL, ale normálně se uloží standardně do filesystému a do SQL se dávají jenom odkazy na ně.
Taktéž není třeba všude instalovat "velké" SQL servery. Existují i malé SQL věci, kde stačí k aplikaci přidat 2 ks DLL/SO a aplikace může využívat vymoženosti SQL.
Dobrý databázový systém nemá s velkými soubory problém, klidně tam můžeš naprat obrovské BLOBy – databáze si to stejně uloží do separátních souborů, ale ty od toho abstrahuješ – je ti jedno, jestli je to několika-prvkové pole bajtů nebo gigový ISO obraz, s obojím můžeš pracovat pomocí stejného API.
Ten důvod proč dávat velké soubory rovnou na FS než do databáze je spíš ten, že z databáze ty data musí obvykle protékat přes tvoji aplikaci a zbytečně ji to zatěžuje – zatímco z FS to můžeš třeba nasdílet nějakým jednoduchým protokolem po síti nebo jen dát příkaz HTTP serveru, aby servíroval určitý soubor z disku (tzn. data nemusí fyzicky téct přes tvoji aplikaci, ale přesto si u nich můžeš řídit uživatelská oprávnění nebo logovat přístupy).
Někde svoje místo databáze mají, ale je potřeba na to jít s rozmyslem. Boeing 747 taky převeze skoro všechno, ale asi bych s ním neletěl 10km do stavebnin pro pět pytlů cementu. A jsou jedinci schopní zatěžovat systém během nějaké SQL databáze, aby na statické weboce vygenerovali menu.
XML bych nezatracoval. Je čitelný / editovatelný i ručně a reprezentuje strom. Existuje lepší textový formát třeba pro hierarchický dokument (nadpisy několika úrovní,...),? Wiky, Texy,... jsou proprietální a nestandardní formáty. Je potřeba v čitelné formě uložit vektorovou grafiku? Bod má dvě souřadnice, kruh tři, úsečka čtyři... V CSV se to v textové formě ukládá blbě, tak budou generovat řádky s příkazem a parametry a psát na to parser, když můžou použít hotovou implementaci DOM a ušetřit si práci? Tak tomu, pánové, říkám masochismus...
"zatěžovat systém během nějaké SQL databáze" - nezlobte se, ale to je naprosty nesmysl. Pokud k DB nepristupuji, tak zatezuje procesor bud uplne minimalne, nebo dokonce vubec.
Prirovnani k 747 je uplne mimo. Kdyz mam nejaky web, a zvysi se mi skokove navstevnost 1000x, vetsina SQL DB to v pohode zvladne, ale nejake ad-hoc reseni se pravdepodobne uvari. Klicove slovo: "skalovatelnost"
XML bych zatracoval velmi silne. Ano, existuje - mnohokrat jednodussi na parsovani, neskutecne vic rucne citelny a nekolikanasobne mensi co se velikosti vysledneho souboru tyce - JSON.
Nicmene prestoze bych XML zatracoval, uznavam, ze diky svemu rozsireni jako defacto standard je to nezbytne zlo. A lepsi pouzit XML nez nejaky svuj "suckless" format.
Myslim ze tady je zrejme, ze "ze zatezovat system behem SQL databaze" bylo mysleno tak, ze staticke menu ke staticke strance je generovano SQL dotazem do databaze (v horsim pripade zabalenym do nejakeho ORM, takze to nacteni menu z te databaze vytahne i obsach vsech odkazovanych stranek, ktery nasledne zahodi).
> v horsim pripade zabalenym do nejakeho ORM
V čem nepoužití ORM (nebo jiné abstrakce) zjednoduší kód? (tak aby měl méně logických řádek, o to nám přeci jde, ne?) V té své aplikaci jsem tentokrát žádné ORM nepoužil – chtěl jsem změnu, trochu se potrénovat a víc si užít SQL :-) mít blíž k databázi a část implementovat pomocí DB procedur. To se povedlo a s výsledkem jsem spokojený, nicméně realita je taková, že jsem musel napsat o něco víc kódu, než kdybych použil ORM – tam by totiž stačilo pár anotací a o zbytek by se postaralo JPA. Není to nějak drastické (zvlášť u takhle malé aplikace), nicméně ta tendence je jasná: nepoužití ORM → více ručně psaného kódu.
> takze to nacteni menu z te databaze vytahne i obsach vsech odkazovanych stranek, ktery nasledne zahodi
Obyčejný FUD, možná to tak v nějakých parodiích na ORM je, ale v zásadě by neměl být problém si vytáhnout z databáze jen určitá data. V JPA můžeš napsat dotaz tak, aby výsledkem byly instance nějakého úplně jiného objektu (který ani nemáš namapovaný na databázi). Vtip je v tom, že je to silně typované – lezou z toho objekty, ne nějaké beztypové pole, u kterého nevíš, co uvnitř bude a musíš to přetypovávat a doufat.
A kdyby nic jiného: můžeš použít klasický SQL dotaz, i když ve zbytku aplikace používáš ORM.
Ano dobre (a spravne pouzite) ORM snizuje pocet logickych radek (zvysuje citelnost) aniz by se vyzname zvysila narocnost. Jenze to spravne pouziti ORM casto predpoklada, ze clovek, ktery ho pouziva, vi (zhruba) co to ORM vykona, kdyz neco napise. Ostatne to je i pripad SQL, je skvele tim, ze se nemusite zabyvat jak presne dojde SQL server k vysledku, ale musite priblizne vedet kde pouzije indexy, kdy udela sekvenci scan, a tak podobne, jinak se vam muze stat, ze pouzijete neco se spotrebou boeingu 747 na cestu do trafiky pred barak. Proste jak psal 'Petr M' - nekde SQL a ORM opodstatneni maji, a nekde ne.
> ale proc tam jsou obludnosti jako: sql, xpath
Protože aplikace si potřebuje držet stav – data (nebudu říkat záznamy nebo objekty, protože to už je implementační detail, abstrahujme od toho) a s těmi daty potřebuji něco dělat. A většinou ale ne se všemi daty, ale s nějak definovanou podmnožinou. Buď si na to napíšu SQL dotaz s WHERE podmínkou nebo třeba XPath dotaz, který vyfiltruje elementy na základě jejich atributů a dalších vlastností… a nebo bych mohl pokaždé v Céčku iterovat přes pole všech dat a pomocí několika IFů z nich vytahovat požadované položky.
Jak relační databáze, tak XML databáze podporují indexy a tohle hledání/filtrování je efektivní – většinou nemusím dělat full table scan.
Plus, jak už tady padlo, transakce, agregační funkce atd. – tohle všechno mám při použití databáze „zadarmo“ – nemusím to programovat, nemusím to testovat, prostě to funguje. Prostě dám BEGIN a COMMIT a nemusím řešit, v jakém pořadí mám přejmenovávat a přepisovat soubory a dělat nějaké další vylomeniny, aby byl systém po případném výpadku v alespoň trochu konzistentním stavu. A když narazím na něco, co se mi nelíbí, dám ROLLBACK a vše je zase v původním stavu – nemusel jsem si kvůli tomu někam poznamenávat všechny provedené kroky a návod, jak je vrátit zpátky – to za mě dělá ta „obludnost“ relační databáze. Funkce jako sum, min, max, avg… mi spočítají výsledek, aniž bych ta data musel natahovat do mé aplikace – který souborový systém tohle umí? Leda tak spočítat počty souborů nebo orientačně obsazené místo, ale tím to hasne – obsahu souborů nerozumí a to už bych musel řešit ručně v aplikaci já.
> ale proc tam jsou obludnosti jako: … xslt
XSLT mi pomáhá např. zjednodušovat data – není potřeba se na to dívat jako na nějaké XML, text s ostrými závorkami, ten tam ani nikde být nemusí – prostě je to strom tvořený uzly různých typů a ten já chci převést na jiný strom s podobnou strukturou, ale zachovat jen některé uzly a jiné trochu upravit nebo nahradit něčím jiným.
> misto toho jsou ruzne filesystemy pro ruzne pouziti (male/velke soubory, read-only, komprimovane....)
Souborový systém je dobré lokální API, docela fandím různým FUSE souborovým systémům, která zpřístupňují data (třeba i z SQL databáze nebo XML) formou FS a uživatel může abstrahovat od toho, jak jsou data uložena a pracuje s nimi vždy stejně jako se soubory. Ale není to všemocné – např. nějaké dotazování se tam dělá dost špatně (leda přes nějaké virtuální adresáře). Ale jako primární (nevirtuální) úložiště toho FS nabízí hodně málo – právě proto se nad ním používají buď databáze nebo nějaké chytře navržené formáty souborů (indexy, metadata…).
> misto xml muze byt zase filesystem s textovymi, obrazkovymi, hudebnimi soubory. staci takovy filesystem zatarovat a mate v nem totez co v xml.
Pokud napíšeš SAX parser, který umí tu adresářovou strukturu nebo .tar načíst, tak máš v podstatě pravdu. V té své aplikaci jsem si jen tak z legrace přidal ukládání metadat o souborech do jejich rozšířených atributů. Je to pár řádků (doslova) a vliv na výkon není měřitelný, takže proč ne :-) Takže mám (meta)data jak v relační databázi, tak na souborovém systému a můžu k nim přistupovat z obou míst. Ale schválně, kde je to jednodušší a efektivnější? Radši napíšu SQL nebo XPath, než abych psal cyklus v BASHi a v něm parsoval/grepoval výstup příkazu getfattr a v nějakém IFu rozhodoval, zda soubor na výstup zařadit nebo ne. Nebo mi snad FS nabízí nějaké API, které by mi umožnilo vyhledat soubory, které mají např. atribut aaa = 123 a zároveň atribut bbb > 5 ? Až něco takového bude existovat, velice rád to budu pro jednodušší aplikace používat. Do té doby zůstávám u „obludností“ typu SQL a XPath.
BTW: úplně nejlepší by bylo SQL/XPath rozhraní k souborovému systému, které by umožnilo pomocí standardního jazyka provádět dotazy nad soubory a adresáři :-)
> takze filesystem je prirozena reprezentace stromu, vsecko ostatni lze udelat pomoci toho.
Ono to lze i bez FS – některé DBMS můžou pracovat nejen nad FS, ale i nad blokovým zařízením, např. LVM oddílem. Ovšem to „lze udělat“ znamená, že někdo musí napsat spoustu funkcí/metod obecně kódu – a většinou nemám důvod toto implementovat znova a znova ve svém aplikaci, ale použiji nějakou databázi, kde už je to hotové.
ja jsem velky zastance vsecho jako fs.
ja bych naopak zase zminil sqlfs, xmlfs.
http://www.slideshare.net/jserv/plan-9-not-only-a-better-unix
Myšlenky to jsou zajímavé, ale někdy mi ta snaha napasovat všechno na soubory přijde trochu moc kostrbatá – viz třeba příklad:
% cat /net/tcp/clone/ct1 44 % cd /net/tcp/44 % echo connect 128.2.194.80!79 > ct1 % echo ping > data % cat data pong
Trochu mi to připomíná současnou situaci kolem RESTu – tam je taky často vidět až křečovitá snaha udělat ze všeho „resources“ až těm lidem někdy uniká, že podstata té řešení úlohy je ve skutečnosti procedurální. Ano, i procedura se dá volat přes CRUD operace, ale není to ono…