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

Hlavní navigace

Doctrine 2 a NotORM - videotutoriál

Seriál o Doctrine 2 od Honzy Tichého vzbuzuje mnohé diskuse. Jedním z vášnivých diskutujících je i autor následujícího textu z rubriky Subjektivně, Jakub Vrána. Rozhodl se na Doctrine 2 podívat kritickým okem a srovnat přístup tohoto ORM řešení s přístupem, který použil ve své knihovně NotORM.

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

Se zájmem jsem sledoval seriál o Doctrine 2 na serveru Zdroják, ale některým informacím se mi nechtělo uvěřit. Ne snad, že by byl seriál špatný, naopak ho považuji za celkem zdařilý, ale nezdál se mi samotný návrh některých věcí v Doctrine. A protože je seriál na příklady poměrně chudý, tak jsem se rozhodl vyzkoušet Doctrine 2 na příkladu vlastním a tím se s knihovnou lépe seznámit. Svoje pokusy a omyly jsem zaznamenal a vzniklé video vám teď nabízím ke shlédnutí.

Doctrine 2 – získávání dat

Screencast

Zdrojové kódy

Co se mi na Doctrine 2 nelíbí?

  1. Zhýčkán jednosouborovými minimalizovanými verzemi (jQuery, Nette Framework, Adminer, …) se mi moc nelíbí knihovna čítající 333 souborů.
  2. Část Doctrine závisí na části Symfony, která je obsažena i v distribuci. Vlastně by se tomu nedalo nic vytknout až do okamžiku, když bych chtěl v projektu použít jinou verzi Symfony, než kterou používá Doctrine.
  3. Je potřeba specifikovat adresář a jmenný prostor pro jakési proxy, i když se k ničemu nepoužijí.
  4. Při zadávání informací pomocí anotací je velmi snadné udělat překlep, o kterém se nijak nedozvíme.
  5. Vazební tabulky entit vytvořených v globálním jmenném prostoru postrádají první znaky. Podezíral jsem z toho betaverzi (tutoriál jsem vytvořil před vydáním ostré verze), ale dostalo se to i do finálního vydání.
  6. Pokud chceme s vazbami mezi entitami pracovat obousměrně, tak je také musíme na obou stranách ručně definovat.
  7. Prakticky nikde nás nemusí zajímat skutečné názvy sloupců, které Doctrine 2 generuje, ale v definici indexu je použít musíme.
  8. Sloupec přidaný do entity se při aktualizaci schématu nezařadí na správné místo, ale umístí se až na konec tabulky.
  9. Pro metodu EntityRepository::find existuje šikovná zkratka, pro velmi podobnou metodu EntityRepository::findAll ale tato zkratka neexistuje.
  10. Zcela zásadně mi vadí, že Doctrine 2 pokládá dotaz při každém průchodu cyklem, to je zabiják výkonnosti.
  11. Pokud chceme udělat něco jen maličko složitějšího (třeba setřídit záznamy), tak musíme použít jazyk DQL. Takže pokud si napíšeme kód třeba ve tvaru $em->getRepository('Article')->findBy(array('category' => $category)) a následně se dozvíme, že bychom články měli ještě podle něčeho setřídit, tak musíme tento kód smazat a celý ho přepsat do jazyka DQL.
  12. Při spojení tabulek, které DQL elegantně podporuje, se stejná data přenáší opakovaně. To není tak velký problém jako opakované kladení dotazů v cyklu, ale výkonnosti to také může škodit.
  13. Z mého pohledu se ten úplně největší problém projeví v případě, kdy se rozhodneme do vazební tabulky přidat sloupec s nějakou informací. V Doctrine 2 to znamená zahodit velkou část kódu a ještě více kódu napsat úplně od začátku. Přitom z pohledu zadavatele jde o úplnou maličkost („je to bezva, jen ještě prosím k těm nálepkám u článků přidej váhu“).

Můj celkový dojem z Doctrine 2 je bohužel takový, že i když se knihovna tváří jako vysokoúrovňová a tudíž by měla být robustní, tak skutečné chování je přesně opačné. Kvůli každé maličkosti se musíme uchylovat k jazyku DQL (který je velmi podobný SQL), což sice nemusí být pro řadu programátorů problém, ale rozhodně to má hodně daleko k vysokoúrovňovému objektovému přístupu, který bych od Doctrine očekával. Za ještě horší ale považuji to, že vytvořený kód není robustní a i drobná změna v zadání znamená jeho významné přepsání.

