Já se opravdu nechci bavit o tom, že aktuální ORM implementace mají velké problémy. Já se zajímám o prinicipielní problémy.
Možná se nesrozumitelně vyjadřuju, beru. Pokusím se tedy shrnout:
Principiální problém je v tom, že ORM je vrstva nad databází. Očekává se od ní trochu něco jiného než od té databáze.
Pokud bychom přijali, že ideální ORM bude 100% efektivní abstrakce nad databází, v podstatě pak už by databáze nebyla potřeba. Do ORM by se doimplementovaly storage operace a bylo by hotovo.
To je zajímavá úvaha, ale nevidím v ní potenciál. Já nemám problém s existencí db. Mě relační databáze maximálně vyhovují. Já chci na nich stavět. Podle mě to, že ORM je vrstva nad databází je cajk - jasně, nějakým mapováním z ORM do SQL se ztratí nějaká ta setinka (sic!), ale furt lepší, než reimplementovat ty mraky práce odvedených nad databázemi. Nehledě k tomu, že relační algebra je ideální (technologickej i mentální) základ.
Kdepak. Toto nechme být, tak je to správně.
ORM - jakožto pojem - má smysl jen právě proto, že nepřívětivé vlastnosti databáze mapuje do přívětivých objektových operací ve vyšším programovacím jazyce.
Přesně tak.
Toto nelze vyřešit jinak, než kompromisem. Tedy ztráta pramenící z principu, nikoliv z implementace.
Tuto příčinnost zde nepozoruji.
Pavel trefně zmínil absenci statistik (které samy o sobě nedávají 100% odraz skutečnosti). Taky to, že co má databáze při ruce s minimální režií, ORM může získat jen za cenu poměrně vysoké režie (síťová, a další mezivrstvy). Tedy další ztráta pramenící z principu a ne z implementace.
Ve skutečnosti to není ani pravda, ani směrodatné.
Pokud mají databáze statistiky, tak ať je mají. Já jim je přece nechci brát.
ORM tý databáze do ničeho nekecá. Jen ať dělá co nejlepšího umí.
Zde je naprosto mylně uvedený vztah. Nejedná se o ORM versus DB. Ale o ORM versus vývojář.
Pokud je třeba získat nějaké informace, tak se ptáme - kdo je dokáže získat lépe stroj=ORM, nebo vývojář?
A pak je tu ten třetí důvod, o kterém můžeme diskutovat, jestli je principiální, nebo implementační. To je volba strategie programátorem. Já ji považuji za principiální. U složitých úloh by se jistě dalo uvažovat o tom, že budoucí optimalizátory budou rychlejší a efektivnější. Jenže pořád tu zůstává velká řada triviálních úloh, u kterých může programátor strategii přímo určit a lze ji považovat za optimální. Tedy, můžeme diskutovat o tom, že by v budoucnu mohlo ORM (kdyby mělo statistiky a mohlo vytvářet hinty), mohlo být efektivnější ve složitých úlohách, než ploché SQL, protože ORM má o struktuře dat trochu jiné, a v určitém ohledu lepší informace. Stejný mechanismus by však zdržoval u triviálních úloh, u kterých by programátor stejně dál preferoval sám určit a vysvětlit postup vykonání. Tedy, ručnímu zásahu by se nedalo vyhnout, pokud bychom hledali výkon.
Výborně. Toto mi dává smysl.
Podle mého názoru, ORM je k tomu, abychom pracovali s nějakými daty nějakým jiným, snad lepším, způsobem. Tak, jak jsi to pěkně popsal o pár odstavců výše. A hlavně aby usnadnilo ruční práci co se mapování týče. Já vůbec nemám problém s tím, aby vývojář tomu ORM řekl, že v tomto a v tomto případě má zvolit jinou strategii. Ve skutečnosti si myslím, že schopnost ORM ukázat, jaký SQL nakonec do db posílá považuju za zcela nutnou funkci. Stejně jako možnost do toho ORMku kecat.
Zároveň si myslím, že kecat mu do toho bude muset jen v několika málo případech.
Možná by se to dalo popsat tak, že v kanceláři si v nějakém budoucím fantastickém ORM naklikají najaký datový model (samozřejmě blbě), ORM z toho syncne změny do databáze a vesele ukládá. Firma funguje, následně narůstají data, databáze se zadejchává, zavolají si Odborníka. Ten zkontroluje datovej model, upraví. Pak zkontroluje statistiky dotazů, a zhodnotí, že na tomto a tomto místě ORMko zvolilo nevhodnou strategii, a změní to.
Nevidím zde prostor pro optimalizaci v podobě constraintů v databázi, protože buď je ORM blbé, a programátor to tam teda doplní ručně a ORM mu nebrání; nebo je ORM schopné, a ví, že ten contsraint může vložit do databáze a udělá to.