Používať alebo nepoužívať ORM   vo webových aplikáciách?        @MarekLichtner
Obsah    ORM, výhody nevýhody    NotORM    Prekvapenie    Ako na db v Nette frameworku
Varovanie!    Moje skúsenosti    Neukazujem neomylné múdrosti sveta
O mne    www.education.sk    Intranetové riešenia CRM    –   ORM - 5 rokov    –   Alternatívy k ORM asi 2 roky
Čo je to ORM?    Object-relational mapping    Hlavná úloha:    –   Synchronizovať objekty v aplikácii a ich        repre...
Prečo ORM    Odtieniť vývojára od DB a SQL    Uľahčiť jednoduché operácie CRUD    Nezávislosť na databázovom systéme  ...
Ako začať pracovať s ORM?class User extends BaseActiveRecord {    protected $id;    /** @Column(type="string") **/    publ...
Základné použitie ORM// ešte treba nejako definovať relácie$user = User::find(10);$user->delete();$user = new User();$user...
Problém č.1: Odtienenie od SQL    Otázka: Existuje vývojár, ktorý nepozná SQL?    Princíp 80/20 nefunguje    –   Platí l...
Problém č.2: Efektivita    ORM tvrdia, že nie sú zamerané na efektivitu,    že efektivita je „good enough“    Vlastnosti...
Ďalšie problémy ORM    Nezávislosť na databázovom systéme    –   Napríklad aj PDO je nezávislé na db    Umožňuje generov...
Je teda ORM antipattern?    Kritéria podľa knihy „AntiPatterns“:    –   Na začiatku sa to javí ako prínosné, ale postupom...
NotORM    Knižnica na práca s datami v DB    Ani riadok nazmar!    –   žiadne modely, relácie, vlastnosti, validátory,  ...
Ako vyzerá NotORM$db = new NotORM($pdo);foreach ($db->user() as $user) {    // User::all()    echo "$user[name]n";}$user =...
Problémy s NotORM    Nepodstatné počiatočné problémy    –   Vyžaduje iné myslenie    –   Pre niekoho možno až príliš mini...
Naspäť k PDO    Na PDO je dobré    –   Abstraktná vrstva – MySQL, SQLite, PostgreSQL,        Oracle, ….    –   Eskejpovan...
Niečo nové?    Postavené na PDO    Mať plnú kontrolu nad generovaným SQL    Fluent interface    Zero configuration (ži...
FluentPDO    @FluentPDO    fluentpdo.com    Spĺňa uvedené podmienky
Ako to používam v Nette    Príklad v nette:    –   https://github/lichtner/fluentpdo-nette-sandbox
Otázky?    Kontakt    –   @MarekLichtner (licht.sk)    –   @FluentPDO (fluentpdo.com)
Upcoming SlideShare
Loading in …5
×

Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?

1,115 views

Published on

  • Be the first to comment

  • Be the first to like this

Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?

  1. 1. Používať alebo nepoužívať ORM vo webových aplikáciách? @MarekLichtner
  2. 2. Obsah ORM, výhody nevýhody NotORM Prekvapenie Ako na db v Nette frameworku
  3. 3. Varovanie! Moje skúsenosti Neukazujem neomylné múdrosti sveta
  4. 4. O mne www.education.sk Intranetové riešenia CRM – ORM - 5 rokov – Alternatívy k ORM asi 2 roky
  5. 5. Čo je to ORM? Object-relational mapping Hlavná úloha: – Synchronizovať objekty v aplikácii a ich reprezentáciu v relačnej databáze tak, aby bola zachovaná persistencia dát. Niekoľko návrhových vzorov pre ORM – Active Record
  6. 6. Prečo ORM Odtieniť vývojára od DB a SQL Uľahčiť jednoduché operácie CRUD Nezávislosť na databázovom systéme Umožňuje generovanie kódu Efektivita je „good enough“
  7. 7. Ako začať pracovať s ORM?class User extends BaseActiveRecord { protected $id; /** @Column(type="string") **/ public $name; function tableName() { return user; } static function all() { // return … collection ...; } static function find($id) { // return … user model; } function getName() { return $this->name; } function setName($value) { $this->name = $value; }}
  8. 8. Základné použitie ORM// ešte treba nejako definovať relácie$user = User::find(10);$user->delete();$user = new User();$user->name = Janko Hraško;$user->save();$users = User::all();$users = User::all()->filter(...)->order(...)->someSql(..);$users = User::all()->onlyEnabled();
  9. 9. Problém č.1: Odtienenie od SQL Otázka: Existuje vývojár, ktorý nepozná SQL? Princíp 80/20 nefunguje – Platí len na začiatku, blog za 15min – Pokiaľ robíte niečo zložité: ● $users = User::all()->sql(....); Nemusíte poznať SQL? – Musíte a okrem toho ešte aj ORM vrstvu Cieľ – zjednodušiť – Nakoniec som musel obchádzať ORM
  10. 10. Problém č.2: Efektivita ORM tvrdia, že nie sú zamerané na efektivitu, že efektivita je „good enough“ Vlastnosti, stĺpce JOINy, napríklad blog: Články + komentáre. – Koľko akých dotazov vaše ORM položí? – Vie použiť JOIN? foreach (Article::all()->limit(10) as $article) { echo $article->title; foreach ($article->comments as $comment) { echo $comment->title; } }
  11. 11. Ďalšie problémy ORM Nezávislosť na databázovom systéme – Napríklad aj PDO je nezávislé na db Umožňuje generovanie kódu Ukecanosť – Modely, vlastnosti, relácie, gettery, settery – Ak ste platený od počtu riadkov je ORM super ;-)
  12. 12. Je teda ORM antipattern? Kritéria podľa knihy „AntiPatterns“: – Na začiatku sa to javí ako prínosné, ale postupom času sa objavuje stále viac zlých dôsledkov ako dobrých – Existuje alternatívne riešenie
  13. 13. NotORM Knižnica na práca s datami v DB Ani riadok nazmar! – žiadne modely, relácie, vlastnosti, validátory, gettery, settery Ani znak nazmar! – Minimalistické API Veľký dôraz na výkon – Konštantný počet dotazov Výborná podpora JOINov – Využíva bežné konvencie
  14. 14. Ako vyzerá NotORM$db = new NotORM($pdo);foreach ($db->user() as $user) { // User::all() echo "$user[name]n";}$user = $db->user[2]; // User::find(2);foreach ($db->article()->limit(10) as $article) { echo "$article[title]n"; foreach ($article->comment() as $comment) { echo " - $comment[title]n"; }}SELECT * FROM article LIMIT 10;SELECT * FROM comment WHERE article_id IN (1,2,3,4,5,6,7,8,9,10);
  15. 15. Problémy s NotORM Nepodstatné počiatočné problémy – Vyžaduje iné myslenie – Pre niekoho možno až príliš minimalistické API Vážnejšie problémy – Generovanie SQL nemáte pod kontrolou ● Niektoré zložité queries som nedokázal prepísať – Niektoré veci sa nedajú urobiť ● Inner join ● Podmienka v joine Toto sa nedá: SELECT * FROM article INNER JOIN user ON user.id = article.user_id AND …
  16. 16. Naspäť k PDO Na PDO je dobré – Abstraktná vrstva – MySQL, SQLite, PostgreSQL, Oracle, …. – Eskejpovanie, viazanie premenných – Implementované Traversable Čo mi chýbalo na PDO – Viazanie polí, nedá sa urobiť: ● query(id in (?), $array) – Neexistuje fluent interface
  17. 17. Niečo nové? Postavené na PDO Mať plnú kontrolu nad generovaným SQL Fluent interface Zero configuration (žiadne modely, relácie, gettery, ...) Jednoduché API Čo najkratší zápis, inteligentné JOINy, využívajúce konvencie Prichádza svetová premiéra... ;-)
  18. 18. FluentPDO @FluentPDO fluentpdo.com Spĺňa uvedené podmienky
  19. 19. Ako to používam v Nette Príklad v nette: – https://github/lichtner/fluentpdo-nette-sandbox
  20. 20. Otázky? Kontakt – @MarekLichtner (licht.sk) – @FluentPDO (fluentpdo.com)

×