Na Doctrine 2 se mi líbí jedna věc – z definice entit se dá vygenerovat schéma. A i když tento proces není dokonalý a nepokrývá všechny možnosti databází, tak v tom spatřuji velkou výhodu hlavně při nasazování aplikace. Nicméně třeba fakt, že seriál o této funkci prakticky mlčí, ve mně prohlubuje podezření, že v praxi se tento postup spíše nepoužívá a schéma se definuje ručně, což je ta nejhorší možná varianta, protože stejnou práci je potřeba udělat dvakrát a změny se musí ručně udržovat na dvou místech.

Na autorově blogu si můžete přečíst odpovědi Lead Developera Doctrine na uvedené připomínky.

NotORM – získávání dat

Protože jsem sám autorem knihovny pro práci s daty v databázi, tak jsem z cvičných důvodů vyřešil stejnou úlohu i v knihovně NotORM.

Screencast

Zdrojové kódy

Na NotORM vidím oproti Doctrine 2 tyto zásadní rozdíly:

  1. NotORM se nestará o schéma databáze, což nás nutí definovat strukturu databáze externě, ale zároveň nám dovoluje využít všech možností databázového systému.
  2. NotORM pokládá konstantní počet dotazů, což je z pohledu výkonnosti často ten nejlepší přístup, protože se v každém průchodu cyklem nepokládá nový dotaz ani se nepřenáší stejná data opakovaně.
  3. Kód je velmi snadno modifikovatelný – pokud chceme např. setřídit záznamy, tak jednoduše za $category->article() doplníme ->order("published"). Stejně tak jsou triviální i změny v návrhu – když se rozhodneme k nálepkám článků přidat váhu, tak nemusíme smazat ani jeden znak stávajícího kódu.
  4. Pokud z tabulky nepotřebujeme získat všechny sloupce, tak to v Doctrine 2 můžeme zajistit pomocí DQL. NotORM nabízí podobný mechanismus, kromě toho se ale použité sloupce mohou vybrat také automaticky, což zajistí výkonnostně optimální řešení s využitím minimálního úsilí.

Kromě toho je kód využívající NotORM také podstatně kratší a přehlednější – velmi jednoduchým způsobem zkrátka vyjadřujeme myšlenku toho, co chceme s daty provést. Rozhodně se nedá říct, že by bylo zadání ušito na míru NotORM – jde o klasický demonstrační příklad využívající vazby 1:N a M:N. U složitějšího příkladu by rozdíl v pohodlnosti práce s knihovnami vynikl ještě lépe.

Další část

První část videotutoriálu Doctrine 2 se zabývala získáváním dat. Druhá část bude o jejich ukládání, ve třetí se podíváme na návrh modelu.

Disclaimer: Autor textu je zároveň autorem popisované knihovny NotORM.

Jakub Vrána

Autor se živí programováním v PHP, podílí se na oficiální dokumentaci, vyučuje na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Školení Google Analytics pro pokročilé

DW - Školení Google Analytics
  • Jak využít nové funkce Google Analytics
  • Vyhodnocování kampaní díky používání Multichannel funnels
  • Kde návštěvníci vašeho webu utíkají z objednávacího procesu.
  • Nebudete opakovat časté chyby při vyhodnocování dat o návštěvnosti.

Detailní informace o školení Google Analytics pro pokročilé »

Přehled názorů

