Volba databázové vrstvy Doctrine2 či NDB nebo tu máte něco nového?
- frosty22
- Člen | 373
Zdravím Vás,
předem tedy chci jen podotknout, že je mi jasné, že odpověď na toto věčné dilema neexistuje, ale již bych se potřeboval konečně rozhodnout :)
Jenom v kostce na několika projektech jsem již použil Doctrine 2, jednou i Doctrine 1 (brrr), už mám i projekty na Nette/Database a předtím NotORM :) Z toho asi jak vidno vyplývá, že prostě nevím co si vybrat :(
K věci, nyní potřebuji vyvíjet jeden větší eshopový systém, který by měl být určen pro dlouhodobé rozšiřování a správu. O frameworku je již rozhodnuto bude to Nette, a databázový server bude MySQL, ale teď opět dilema: „Sakra jakou tu databázovou vrstvu použít?“
Ze zkušeností jsem to shrnul vesměs na Doctrine 2 versus Nette/Database .. co se týče NotORM, tak to je vesměs Nette/Database, co se týče Dibi, tak to mi moc nesedlo, a od Doctrine 1 ruce pryč.
Doctrine 2
+ pevně definuje architekturu aplikace – entity, repository, …
+ pojmutí DB jako úložiště pro objekty, či jak popsat ten smysl ORM
– přestože je dost benchmarků ukazující, že je rychlá, tak přeci jen
je tam dost objektů atd., parsování DQL, proxy třídy, atd. takže režije
na rychlosti být prostě musí (paměťová náročnost např.)
– na strukturu DB rád používám Workbench → prostě vizualizace
databáze mi umožňuje si lépe představovat funčnost atp. a pro Doctrine2
bych asi musel investovat do ORM Designeru
– větší importy / exporty prostě pro Doctrine2 není moc košér
(paměťová náročnost)
– složitější dotazy – je zde dost problém u opravdu složitých
dotazů, např. podpora funkcí IF, UNION, apod.
Nette/Database
+ jednodušší vrstva pro práci, prostě zaregistruju a už můžu jet, či
jak to říci
+ rychlejší
+ nativní v nette, v pár objektech oproti rozsahu doctrine
+ složitější dotazy prostě rovnou přes PDO a jedu .. v Doctrine2 to jde
taky, ale mno je to tam prostě takové více anti-objektové a zlé vůči
pointě ORM :)
– větší volnost a query se mohou skládat až v šablonách, viz relace
apod. a to se mi moc nelíbí
– často narážím na problémy s voláním related / ref apod. ⇒ není
chyba NDB, ale prostě tento přístup mě občas trošku děší u větších
projektů
Takže a teď jak z toho ven, ideální stav je mít pouze plusy, což mě trošku zaujali dvě nástavby nad NDB – tj. zmiňovaný NDAB a Fabik/Database, pouze se lehce bojím „ozkoušenosti“ tohoto systému v praxi a zvláště pro takto rozsáhlý projekt.
Takže co si myslíte vy? V tuto chvíli jsem více nakloněn NDB a snahy dodržení též logiky repositář / services / entita? .. jen tedy zde bude horší to správně uchopit, abych poté neztroskotal :(
Všem velice děkuji za názory, a jistě chápu, že je to dosti subjektivní, takže se nebojte flamu..
Editoval frosty22 (17. 1. 2013 0:28)
- hrach
- Člen | 1838
- Ndab mam na jednom projektu, ktery bezi na ostro. Vyuzivam tam jen Table vrstvu. Bohuzel v te verzi Nette, na kterou je zatim ndab je bug, ktery muze zpusobit prolbemy s cachi, ale to uz je opravnee, zbyva tedy updatovat ndab na nejnovejsi verzi nette, ktera je trochu zmrvene – uz tam neni nette accessor a napovedouo pres phpdoc – to chci nejak upravit, aby tady ten servislocator patter si kdyztak ndab generovalo samo… :)
- frosty22
- Člen | 373
hrach: čirou náhodou asi nevíš, kdy bude úprava na tu nejnovější verzi nette? Resp. Ndab nevypadá tak rozsáhlé a difference mezi novou verzí Nette není snad tak rozsáhlá? Případně bych nějak pomohl v tomto směru, pokud bych byl schopen, tedy pokud bych se rozhodl pro toto řešení, pak bych s tím asi jistě hnul :)
- Filip Procházka
- Moderator | 4668
Nette\Database
mám v současnosti na čtyřech webech. Ty weby
jsou menší než malé, nechci po tom zázraky a funguje to.
Na druhou stranu, pro spokojené užívání Doctrine je spousta těžkých předpokladů:
- člověk musí rozumět co nejlépe OOP a DDD
- měl by mít zažitých co nejvíce návrhových vzorů
- dobře a lépe IoC (DI)
- chápat, že abstrakce to není dokonalá (a nikdy být nemůže) a brát to jako fakt
A ještě pár věcí, souvisejících s čistým kódem obecně. Pokud tohle nebudeš mít zažité, budeš trpět. Když si ale načteš knížky o návrhových vzorech a DDD (a pochopíš je), tak to začne dávat všechno velký smysl a budeš trpět, když máš psát čisté sql.
Netvrdím, že tomu všemu rozumím dokonale, ale chápu dost na to, abych v tom viděl ty přínosy. A cesta Doctrine mi velice vyhovuje.
No a taky budeš muset překousnout, že pro Doctrine není na Nette ještě úplně vyladěný ekosystém (ale už na tom dělám).
- Elijen
- Člen | 171
Jen „plusy“ nikdy mít nebudeš. Všechno má své pro a proti a ty se
musíš prostě rozhodnout, co má pro daný projekt větší prioritu. Já
většinou Nette/Database
používám pouze na malé projekty ,
protože:
- je tam pořád pár bugů,
- v případě potřeby rozdělení modelu do více vrstev nebo nějaké větší abstrakce si všechno musí programátor napsat sám,
- složitější dotazy jsou příliš složité nebo je potřeba rovnou sahat
po
PDO
, - magie.
Doctrine 2:
- nabízí programátorovi hned několik vrstev modelu téměř zdarma, bez práce,
- na složité dotazy je možné použít
NativeQuery
spolu sResultSetMapping
, - rychlost a paměťovou náročnost podle mě částečně kompenzuje UoW a zabudované cachování.
Jediný opravdu závážný problém Doctrine 2 vidím v importování dat do DB, na což není určená a je potřeba použít nějakou jinou vrstvu.
Když to sečtu, tak mi vychází, že Doctrine 2 je dobré použít na větší projekty, do kterých se bude častěji sahat a Nette\Database na projekty, které jsou malého rozsahu, je potřeba je co nejrychleji/nejpohodlněji nějak splácat a tam, kde chceme věci udělat co nejjednodušeji.
Ohýbat Nette\Database do ORM, jak se často hodně lidí snaží, mi přijde jako perverznost :)
- enumag
- Člen | 2118
@Elijen: ORM nad Nette\Database nepovažuji za ohýbání ale za naprosto regulérní věc. NDB není ORM a ani si na to nehraje. Pohybuje se o vrstvu níž než ORM a že ji nějaké ORM vnitřně používá není imho nic proti ničemu.
V ostatním s tebou souhlasím, jen dodám že bugy jeden po druhém mizí (jen za poslední týden dal hrach na GitHub 2 nové opravné pully) a složitější dotazy časem zřejmě bude možné řešit i bez PDO (viz tento pull a související debata na fóru).
- Caine
- Člen | 216
Me hlavou zase vrta, proc Nette, ktery samo o sobe ma ambice na velky projekty, nema stejny ambice u jeho vlastni DB vrstvy? A v pripade, ze uz se nekomu nechce vymejslet znova kolo, proc alespon Nette officialne nepodporuje treba tu Doctrinu 2, kdyz ji pomalu polovina (mozna i vic) lidi tady pouziva? K cemu je vlastne NDB, kdyz vetsina lidi na foru stejne doporucuje ji nepouzivat a nebo jen na nejaky microsity?
PS: Tech bugu v NDB neni zas tolik a v podstate nejsou nijak zavazny, aby se nedaly snadno obejit, nebo jsem aspon zatim nenarazil na pripad, kdy by to nejak neslo (az na sqlLiteral, tam uz jsem musel zasahovat hloubejs:). Nejvic asi chybuje cachovani, ktery resim tak, ze jako cacheStorage pouzivam MemoryStorage, nebo pri vyberu sloupcu vyberu vsechny ->select(‚*‘) resp ty, co jsou potreba..
- Elijen
- Člen | 171
enumag napsal(a):
@Elijen: ORM nad Nette\Database nepovažuji za ohýbání ale za naprosto regulérní věc. NDB není ORM a ani si na to nehraje. Pohybuje se o vrstvu níž než ORM a že ji nějaké ORM vnitřně používá není imho nic proti ničemu.
Pokud budeš Nette\Database používat v ORM výhradně jako DBAL, tak to regulérní je, ale přijde mi to jako hloupost. Účel Nette\Database je co nejvíce odstínit programátora od SQL a JOINů. Je perfektní na rychlé vypsání dat z DB v šabloně, ale postavit na něm ORM? Nenapadá mě jediná výhoda, spíš spousta nevýhod.
velke mnozstvo dat sa da cez doctrine uplne krasne importovat ak sa pouzije spracovanie po davkach
Jde to, ale neni to uplne krasne a uz vubec rychle. Generuje to spousty zbytecnych query, zere spousta pameti, je to pomale.
- Filip Procházka
- Moderator | 4668
@Elijen: proto to taky nikdo nedělá přímo přes
Doctrine, ale pomocí migrací, nebo mysql
a
mysqldump
;)
- Michal Vyšinský
- Člen | 608
frosty22 napsal(a):
Edit: Ale furt se mi nechce již dost rozsáhlý model v WorkBench překopávat na entity :( Přemýšlím jak > si to ulehčit, ale moc možností není.
A co to udělat obráceně a z databázových tabulek nechat doctrine vygenerovat entity? (viz. [http://docs.doctrine-project.org/…e/tools.html#…]
Editoval CherryBoss (18. 1. 2013 9:31)
- frosty22
- Člen | 373
CherryBoss díky, reverzní inženýrství mě již také napadlo, ale stále si říkám, že to asi není moc cool, minimálně versus smyslu ORM, a také si nejsem jist zda-li toto provádět u plánovaně rozsáhlého projektu – není to zrovna čisté řešení, ale tuto možnost ještě nechávám otevřenou, díky.
BTW: Ještě se mi dostalo rady na twitteru: „správná odpověď je použít dibi“ .. nuž pravda toto jsem zde prozatím nezmínil, jsem pravděpodobně žil v omylu, že již se toto moc nepoužívá.