ORM: LeanMapper vs Doctrine
- chikeet
- Člen | 160
Zdravím,
rozhoduju se, jaký ORM použít pro nový projekt (a výhledově pro další
projekty). Zajímá mě hlavně srovnání LeanMapperu a Doctrine. LeanMapper
používám přes půl roku, s Doctrine zatím zkušenosti nemám.
Co mě zajímá:
- jaké jsou vaše celkové zkušenosti a spokojenost s praktickým používáním
- přednosti a slabiny obou ORM
- ukecanost
- výkon
Předem díky za každý pohled na věc.
Editoval chikeet (3. 2. 2015 18:54)
- Tharos
- Člen | 1030
Ahoj,
považuji se za člověka, který se nestydí přiznat změnu svého vlastního názoru, a proto Ti rád popíšu svůj pohled na věc s odstupem téměř dvou let a mnoha zkušeností. :)
S oběma nástroji mám nemalé zkušenosti (ano, díky DameJidlo.cz i s Doktrínou) a s oběma jsem celkově dost spokojený. Jen se ty dva nástroje navzájem hodně liší.
Doktrína je plnokrevné ORM. Převede Ti relační model na (bohatý) objektový model a zpět. Dělá to dobře, byť to něco stojí (výkon, nárůst komplexity…). Ale s tou cenou se z principu nedá nic moc udělat, O/R mapování je prostě rozsáhlý problém. Důležité je, že pokud opravdu naplno využíváš OOP a Tvá aplikace je netriviální, zaplatit zmíněnou cenu se Ti stejně vyplatí, protože výhody plynoucí z bohatého objektového modelu to převáží.
Lean Mapper svým způsobem není plnokrevné ORM. Entity v něm jsou potomci nějaké speciální třídy, která zapouzdřuje traverzování mezi entitami a „podobné fígle“. Tento přístup má svá úskalí, která víceméně plynou z toho, že takovéto entity jsou spíše než doménovými objekty jen jakýmisi obálkami nad relačními daty. Ale právě díky tomu je Lean Mapper rozhodně méně komplexní, rychlejší než Doktrína, zkrátka je to něco za něco. Dalo by se říct, že Lean Mapper je takové rozšíření NotORM myšlenky: data se v něm z databáze získávají stejně, ale navrch jsou navíc ještě zabalena do „entit“, které jim přidávají rozhraní.
Tak a teď bys určitě ráda slyšela nějaké resumé…
Pokud programuješ spíše složitou aplikaci a jsi zdatná v OOP, budeš s Doktrínou myslím dobrá kamarádka. Nevýhody, které má, Ti převáží výhody, které plynou z bohatého objektového modelu. Lean Mapper by Tě v takovém případě asi zbytečně omezoval v rozletu.
Pokud se ale Tvé pojetí OOP spíše blíží procedurálnímu programování (to poznáš například tak, že Ti přijde OK onen slavný pětivrstvý model od Honzy Tichého, nebo tak, že entity vnímáš jako hloupé přepravky na data), mohlo by se stát, že při nasazení Doktríny bys „vyžrala“ všechny její nevýhody (režie, snížený výkon, komplexita, upovídanost…), ale nevytěžila z ní dostatek výhod. Pak Ti může Lean Mapper udělat lepší službu.
Zajímaly Tě konkrétní silné a slabé stránky, tak alespoň z mého pohledu…
Dotrine
Plusy
- Plnokrevné ORM
- Výborná dokumentace
- Snadná integrace do Nette (Kdyby\Doctrine)
- Velké množství uživatelů, výborná podpora
Mínusy
- Relativně velká režie
- Poměrně vysoká vstupná bariéra (obzvláště pokud nejsi kovaná v OOP)
- Tak trochu černá skříňka, internals jsou obtížné na pochopení
- Vcelku ukecaná
Lean Mapper
Plusy
- Minimální režie, rychlá knihovna
- IMHO relativně snáze pochopitelné internals a celý kód knihovny (ale tohle je hodně subjektivní)
- Velmi málo ukecaná knihovna
Mínusy
- Není to plnokrevné ORM, je to takové skoro-ORM
- Nemá dokončenou dokumentaci a přiznávám otevřeně, že lepší to s ní asi už nikdy nebude
- Řádově menší množství uživatelů, je nás hrstka :), podpora je taková… „open sourcová“
A na závěr ještě nějaké testimoniály… Doktrínu používám denně v DameJidlo.cz a v DJ logistice a u těchto projektů si popravdě nedokážu dost dobře představit, že by běžely na něčem jiném, než na plnokrevném ORM. Snad možná nad PostreSQL s logikou v databázi. :)
Naopak Lean Mapper mi k velké spokojenosti pohání nemalé množství malých (až mikro) projektů. Ale běží mi na něm například i e-shop www.helvetia-hodinky.cz, který už není úplně triviální (filtry, objednávkový proces, stromové struktury…) a slouží mi na něm velmi dobře. Při jeho psaní jsem cítil, že to je přesně hranice, kdy se to láme. Určité věci by se mi v tom e-shopu dělaly s Doctrine snáze, ale zase s Lean Mapperem e-shop běží velmi rychle, na dotazy posílané do databáze je radost pohledět… a i vývoj šel celkově velmi dobře od ruky.
No, tak si to nějak přeber. :) Já osobně jsem rád, že umím zacházet s oběmi těmito knihovnami a podle situace volím jednu či druhou. Pokud Doktrínu neovládáš, rozhodně Ti doporučuji seznámit se s ní. Minimálně Ti to obrovsky rozšíří obzory a časem se sama budeš umět dobře rozhodovat, co kde použít.
Editoval Tharos (5. 2. 2015 8:23)
- Tharos
- Člen | 1030
@hrach Co mě mrzí je, že právě na blogu za 15 minut se
síla Doktríny neprojeví. IMHO z toho vyjde nejhůř, protože si právě
„vyžereš“ hodně z té režie, kterou s sebou Doktrína nese, ale
vytěžíš jen málo z toho, že se Tvůj model sestává z čistokrevných
objektů. To proto, protože v blogu za 15 minut (tj. snad
nejsnazší možný CRUD
) entity stejně budou jen jakési
přepravky na data. Takové zadání s Lean Mapperem nebo Nextras\ORM rozhodně
naimplementuješ rychleji a pohodlněji.
Mluvím z vlastní zkušenosti, sám jsem Doktríně přišel na chuť až v kombinaci s velkou code base a košatou doménovou logikou.
@chikeet Já bych spíše doporučil podívat se na nějakou rozsáhlejší ukázku práce s Doktrínou. Napadá mě například zdrojový kód help.kdyby.org.
Ještě k Nextras\ORM – určitě má blíže k „plnokrevnému ORM“ než Lean Mapper a je-li už odlazené, rozhodně neprohloupíš, když ho zahrneš do svého srovnání. :)
- Petr Hudík
- Člen | 49
@Tharos Rád bych se Tě, jako vývojáře LeanMapper, zeptal, jaké máš s LM plány do budoucna, budeš ho i nadále podporovat? plánuješ nové funkce (chybí Ti tam vůbec něco)?
- Tomáš Kolinger
- Člen | 136
Pokud se ti líbí OOP, máš rád abstrakci, tak je Doctrina dobrá volba. Je to sice „moloch“, má svoje nevýhody (resp. má nevýhody jako všechny ORM, tj. že nedocílíš maximálního výkonu jako s pure-SQL, či je náročné používat db-vendor-specific funkce/fičury, je to ukecané, …), nicméně za všechno negativní ti dá mnohem víc pozitivního, teď jen otázka, zda to dokážeš ocenit, resp. využít.
Pokud ti vadí ukecaný kód, chceš maximální výkon, chceš mít přístup ke všemu co ti tvoje databáze nabízí, pak jednoduše nechceš ORM. Můžeš udělat kompromis, vzít „trochu“ ORM, zahodit pár vrstev abstrakce, osekat to, přidat trochu magie, tím se výkon o něco zlepší, ukecanost nejspíše také a ve finále ti vznikne něco jako LeanMapper.
Nedá se říct, co je lepší. Protože je to hlavně o filozofii a o tom, co ti líp padne, jaký přístup je ti sympatičtější. V určitých pohledech bude mít každý z frameworků nevýhody, jinde zase výhody, ale v každym případě seš schopný ten CRUD napsat a docílit velmi podobného výkonu a z pohledu uživatele aplikace to bude úplně stejné.
Editoval Tomáš Kolinger (4. 2. 2015 11:28)
- mkoubik
- Člen | 728
Tomáš Kolinger napsal(a):
V určitých pohledech bude mít každý z frameworků nevýhody, jinde zase výhody, ale v každym případě seš schopný ten CRUD napsat a docílit velmi podobného výkonu a z pohledu uživatele aplikace to bude úplně stejné.
Především, pokud děláš CRUD aplikaci bez složitější domain logiky, tak ORM nejspíš nepotřebuješ a vystačíš si s nějakou validační vrstvou nad DBAL.
- chikeet
- Člen | 160
@Tharos Díky za vyčerpávající odpověď. Čekala jsem něco
v tom smyslu, ale nebyla jsem si jistá podrobnostmi.
@hrach Díky, zkusím, je fakt, že vlastní praktická zkušenost je
nenahraditelná.
Napadlo mě snížit ukecanost Doctrine přidáním nějaké magie (fakt se mi nechce psát getter na každou property, je to nezáživné a dost náchylné na chyby z nepozornosti), ale nejsem si jistá, jestli je to úplně dobrý nápad.
Má ta ukecanost Doctrine nějaký konkrétní přínos? Je to faktor, který mi vadí asi nejvíc, vstupní bariéra je jednorázový náklad, ale ta ukecanost mě bude stát čas pořád.
- Marek Šneberger
- Člen | 130
@chikeet Getter pro všechno psát nemusíš, pokud použiješ Kdyby/Doctrine a properties budeš mít protected a budeš dědit entity z Kdyby\Doctrine\Entities\BaseEntity. Nad private samozřejmě getter mít musíš.
- Jan Endel
- Člen | 1016
@chikeet tp je právě to krásné na ORM – entity nemusí být jen obálky nad daty, pro příklad jak vypadá kousek naší order:
class Order extends BaseEntity
{
/**
* anotace ...
*/
private $payedBy;
/**
* one to many vazba
*/
private $notes;
public function isPayedByCash()
{
return $this->payedBy === self::PAY_CASH;
}
public function getPreparationNote()
{
$criteria = Criteria::create();
$criteria->andWhere($criteria->expr()->eq('type', OrderNote::TYPE_PREPARATION));
return $this->notes->matching($criteria)->first();
}
}
a tímhle způsobem se nám dost logiky schová právě do entit s krásným api – a to je jedna z hlavních sil doctrine :-).
Editoval Jan Endel (4. 2. 2015 18:11)
- Tharos
- Člen | 1030
Petr Hudík napsal(a):
@Tharos Rád bych se Tě, jako vývojáře LeanMapper, zeptal, jaké máš s LM plány do budoucna, budeš ho i nadále podporovat? plánuješ nové funkce (chybí Ti tam vůbec něco)?
Mám nyní na GitHubu pár issues se štítkem approved feature, které bych rád doimplementoval. Plus mám ještě pár drobných vylepšení v hlavě. Pak bych vydal stable verzi a dál už Lean Mapper asi nijak výrazně nevyvíjel. Přiznám se, že už mi dochází fantazie, co by ještě měl umět. :) Rozhodně budu opravovat případné bugy (to mě nijak nezatěžuje, ono jich nikdy nebylo nijak moc).
Co se nějaké dokumentace týče, nevěřím, že někdy vznikne podrobná dokumentace plná ukázek, různých use-cases atp. Její tvorba by stála nemalé množství času, kterým (jako asi většina lidí zde) až tak úplně neoplývám… Přemýšlím ale, že bych uvolnil jako studijní materiál nějakou netriviální ukázku použití, například že bych očesal na nezbytné minimum třeba ten výše odkazovaný e-shop.
To vše jsou věci, které bych v průběhu jara mohl stihnout…
Co už ale nemám v plánu vyvíjet je knihovnu Lean Query. Ta je sice vcelku hezká programátorská hříčka a funguje dobře, ale k obecné použitelnosti ji přece jenom ještě dost chybí a v téhle oblasti dnes už prostě necítím potřebu psát očesaný klon DQL…
- Tharos
- Člen | 1030
chikeet napsal(a):
Napadlo mě snížit ukecanost Doctrine přidáním nějaké magie (fakt se mi nechce psát getter na každou property, je to nezáživné a dost náchylné na chyby z nepozornosti), ale nejsem si jistá, jestli je to úplně dobrý nápad.
Má ta ukecanost Doctrine nějaký konkrétní přínos? Je to faktor, který mi vadí asi nejvíc, vstupní bariéra je jednorázový náklad, ale ta ukecanost mě bude stát čas pořád.
Doctrine je upovídaná tak trochu z principu věci. Představ si, že píšeš model nějaké aplikace úplně bez persistence, tj. bez napojení na databázi. Vzniknou Ti objekty, které budou reprezentovat nějaké smysluplné celky, a data, která budou zapouzdřovat, do nich nějak budeš muset dostat. Takže přes konstruktor či různé settery. Pravděpodobně také alespoň vybraná data z těch objektů budeš chtít nějak číst zvenčí. Takže Ti vzniknou různé gettery. Plus samozřejmě budeš chtít ty objekty mít zvenčí nerozbitné, takže budeš ta vstupní data validovat atp. No a tohle celé nijak neošidíš, to je prostě OOP. :)
A k těm objektům, co Ti vzniknou, pak ještě přidej ORM anotace.
Souhlasím, že dost věcí je rutinních, a proto není od věci si pozvat na pomoc dobré IDE (ať už pro vygenerování skeletu potřebných getterů/setterů nebo chytré našeptávání) či magické věci z Kdyby\Doctrine.
S přibývajícími zkušenostmi poznáš, že to v praxi často není tak hrozné, jak se zdá. Například zjistíš, že řadu getterů/setterů vůbec nepotřebuješ. :) Tady bych určitě chtěl varovat před přístupem, kdy si po nadefinování položek v entitě hned vygeneruješ/napíšeš gettery/settery na ně bez rozmyslu, zda vůbec budou zapotřebí. Mám podezření, že tahle praktika pak obzvláště svádí k přesunu logiky z entit do různých servisních tříd, což prostě není best practice (používáš-li plnokrevné ORM).
Editoval Tharos (4. 2. 2015 18:08)
- newPOPE
- Člen | 648
Pekne zhrnutia.
Ktory z ORM si vybrat rozoberat nebudem nakolko to je otazka typu angularjs vs. estejs :). Tu jednoznacne vitazi Doctrine…
U mensich projektov by ti mohlo vyhovovat ze okrem ORM dostanes s tym console commandy, migrace a pod.
U velkych projektov ono u tych sa nema moc zmysel bavit nakolko malokedy sa stane ze uz na zaciatku vies co budes potrebovat a potom sa to uz velmi tazko prepisuje. Napr. ked zacnes vyuzivat features DB ako takej. Videl som Doctrine v projekte kde boli tables radovo v 10mil zaznamoch a poradila si s tym celkom dobre az napr. na hydraciu dat. Ono ludia si povedia ved maju teraz 2nd level cache. Len sa treba zamyslet kam uhnut ked to prestane stacit?!
A nakoniec sa pri kazdom projekte zamysli ci ORM vyuzijes.
- Filip Procházka
- Moderator | 4668
Udělal jsem dobře, že jsem se rozhodl na tohle neodpovídat, protože @Tharos to napsal moc pěkně :)
Jen bych doplnil, že Doctrine nijak neomezuje ve využívání všech features databáze. Velice snadno si můžeš dopsat funkce do DQL a hromada už je jich hotových a stačí je prostě jenom povolit v dql sekci konfigurace. A pokud něco v DQL zapsat nejde nebo se to nehodí, pořád jsou tu native queries.