Re: Doctrine 2 a NotORM - videotutoriál
Ondrej 7. 1. 2011 01:00
Nový
├ 
Re: Doctrine 2 a NotORM - videotutoriál
Smokie 7. 1. 2011 08:46
Nový
│
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Smokie 7. 1. 2011 08:46
Nový
└ 
Re: Doctrine 2 a NotORM - videotutoriál
jos 7. 1. 2011 12:15
Nový
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Jakub Vrána 7. 1. 2011 12:25
Nový
 
 
├ 
Re: Doctrine 2 a NotORM - videotutoriál
Vít Šesták (v6ak) 7. 1. 2011 12:30
Nový
 
 
│
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Jakub Vrána 7. 1. 2011 12:51
Nový
 
 
│
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Vít Šesták (v6ak) 7. 1. 2011 13:03
Nový
 
 
│
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Franta Kučera 7. 1. 2011 14:12
Nový
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
jos 7. 1. 2011 16:40
Nový
 
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Oldis 9. 1. 2011 19:21
Nový
 
 
 
 
├ 
Re: Doctrine 2 a NotORM - videotutoriál
hotovson 10. 1. 2011 08:53
Nový
 
 
 
 
│
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Oldis 10. 1. 2011 17:16
Nový
 
 
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
jos 10. 1. 2011 16:15
Nový
Re: Doctrine 2 a NotORM - videotutoriál
jc 7. 1. 2011 01:19
Nový
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Honza Marek 7. 1. 2011 02:13
Nový
 
├ 
Re: Doctrine 2 a NotORM - videotutoriál
Vojtěch Vondra 7. 1. 2011 08:39
Nový
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Jakub Vrána 7. 1. 2011 11:56
Nový
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Jiří Petruželka (Nox) 7. 1. 2011 18:29
Nový
 
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Jakub Vrána 7. 1. 2011 21:12
Nový
 
 
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
adrive 8. 1. 2011 18:01
Nový
Srovnání s Nette\Database
enumag 7. 1. 2011 08:48
Nový
└ 
Re: Srovnání s Nette\Database
paranoiq 7. 1. 2011 09:53
Nový
Minified verze
Tharos 7. 1. 2011 08:54
Nový
└ 
Re: Minified verze
Vít Šesták (v6ak) 7. 1. 2011 10:16
Nový
 
└ 
Re: Minified verze
Jakub Vrána 7. 1. 2011 12:16
Nový
 
 
├ 
Re: Minified verze
Vít Šesták (v6ak) 7. 1. 2011 12:20
Nový
 
 
└ 
Re: Minified verze
Franta Kučera 7. 1. 2011 12:27
Nový
 
 
 
└ 
Re: Minified verze
Jakub Vrána 7. 1. 2011 12:38
Nový
 
 
 
 
├ 
Re: Minified verze
Tharos 7. 1. 2011 13:40
Nový
 
 
 
 
│
└ 
Re: Minified verze
Jakub Vrána 7. 1. 2011 14:13
Nový
 
 
 
 
│
 
└ 
Re: Minified verze
Naith_cz 7. 1. 2011 19:57
Nový
 
 
 
 
│
 
 
└ 
Re: Minified verze
aaaa 10. 1. 2011 11:16
Nový
 
 
 
 
│
 
 
 
└ 
Re: Minified verze
Honza Marek 13. 1. 2011 08:08
Nový
 
 
 
 
└ 
Re: Minified verze
mirek 9. 1. 2011 21:37
Nový
Formát videa
Franta Kučera 7. 1. 2011 09:34
Nový
└ 
Re: Formát videa
Martin Malý 7. 1. 2011 10:08
Nový
 
└ 
Flash nefunguje
Franta Kučera 7. 1. 2011 10:23
Nový
srovnávat not-orm a orm?
Filip Procházka 7. 1. 2011 09:44
Nový
├ 
Re: srovnávat not-orm a orm?
Jiří Petruželka (Nox) 7. 1. 2011 10:14
Nový
└ 
Re: srovnávat not-orm a orm?
lopata 7. 1. 2011 16:57
Nový
 
└ 
Re: srovnávat not-orm a orm?
mirek 9. 1. 2011 21:27
Nový
Nahradím libovolnou vaši knihovnu jinou, lepší a poloviční?
Radek Burget 7. 1. 2011 09:51
Nový
├ 
Re: Nahradím libovolnou vaši knihovnu jinou, lepší a poloviční?
Vít Šesták (v6ak) 7. 1. 2011 10:12
Nový
│
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Franta Kučera 7. 1. 2011 10:27
Nový
├ 
Re: Nahradím libovolnou vaši knihovnu jinou, lepší a poloviční?
Jakub Vrána 7. 1. 2011 12:09
Nový
├ 
Re: Nahradím libovolnou vaši knihovnu jinou, lepší a poloviční?
TomBA 7. 1. 2011 18:23
Nový
└ 
Re: Nahradím libovolnou vaši knihovnu jinou, lepší a poloviční?
blizzboz 8. 1. 2011 12:44
Nový
Prosakující abstrakce
Vít Šesták (v6ak) 7. 1. 2011 10:31
Nový
└ 
Re: Prosakující abstrakce
Jakub Vrána 7. 1. 2011 12:21
Nový
 
