SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
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
        reprezentáciu v relačnej databáze tak, aby bola
        zachovaná persistencia dát.

    Niekoľko návrhových vzorov pre ORM
    –   Active Record
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“
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;
    }
}
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();
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
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;
          }
        }
Ď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 ;-)
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
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
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);
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 …
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
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... ;-)
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)

Weitere ähnliche Inhalte

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

Ať se z kódu nepráší!
Ať se z kódu nepráší!Ať se z kódu nepráší!
Ať se z kódu nepráší!Juraj Michálek
 
Tipy a triky na používanie funkcionálnych vlastností Pythonu
Tipy a triky na používanie funkcionálnych vlastností PythonuTipy a triky na používanie funkcionálnych vlastností Pythonu
Tipy a triky na používanie funkcionálnych vlastností Pythonusevcech
 
Junior Internet 2015 - PHP moderne a správne
Junior Internet 2015 - PHP moderne a správneJunior Internet 2015 - PHP moderne a správne
Junior Internet 2015 - PHP moderne a správneTomáš Tatarko
 
BarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na WebBarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na WebJuraj Michálek
 
Zváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App EngineZváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App EngineJuraj Michálek
 
Aký programovací jazyk a framework si vybrať a prečo?
Aký programovací jazyk a framework si vybrať a prečo?Aký programovací jazyk a framework si vybrať a prečo?
Aký programovací jazyk a framework si vybrať a prečo?Jano Suchal
 
Model driven story
Model driven storyModel driven story
Model driven storyBoris Bucha
 
Ako si vybrať programovací jazyk a framework?
Ako si vybrať programovací jazyk a framework?Ako si vybrať programovací jazyk a framework?
Ako si vybrať programovací jazyk a framework?Jano Suchal
 
Cucumber - Testovanie webových aplikácií
Cucumber - Testovanie webových aplikáciíCucumber - Testovanie webových aplikácií
Cucumber - Testovanie webových aplikáciíPeter Študent
 

Ähnlich wie Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách? (12)

Ať se z kódu nepráší!
Ať se z kódu nepráší!Ať se z kódu nepráší!
Ať se z kódu nepráší!
 
Php sec
Php secPhp sec
Php sec
 
Tipy a triky na používanie funkcionálnych vlastností Pythonu
Tipy a triky na používanie funkcionálnych vlastností PythonuTipy a triky na používanie funkcionálnych vlastností Pythonu
Tipy a triky na používanie funkcionálnych vlastností Pythonu
 
Junior Internet 2015 - PHP moderne a správne
Junior Internet 2015 - PHP moderne a správneJunior Internet 2015 - PHP moderne a správne
Junior Internet 2015 - PHP moderne a správne
 
Programovanie v C++
Programovanie v C++Programovanie v C++
Programovanie v C++
 
BarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na WebBarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na Web
 
Zváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App EngineZváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App Engine
 
Aký programovací jazyk a framework si vybrať a prečo?
Aký programovací jazyk a framework si vybrať a prečo?Aký programovací jazyk a framework si vybrať a prečo?
Aký programovací jazyk a framework si vybrať a prečo?
 
Model driven story
Model driven storyModel driven story
Model driven story
 
Mdsd
MdsdMdsd
Mdsd
 
Ako si vybrať programovací jazyk a framework?
Ako si vybrať programovací jazyk a framework?Ako si vybrať programovací jazyk a framework?
Ako si vybrať programovací jazyk a framework?
 
Cucumber - Testovanie webových aplikácií
Cucumber - Testovanie webových aplikáciíCucumber - Testovanie webových aplikácií
Cucumber - Testovanie webových aplikácií
 

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

  • 1. Používať alebo nepoužívať ORM vo webových aplikáciách? @MarekLichtner
  • 2. Obsah  ORM, výhody nevýhody  NotORM  Prekvapenie  Ako na db v Nette frameworku
  • 3. Varovanie!  Moje skúsenosti  Neukazujem neomylné múdrosti sveta
  • 4. O mne  www.education.sk  Intranetové riešenia CRM – ORM - 5 rokov – Alternatívy k ORM asi 2 roky
  • 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. 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. 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. 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. 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. 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. Ď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. 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. 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. 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. 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. 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. 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. FluentPDO  @FluentPDO  fluentpdo.com  Spĺňa uvedené podmienky
  • 19. Ako to používam v Nette  Príklad v nette: – https://github/lichtner/fluentpdo-nette-sandbox
  • 20. Otázky?  Kontakt – @MarekLichtner (licht.sk) – @FluentPDO (fluentpdo.com)