Dibi or Doctrine2 or Nette Database?
- wicked
- Člen | 290
jen mě napadá taková myšlenka. Zatím frčím na Nette Database který mojim potřebám zatím stačí, ale jak projíždíme fórum, narážím i na to, že to prostě něco nezvládá atd.
Chtěl bych se zeptat Vás zkušenějších, kterou využíváte vy?
Pokud se v budoucnu budu muset učit využívat něco nového, začnu s tím rovnou teď :-)
Osobně přemýšlím nad Dibi, nebo máte jiné názory, popřípadě argumenty?
Předem děkuji za reakce do diskuze.
Wicked
- Jan Endel
- Člen | 1016
Srovnání:
- Dibi je stabilní, odbugovaná, ale „stará“, nemá tak pěkné api
- Nette\Database má výrazně méně bugů než-li měla, resp už se může na projektech normálně používat krásný API
- Doctrine: Výrazně složitější než předchozí dvě, není to prostá obálka nad databází, takže na to konto může řešit mnohem pokročilejší věci než předchozí dvě
Vyber jsi podle sebe
- Oli
- Člen | 1215
Ještě bych dodal, že Dibi i NDB je vlastně nástroj pro vytahování dat z databáze. narozdíl od toho Doctrine je ORM. Srovnával bych teda Dibi a NDB v jedné kategorii a ve druhé třeba Doctrine, Lean Mapper, YetORM nebo Nextras, kterej jsem o víkendu v rychlosti vyzkousel a zatím se mě líbil nad NDB nejvíc. Tak jsem na nej hodně zvědavej :-)
- Zax
- Člen | 370
Osobně jsem moc zvědavý, co Hrach vymyslel s tím jeho ORM nad Nette\Database a zda to bude v dohledné době použitelné na reálné projekty :-)
Doctrine je jak střílet z tanku na komára, aspoň tedy pro mě, ale čisté Nette\Database je zase jak házet šutry na tank. Navíc Nette\Database má oproti Doctrině výbornou schopnost skládat optimalizované dotazy, aniž bych musel přemýšlet, jak to zapsat (tuším že v Doctrině musí člověk přemýšlet nad DQL). Zatím mám na to vlastní ORM postavené nad Nette\Database, ale není to nic moc (základní mapování, vazby přes anotace, jednoduché entitní formuláře, to vše mi funguje, ale kdybych vypustil zdrojáky, tak se tu všichni pozvrací :-) ) a nemám čas to udělat pořádně.
Věřím, že Hrachovo řešení bude mnohem lepší než moje.
- Filip Procházka
- Moderator | 4668
Pokud chceš psát „správně“ a „čistě“ OO aplikace, tak Doctrine 2 (+ Kdyby), jinak bych šel asi do LeanMapperu.
- Filip Procházka
- Moderator | 4668
LeanMapperu je výborné skoro-ORM, ale bohužel nemá identity mapu a má dost obskurní architekturu. Což spoustě lidem nevadí, ale pro mě je to nepoužitelné.
- Filip Procházka
- Moderator | 4668
Začal bych tady a pokud to s Doctrine myslíš vážně, tak pokud si přečteš celou dokumentaci tak to je výborně investovaný čas.
- mrtnzlml
- Člen | 140
wicked napsal(a):
Asi půjdu do Doctrine2+Kdyby, nějaký návody jak začít?
Link dokumentace je mi jasný, ale v rychlosti nějaký základ?
Např.insert, update, where, selektivní atd?
Děkuji
Toto by ti mohlo pomoci s přechodem. Psal jsem to právě pro tento účel. Je to klasicky minimum potřebné k přechodu… :-) http://www.zeminem.cz/…tej-doctrine
- Tharos
- Člen | 1030
Filip Procházka napsal(a):
Pokud chceš psát „správně“ a „čistě“ OO aplikace, tak Doctrine 2 (+ Kdyby), jinak bych šel asi do LeanMapperu.
Díky za uznání! :)
Nemohu se ale nechytnout těch přívlastků „správné“ a „čisté“
OO aplikace. :) Zajímalo by mě totiž, co konkrétně si pod tím lze
představit. Já si totiž nemyslím, že „správnost“ a „čistota“ by
až tak moc závisely na použitém ORM (pokud to není samozřejmě nějaká
statická hrůza). Troufám si tvrdit, že „správně“ a „čistě“ lze
psát OO aplikace i s pomocí PDO
, když programátor ví,
co dělá.
Já teď třeba zrovna píšu nad Lean Mapperem jeden e-shop a přijde mi, že výsledký kód je z pohledu OOP čistý i správný (samozřejmě, že kdo by chtěl psa bít…). Jestli mi tu apku něco vyloženě kazí, tak jsou to nezapouzdřené presentery se všemi jejich zodpovědnostmi ;). Rozhodně to nedělá její modelová část.
Identity map je úplně výborná hůl na Lean Mapper. :) Pořád o ní slyším od lidí, kteří Lean Mapper vlastně vůbec nepoužívají, ale ví, že tam strašně chybí. ;)
O víkendu jsem si taky hrál s Nextras\ORM a oceňuji, že Hrach v něm identity mapu má, ale přijde mi to jenom jako takový marketing, protože ta jeho identity mapa není úplně dobrá…
Představ si třeba takovýhle jednoduchý use-case:
<?php
// Mějme jednoduché CMS
// Chceme vypsat hlavní navigaci
foreach ($pagesRepository->findAll() as $page) {
echo $page->title;
}
// Chceme vypsat všechny obsahy **aktuální stránky**
$currentPage = $pagesRepository->get($id);
echo $currentPage->title; // Nadpis…
foreach ($currentPage->contents as $content) {
echo $content->body;
}
Víš, co se díky té „identity mapě“ stane na pozadí? Z databáze se
Ti vytáhnou nejen všechny stránky, ale i všechny obsahy
(všech stránek). Ono totiž v pozadí stojí jeden principiální
problém, který není úplně trivální vyřešit, a právě z toho důvodu
plnohodnotnou identity mapu v Lean Mapperu nemám. Vím, jak by ten problém
šel vyřešit, ale overhead by byl takový, že už to nemá moc společného
se slovem Lean. Až si začnou skuteční uživatelé stěžovat, že
jim identity mapa chybí, začnu to řešit. Jinak doplnit takovou „identity
mapu“, jakou má Hrach, by byla otázka pár úderů do klávesnice (byla by v
EntityFactory
), ale o to moc nestojím.
No a takových věcí jsem v tom ORM našel ještě víc… Ono jenom stačilo vědět, na co se zaměřit.
Mě by zajímalo, jestli Hrach třeba o tom problému s identity mapou ví? Jestli ano, tak je ohánění se jí sice hezký marketing, ale IMHO nezodpovědnost vůči uživatelům.
Zatím to na mě totiž působí spíš jako Nette\Database, která vypadala fajn, ale třeba já jsem ji musel kvůli bugům v půlce jednoho projektu opustit…
Nevím, jestli by původnímu tazateli u Lean Mapperu převážily jeho výhody nebo nevýhody (nevím, co se chystá programovat), a proto bych mu za sebe klidně doporučil Doctrine 2.
Editoval Tharos (4. 6. 2014 1:00)
- David Matějka
- Moderator | 6445
Víš, co se díky té „identity mapě“ stane na pozadí? Překvapení! Z databáze se Ti vytáhnou nejen všechny stránky, ale i všechny obsahy (všech stránek). :) To je pěkný průser…
Jo, o tom jsem se s Hrachem bavil. Je to tim, ze pri iteraci se entite priradi kolekce („Preloaded container“), do ktere aktualne patri, ale pote se ta kolekce neodstrani. Rikal, ze je to tak umyslne, ale mozna se to jeste zmeni.
Asi by jen stacilo sem (nebo jeste nekam jinam?) pridat smazani toho preloaded containeru z predchozi entity.
- hrach
- Člen | 1838
Musim varovat pred LeanMapperem, coz je sra…knihovna, kterou nelze testovat. Respektive nelze vytvorit vazby, aniz bych entitu zapersistoval. Attached stav tam neexistuje a akorat se to musi hackovat ;)
Ohledne Nextras\ORM – nikdo ho tu nevnucoval, nikde, krom posoboty a sveho twitteru, ho nepropaguji :) Na otazku, kdy si myslim, ze to muze jit do produkce, jsem na posobote odpovedel, ze po prazdninach. Do te doby to chapu jako preview. Nejsou testy, neni doc. Zatim jen na hrani :)
Jo, o tom jsem se s Hrachem bavil. Je to tim, ze pri iteraci se entite priradi kolekce („Preloaded container“), do ktere aktualne patri, ale pote se ta kolekce neodstrani. Rikal, ze je to tak umyslne, ale mozna se to jeste zmeni.
Asi by jen stacilo sem (nebo jeste nekam jinam?) pridat smazani toho preloaded containeru z predchozi entity.
Je to presne jak rika Matej. Zatim jsem to neimplementoval, protoze osobne jsem na takoveto chovani jeste nenarazil, ale jsem si ho vedom. Asi to tedy pridam i to odstraneni :) Z principu jsem se tomuto venoval velmi dlouho, testoval jsem i reseni pomoci Proxy – toto mi prislo lepsi.
Editoval hrach (4. 6. 2014 0:37)
- Tharos
- Člen | 1030
Proč by Lean Mapper nešel testovat? :) Já entity testuji úplně normálně, i traverzování mezi nimi a není k tomu zapotřebí ani databáze. A co si mám představit pod tím attached stavem? :)
Názor, že když chci něco kritizovat, nejprve si o tom musím něco zjistit, se koukám fakt už moc nenosí. :)
To, že to může jít do produkce po prázdninách, mi uniklo. To se omlouvám. Já jsem si myslel, že to, co je teď v repu, je už víceméně použitelné. Pak beru zpátky svoji kritiku. Věřím, že přes prázdniny všechno odladíš a Nextras\ORM si najde své spokojené uživatele.
Edit: Odstranil jsem z toho svého předchozího příspěvku to varování, protože pokud to je zatím jenom ke „zkoušení“, tak je to fakt jiná. Držím palce po prázdninách. :)
Editoval Tharos (4. 6. 2014 1:04)
- Tharos
- Člen | 1030
Honzo, je to sice hezký sport a dá se při tom zažít spousta legrace, ale já bych rád tohle klání ORMek uzavřel, protože to stojí zbytečnou energii a nikomu neprospívá (osobně nesnáším negativní marketing).
Tvé ORM se mi líbí, máš ho hezky napsané. Je tam pár věcí, které se mi tak trochu nelíbí, pár věcí je třeba dotáhnout, ale pak to bude fajnová knihovna.
Přemýšlím jen, co by mělo uživatele přesvědčit používat jej namísto Doctrine 2, která je de facto standardem pro ORM v PHP? Ten ujetý benchmark, jehož výsledek vlastně nevypovídá o ničem smysluplném, je dost slabý argument. Doctrine 2 není tak špatná, jak si pravděpodobně myslíš. Fakt Ti doporučuji více se na ní podívat. Třeba já jsem to nedávno udělal a hodně mě to posunulo, dost jsem na problematiku změnil názor.
Lean Mapper má oproti Doctrine pořád pár jasných výhod. Z podstaty svého návrhu je velmi pružný. Je to ORM, které Ti umožňuje mít zároveň přesně takové public API modelu (hlavně entit), jaké si přeješ, posílat do databáze takové dotazy, jaké si přeješ, a to vše s minimem řádků a s minimálním úsilím. To je jeho hlavní výhoda a rank, podle kterého si s Doktrínou v ničem nezadá. A věřím, že to je hlavní důvod, proč jej mnozí používají.
Jako bonus beru to, že si můžeš sám vybrat, jak moc chceš vlastně relační databázi v aplikaci abstahovat. Abstrakci lze ji mít velmi malou (výhodné třeba s PostreSQL, která toho sama umí hrozně moc) i hodně velkou. V téhle volbě IMHO strká Doctrine do kapsy.
Nesouhlasím s tím, že je to sra… Praxe ukazuje, že není.
Good luck s dalším vývojem!
Editoval Tharos (4. 6. 2014 9:12)
- castamir
- Člen | 629
@hrach, @Tharos: to už by stačilo…
Až bude mít něco použitelného, tak můžete začít srovnávat. Do té doby je to jen plané tlachání…
Zatím je LeanMapper jediná aspoň trošku solidní alternativa k Doctrine. Osobně mám k oběma docela slušné výhrady, ale přesto je mi LM přece jen bližší a tak jsem si nad ním vystavěl ještě menší nádstavbu. Do dokonalosti to má ale daleko.
Nextras ORM má pár zajímavých nápadů (např. propojení na Repository ve vazbě), ale taky hodně špatných nápadů (např. použití nezdokumentované syntaxe z Nette/Database). Prostě každé řešení má nějaké pro a proti. Každý vývojář má na ideální řešení svůj vlastní názor, svou vlastní představu. Vy dva se evidentně neshodnete, ale tím osočováním nikomu moc nepomáháte. Raději bych být vámi ten čas investoval do odstranění nedostatků ve vašem vlastním řešení, než przněním řešení toho druhého. Máte toho oba ještě dost co zlepšovat (hrach asi víc, protože je v implementaci o rok pozadu za LM).
Edit: A třeba se po zkouškách hecnu a nějaké to důkladnější srovnání, včetně mé představy ideálního chování, sepíšu :p
Editoval castamir (4. 6. 2014 1:41)
- Filip Procházka
- Moderator | 4668
@hrach příště to zkus slušně pls :)
@Tharos Pozor, nikde nepíšu, že to že tam nemáš identity mapu je špatně, jenom píšu že máš prostě jinou architekturu (já tomu osobně říkám skoro-ORM). Určitě na tom jde napsat spousta kvalitních aplikací. Jediné co se snažím říct je, že mi tvoje architektura nevyhovuje a nebyl bych s ní schopný pracovat. Výrazy „správný“ a „čistý“ samozřejmě narážím na standardní pojetí ORM a DDD.
Na druhou stranu je dobře, že tu existuje alternativní architektura a né jenom další „napsal jsem lepší Doctrine“, protože napsat lepší Doctrine by byla práce na roky vývoje pro jednoho člověka a musel by být neskutečně geniální, aby to udělal lépe, než ty desítky vývojářů co na ní dělali do teď a tisíce co ji každý den testují a reportují chyby. Držím Hrachovi palce :)
- Tomáš Jablonický
- Člen | 115
Jednou k Doctrine2 stejnak přičichneš a zjistíš, že ti šetří docela času při vývoji a zdroják je mnohem přehlednější a více strukturován. Ve spojení s KDYBY je to ovšem ultra super nástroj :-).
- hrach
- Člen | 1838
klání ORMek uzavřel, protože to stojí zbytečnou energii a nikomu neprospívá
Ja jsem zadne klani ani nezacal. V teto diskuzi jsem se vubec nezapojoval, sve orm nepropagoval, cizi orm nepomlouval. Potom prisel Tharosuv prispevek, ktery trema odstavcema pospal jeden neidealni usecase a uzavrel ho stylem, ze jsem to nepobral s linkem na muj tweet. Jako sorry, ale na to, ze jsem sem nenapsal predtim ani post, je toto naprosto nechutny chovani. A jeste nechutnejsi je, ze to po sobe mazes a editujes.
Napsal jsem jeden zasadni argument, proc bych nepouzil Lean mapper. Tento argument byl rozporovan, ze neni pravda. Je pravda, ja totiz Lean mapper zkousel pouzivat. A jak jinak si taky vysvetlit dnesni post, ze lze nove testovat vazby i bez pripojeni k db – ze? https://forum.dibiphp.com/…orm-nad-dibi?p=22
Nextras\ORM nedoporucuji pouzivat pro produkci. Zatim je to dev. Neni tagnuta zadna alfa, beta, rc, ani stable! Budu rad, kdyz to ozkousite na hrani a jako Tharos (ale slusne) nahlasite sve dojmy.
- Zax
- Člen | 370
@hrach: Máš tu někde svůj thread pro Nextras\ORM? Právě jsem zkouknul tvoji přednášku a líbí se mi to, mám v plánu si s tím brzo začít hrát, tak jenom abych věděl, kam můžu ty své dojmy směřovat ;-)
V té přednášce 20:05 jak tam taháš ty komentáře, k čemu slouží
ten ->get()
? Nestačilo by prostě
$this->allComments->findBy(...)
? Je to drobnost, ale už se
vidím, jak na to budu zapomínat a zrovna v této situaci IDE ani
nenapovídá.
- Džůny
- Člen | 19
Ahoj, dovolím si oživit téma, abych nemusel zakládat nové, protože řeší přesně to co já.
Jak je na tom Nette/Database dnes? U některého ze starších rozhovorů s Davidem (tuším) jsem se v komentářích dočetl, že je Nette/Database zabugované a používané jen začátečníky (skrze Sandbox). Otázka je: je to pravda i dnes?
Ona mi ta „magická“ složka moc nesedí, ale zase je to pohodlné. S Dibi, které bylo prozatím můj favorit, zkušenosti taky nemám. Vrátil jsem se k PHP a webům po sedmi letech, tehdy jsem jel těžký punk s funkcema mysql_* a podobnými relikviemi, tak se pořád rozkoukávám…
Projekt nebude moc velký. Docela mě láká i LeanMapper, protože jsem v C# používal Entity a bylo to super.
Editoval Džůny (9. 4. 2015 10:14)
- David Grudl
- Nette Core | 8228
- dibi: časem ověřená a dalo by se říci hotová knihovna
- Nette Database: zjednodušené dibi podstavené nad PDO, poměrně stabilní, něco to má navíc, ale něco tomu i chybí. V další verzi by to mohlo s dibi srovnat krok a nahradit jej, bude-li motivace
- Nette Database Table: „magická“ vrstva nad Nette Database, v současné době už celkem stabilní (běží na tom třeba nette.org), nicméně hlavní vývojář od toho utekl. Má takřka nulovou vstupní bariéru a nepoužívá entity (tedy není ORM)
- Lead Mapper: ORM založené nad dibi. Jeho vývojář dnes sám používá spíš Doctrine
- Doctrine: dnes asi nejpopulárnější ORM pro PHP, ale zároveň nejsložitější
- Pavel Janda
- Člen | 977
Trošku se divím, že jsem ještě na Nette fóru nezavadil o nějakou
slušnou Active Record vrstvu, ani zmínka.
U RoR se mi s Active Recordem pracuje dobře a jednoduše, to to nemá
v oblibě nikdo okolo Nette?
- David Grudl
- Nette Core | 8228
Active Record jsem považoval za antipattern, proto jsem odmítal jej z NDBT udělat. Možná AR tak vidí i další programátoři, tudíž podobná vrstva nevznikla. V RoR je AR něco jako magic quotes – prostě věc, které RoR vděčí za svou popularitu, ale dnes se jí v bolestech snaží zbavit.
- Šaman
- Člen | 2666
… a protože David je ten guru, který půlku z nás učil čistě programovat, tak asi není nikdo, kdo by splňoval najednou dvě základní podmínky – 1) být schopný napsat tuto vrstvu v rozumné kvalitě s testy a za 2) používal active record :)
@DavidGrudl: Když už se na to narazilo, kdo tedy vyvíjí NDb a NDbT? Myslel jsem, že @hrach? Případně jak vypadá budoucnost NDbT? Díky.
@Džůny: Před dvěma lety byla situace trochu jiná, to bych ti
NDb(T) nedoporučil, přestože byla již součástí
Nette. Dneska, pokud nemáš nějaký konkrétní důvod použít něco jiného,
bych naopak řekl použij ji. Pokud se ti nelíbí magie, tak nemusíš
používat Nette database table, ale čistou Nette database (vesměs příkaz
query a fetche), přestože snad ve všech ukázkách se využívá právě
možností NDbT (je to dost návykové, takový napůl ORM, taky z NotORM
vychází).
Jinak jeden z těch důvodů nepoužívat NDb by mohl být požadavek na
složité dolování dat (tj. využívat opravdu všech, i málo známých,
možností SQL). I když, i tento pocit je možná pozůstatek z doby před
těmi dvěma lety…
- David Grudl
- Nette Core | 8228
@Šaman NDb vyvíjím já, NDbT už zhruba rok nikdo, nicméně ono to funguje, občas někdo pošle bugfix, takže to klidně nasazuji i na nové weby.
- Svaťa Šimara
- Člen | 98
TL;DR:
Pokud potřebuješ podmínku v LEFT JOIN ON, vlastní ALIAS tabulky, FORCE
INDEX, a další potvůrky, tak NDBT nebrat.
@Džůny: Osobně opužívám NDBT – Selection a spol – na docela velkém projektu a jak píše Šaman, dokud nepotřebuješ používat kapku složitější SQL, je ok.
Horší bude situace, když uprostřed projektu zjistíš, že kapku složitější SQL potřebuješ, jako my :-)
Typický příklad: Potřebuješ vytáhnout kategorie, a k nim pokud existuje, tak jazykový překlad, pokud překlad neexistuje, stejně ty kategorie chceš vytáhnout, a vypsat aspoň bez překladu.
NDBT:
$selection = $this->db->table('category');
foreach($selection as $category) {
$translation = $book->related('category_translation')->where('code', 'cz')->select('category_translation.caption');
}
Což se sice vykoná ve 2 dotazech, ale tak nějak si určitě říkáš, že jakmile tento kód budeš potřebovat na více místech, není to nic moc. V čistém SQL bys použil:
SELECT category.name, category_translation.caption
FROM category
LEFT JOIN category_translation ON (category.id = category_translation.category_id
AND category_translation.code = 'cz')
Tak si vytvoříš třeba VIEW, ale pak zjistíš, že NDBT s view úplně kamarád není, protože nemá vazby do dalších tabulek, takže view zase zrušíš.
A přitom by stačilo mít v NDBT možnost zadávat podmínku v LEFT JOIN:
$selection = $this->db
->table('category');
->left('category_translation.code', 'cz')
->select('category.name, category_translation.code');
Takže Ti potom nezbyde, než napsat pull request: https://github.com/…te/pull/1436
který bude zamítnutý, protože tuto vlastnost v NDBT Hrach nechce. A pak si
fakt v loji, protože tuto feature potřebuješ, nechceš mít kód
připočůraný samým ->related()->where()->select()
Pak zjistíš, že potřebuješ, stejně jako v SQL, aliasovat tabulky.
Toto taky NDBT neumí, a ani sem se už nepokoušel napsat pull request a
prostě si NDB forknul.. https://github.com/…rts/database
- Pavel Janda
- Člen | 977
@Fafin Ty joiny by byly sice fajn, ale to by opravdu bylo v rozporu s filozofií NDB\Table. To je prostě Table. :)
Jeden z důvodů, proč jsem na několika projektech nasadil Dibi. Logicky, s rozsáhlejší aplikací se dibi stává poměrně ukecané. A tak jsem zatím skončil u Lean Mapperu.