├ 
Re: Prosakující abstrakce
Vít Šesták (v6ak) 7. 1. 2011 12:28
Nový
 
│
└ 
Re: Prosakující abstrakce
Jakub Vrána 7. 1. 2011 12:49
Nový
 
└ 
Re: Prosakující abstrakce
Josef Čech 7. 1. 2011 12:46
Nový
 
 
└ 
Re: Prosakující abstrakce
Jakub Vrána 7. 1. 2011 12:55
Nový
 
 
 
└ 
Re: Prosakující abstrakce
Josef Čech 7. 1. 2011 14:20
Nový
Re: Doctrine 2 a NotORM - videotutoriál
Josef Čech 7. 1. 2011 12:30
Nový
Preco vobec tento clanok?
Eduard Kracmar 7. 1. 2011 13:10
Nový
└ 
Re: Preco vobec tento clanok?
Jakub Vrána 7. 1. 2011 13:17
Nový
co to dát dohromady?
Jan Kodera 7. 1. 2011 13:56
Nový
├ 
Re: co to dát dohromady?
Jakub Vrána 7. 1. 2011 14:07
Nový
└ 
Re: co to dát dohromady?
Vít Šesták (v6ak) 7. 1. 2011 18:56
Nový
 
└ 
Play
Franta Kučera 7. 1. 2011 19:13
Nový
 
 
├ 
Re: Play
Vít Šesták (v6ak) 7. 1. 2011 20:44
Nový
 
 
│
└ 
Re: Play
- 8. 1. 2011 03:15
Nový
 
 
└ 
Re: Play
Jan Kodera 8. 1. 2011 17:12
Nový
Váha jednotlivých bodů
David Grudl 7. 1. 2011 14:07
Nový
nemám rád tenhle přístup
Josef Richter 7. 1. 2011 14:45
Nový
└ 
Re: nemám rád tenhle přístup
Jakub Vrána 7. 1. 2011 14:50
Nový
 
├ 
Re: nemám rád tenhle přístup
Josef Čech 7. 1. 2011 15:17
Nový
 
│
└ 
Re: nemám rád tenhle přístup
Jakub Vrána 7. 1. 2011 15:29
Nový
 
└ 
Re: nemám rád tenhle přístup
Josef Richter 7. 1. 2011 15:49
Nový
 
 
└ 
Re: nemám rád tenhle přístup
paranoiq 8. 1. 2011 12:48
Nový
 
 
 
└ 
Re: nemám rád tenhle přístup
Josef Richter 10. 1. 2011 10:58
Nový
ORM - NotORM
n4u 8. 1. 2011 23:48
Nový
└ 
Re: ORM - NotORM
Franta Kučera 9. 1. 2011 00:54
Nový
 
└ 
Re: ORM - NotORM
n4u 9. 1. 2011 01:37
Nový
Re: Doctrine 2 a NotORM - videotutoriál
Oldis 9. 1. 2011 20:22
Nový
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Radek 9. 1. 2011 20:55
Nový
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Oldis 9. 1. 2011 22:32
Nový
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Radek Burget 10. 1. 2011 11:50
Nový
 
 
 
└ 
Re: Doctrine 2 a NotORM - videotutoriál
Oldis 10. 1. 2011 20:56
Nový
Drobná paralela s webovými frameworky
Radek 9. 1. 2011 21:05
Nový
doctrine orm
ad 11. 1. 2011 05:35
Nový
└ 
Re: doctrine orm
Honza Marek 13. 1. 2011 08:11
Nový
Pouze osobní názor a zkušenosti
Ruml 11. 1. 2011 07:57
Nový
Kdyz autor nevi :-)
Mr.S1lent.cz 10. 2. 08:33
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