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

Preview:

Citation preview

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)

Recommended