![Page 1: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/1.jpg)
Používať alebo nepoužívať ORM vo webových aplikáciách?
@MarekLichtner
![Page 2: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/2.jpg)
Obsah
ORM, výhody nevýhody NotORM Prekvapenie Ako na db v Nette frameworku
![Page 3: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/3.jpg)
Varovanie!
Moje skúsenosti Neukazujem neomylné múdrosti sveta
![Page 4: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/4.jpg)
O mne
www.education.sk Intranetové riešenia CRM
– ORM - 5 rokov
– Alternatívy k ORM asi 2 roky
![Page 5: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/5.jpg)
Č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
![Page 6: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/6.jpg)
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“
![Page 7: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/7.jpg)
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; }}
![Page 8: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/8.jpg)
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();
![Page 9: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/9.jpg)
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
![Page 10: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/10.jpg)
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; } }
![Page 11: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/11.jpg)
Ď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 ;-)
![Page 12: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/12.jpg)
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
![Page 13: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/13.jpg)
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
![Page 14: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/14.jpg)
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);
![Page 15: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/15.jpg)
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 …
![Page 16: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/16.jpg)
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
![Page 17: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/17.jpg)
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... ;-)
![Page 18: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/18.jpg)
FluentPDO
@FluentPDO fluentpdo.com Spĺňa uvedené podmienky
![Page 19: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/19.jpg)
Ako to používam v Nette
Príklad v nette:– https://github/lichtner/fluentpdo-nette-sandbox
![Page 20: Marek Lichtner - Používať alebo nepoužívať ORM vo webových aplikáciách?](https://reader037.vdocuments.pub/reader037/viewer/2022100416/559d15c91a28abdf018b47ca/html5/thumbnails/20.jpg)
Otázky?
Kontakt– @MarekLichtner (licht.sk)
– @FluentPDO (fluentpdo.com)