Php - ORM rendszerek
Sziasztok!
Érdekelne, hogy ORM redszerekkel kapcsolatban kinek milyen tapasztalatai vannak?
Ez az a része a dolgoknak, amit nagyon nem szeretnék saját kezűleg megírni. :-) Én egyelőre a doctrinet kezdtem el nézegetni, és elég szimpatikus a megközelítésük.
■ Érdekelne, hogy ORM redszerekkel kapcsolatban kinek milyen tapasztalatai vannak?
Ez az a része a dolgoknak, amit nagyon nem szeretnék saját kezűleg megírni. :-) Én egyelőre a doctrinet kezdtem el nézegetni, és elég szimpatikus a megközelítésük.
általánosan
PHP-s ORM rendszert még nem használtam, csak JAVA-sat (JPA - Toplink, Eclipselink, mint provider), de szerintem azért tapasztalatként 1-2 dolog mindkét nyelven megállja a helyét :-)
Ami megdöbbentő volt számomra, az az, hogy mennyire gyorsan lehet benne fejleszteni (főleg, ha valami normális IDE-t használ az ember, ami támogatja a code completion-t).
1-2 nap alatt olyan kódot lehet vele írni/generálni, amit ha "kézzel" írsz meg, akkor mondjuk 2-3-szor ennyi idő is elmegy rá.
Viszont persze a hátránya az egésznek (és itt lenne fontos, hogy konkrétan melyik ORM-et választja az ember), a konfigurálhatóság, testre szabhatóság.
Napjaim mentek el olyan apróságokra, hogy pl.: a Toplink nem képes kezelni az időtúllépést, és így "elveszik" a query, illetve előfordul sok olyan eset, amik össze-vissza kell JOIN-olgatnod, meg GROUP BY-olnod, stb. és ezt nem mindig egyszerűen, és ésszerűen lehet megoldani.
Szóval szerintem mindenképpen jó ötlet használni, de könnyedén tud vele szívni is az ember :-)
Java ORM
Azért szeretnék ORMet használni, mert nem szeretnék mindent újraírni majd adatbázis cserekor(ha lesz elég felhasználó, akkor szerver és db váltás lesz előbb-utóbb).
Másrészt meg szeretném megoldani valahogyan az automatikus escapelést,típuskonverziókat etc.... És nem szeretnék hónapokat azzal tölteni, hogy saját ORMet írjak. :-)
Hibernate
Eddig phpra CodeIgnitert használtam, most ismerkedem a Kohanaval. Úgy látom abban is van ORM rész, kíváncsi vagyok... esetleg ha van róla véleményetek örömmel fogadom :-)
Béke:
Gábor.
Szerk: Érdemes logolni az sql-t, és így láthatod, mi történik a háttérben. Én így debugoltam legutóbb egy olyan problémát, mikor is a hibernate a .toLowerCase() függvénnyel egy LOWER() -t szúrt be az adott helyre az sql -ben, és nagyon lelassult a dolog...Szerencsére itt a weblaboron találtunk megoldást a problémára (utf8_bin ről utf8_hungarian_ci -re a collation és már nem is kell a lower)
Érdekes :-)
Abból indultam ki, hogy vannak tábláid, és van egy felületed, amit egy osztály (vagy aktív rekord) képvisel. Az ORM lényegében a táblákat köti össze a felülettel, szóval az osztály tulajdonságai a táblák megfelelő oszlopainak felelnek meg.
Egyelőre valami ilyesmi használatra gondoltam:
Nem tudom, hogy létezik-e ehhez hasonló logikájú ORM, de szívesen használnám :-P Ha nem, akkor lehet, hogy megírom MySQL-re, aztán meg majd PgSQLre. Egyelőre mondjuk még elég hiányos az sql tudásom. A hasTable mellé mondjuk még felvennék egy hasRange tulajdonságot, amivel a JOINokat kezelném le, de ahhoz már fáradt vagyok, hogy arra is írjak az én logikám szerinti példát.
Btw. egyébként nekem nagyon tetszene, ha írnátok példákat arra, hogy az általatok használt ORMben hogyan valósítható meg valami. Szerintem így másoknak is hasznos lehetne később ez a topic.
kohana
doctrine
Másrészt - szerintem - nem kell a használatuktól félni, egy idő után az ember rájön mikor érdemes használni az ORM-et és mikor a hagyományos lekérdezéseket, hogy optimális maradjon az oldal.
sebesseg
that's my 2 cent
-cs-
Sanyi
számított?
Úgy értem, általában több nagyságrenddel nagyobb szokott lenni 1-1 oldal letöltődése,renderelése, mint mondjuk a generálása, illetve az adatbázis lekérdezések.
Bár biztos vannak olyan esetek, amikor számít :-)
ORM vs sebesség
1. Tökéletes programot nem fogsz tudni csinálni! Mindenhol és mindig lehet optimalizálni, gyorsabbat készíteni, csak van egy pont, aminél nem éri meg több időt a kódra szánni, mert egyszerűen plusz havi 10$ kiadással raksz alá nagyobb vasat és többet gyorsul az egész, mint ha hetekig tökölne az ember a további optimalizálással.
2. A sebességet nem kell túlmisztifikálni! Meg kell mérni, hogy egyáltalán mi és mennyi ideig tart. Ha az derül ki, hogy eleve nagy mennyiségű adattal kell dolgozni az adatbázisban és vannak lekérések, amik önmagukban tized másodpercig tartanak, akkor teljesen mindegy, hogy a te PHP kódod 50 vagy 100 század másodperc alatt fut le, ha a teljes idő 60-80%-a az adatbázis lekéréssel megy el.
3. Az idő pénz! És ne felejtsük el, jobb ma egy veréb, mint holnap egy túzok! Egyrészt az ORM és a keretrendszerek:
- jelentősen tudják csökkenteni a fejlesztési időt (értsd: 6-10 hónap helyett -> 3-4 ez egyáltalán nem elhanyagolható különbség)
- átláthatóbbá és könnyebben fejleszthetővé teszi az elkészült munkát
- csökkenti a hibalehetőségek számát egyes komplexebb lekéréseknél
- amennyiben úgy látom jónak - van ilyen -, sima MySQL-es lekérést használok továbbra is, tehát megtehetem, hogy egyes helyeken mégse használom
Ez az egész kicsit hasonlít arra, mint régen a PHP (vagy más script nyelv használata) vs C++ . Lehet, hogy az utóbbival nagyon gyors oldalakat lehet csinálni, de a fejlesztési idő össze sem vethető a PHP-val. Egyszerűen a keretrendszerrel olyan előnyökre teszel szert, amik bőven kárpótolják az esetek többségében a sebességvesztést.
Persze a fentiek nem szentírások. Egyszerű weboldalaknál mi sem használjuk a Symfony-t, de komplexebbeknél, ahol tényleg hónapos fejlesztési időről beszélünk, fel se merül, hogy a sebesség miatt "pure PHP-ban" írogassunk. Ha az oldal terheltsége indokolja, később átírjuk, de ha pl nem válik be az üzleti elképzelés, és az oldal nem hoz annyi látogatót, vagy az a mennyiség, amennyit hoz, bőven elfut Symfony-n is (vagy más keretrendszeren, itt most az elv a lényeg, nem a konkrét rendszer), akkor felesleges pénzkidobás és időpazarlás lett volna sebességmániában körüllengve 2-3-szor annyi idő alatt egy kb 50%-al gyorsabb oldalt összedobni, miközben esetleg század, maximum tized másodpercekről beszélünk. Az a 2-3-szoros időtényező pedig olyan, mint a nyugdíjkorhatár: 1 év eltolás 2 év "nyereség". Ugyanis nem elég, hogy a plusz fejlesztési idő pénzbe kerül, azon idő alatt nem is termel!
Sokkal de sokkal fontosabb, hogy gyorsan legyen egy működő oldal, mint hogy később legyen egy majdnem tökéletes.
A keretrendszerek ráadásul bizonyos kereteket kényszerítenek rád, ami inkább előny, mint hátrány. Sok esetben még a későbbi bővítés is gyorsabban megy bennük. (Pl írok egy új filtert 30 sorban és már kész is, saját rendszer esetén meg lehet, hogy 6 fájlban kellene átírnom dolgokat - tudom, mert 10 éve ezt csinálom és anno, keretrendszerek nélkül is csináltam nagyobb munkákat, vagy éppen saját keretrendszert)
Hogy a topikot nyitónak is válaszoljak:
Én használtam Propelt és Doctrine-t is. Az utóbbinál sokkal kevesebbszer kellett kerülő megoldáshoz folyamodnom - értsd: magam írtam be az SQL lekérdezést -, abból kifolyólag, hogy nem vagy csak nagyon bonyolultan lehetett volna összerakni a szükséges lekérdezést! Tehát én egyértelműen Doctrine-ra szavazok és nem a sebessége miatt, de ahogy fentebb is írtam, ha számít a sebesség, kihagyom. Pl van egy formunk, ami automatikusan menti, ha kitöltött egy mezőt az illető, AJAX-szal, a háttérben. Bár symfony-s az oldal, az egészet megoldottam egy mezei, 50 soros PHP-val.
tapasztalat
viszonylag sokat teszteltem a doctrine-t es legfokeppen azon bosszankodtam mikor megneztem a trace/profile fajlokat, hogy maga a lekerdezes 1 egyseg alatt megvolt, mig a tobbi objektum meg php kod, ami az orm-t kapcsolatos, ahhoz 2 egyseg kellett.
[Szemelyen szubjektiv tapasztalat, akar ki is hagyhato :-)]:
Masik fele a dolognak, hogy mire beallitottam es telepitettem a doctrine-t, addigra egy komplett projektreszt megirtam volna. De mivel volt 1 het szabad idom, addig gondoltam kiprobalom mit tud. Elotte nem nagyon hasznaltam ilyen komplex orm-t ugyhogy 1 napot a doctrine tanulassal plusz telepitessel plus yaml tanulassal toltottem. Igazabol sokat szivtam, azzal hogy a dokumentacio es a letoltheto doctrine abszolut nem volt szinkronban egymassal. Ugyhogy buheralas lett belole, amit nagyon nem szeretek csinalni, de pozitivan alltam a dologhoz(meg). Nagyon sokat bibelodtem a yaml irasaval is, mert istennek sem akarta az igazsagot latni, rengeteget szivtam vele. Szerintem ebben a reszben nagyokat hibaztak a forditott logika hasznalataval a 'foreign key' kapcsan. Az automatikus forditasok yaml modellek segitsegevel nagyon jo dolog, csak ne kellett volna 4 oran at allitgatni, hogy mi merre milyen konyvtar, igy nem stimmel ugy nem stimmel, egy hajmereszto mutatvany volt.
[Szubjektiv resz vege]
Mindenesetre lehet nem fekszik az en logikamnak, amit a doctrine nyujt (ebben szinte biztos vagyok), es emiatt rengeteg bosszankodasom volt vele. Tovabba egy sima joinos lekerdezes mysql_query-vel elfert 3 megaba, mig doctrine-el 13 megaba, azert rendesen elgondolkoztatott, hogy ez igy tenyleg megeri e? Persze a celkornyezetben, mindossze 16 mega allt rendelkezesre egy lekerdezeshez, dehat meg egy keretrendszernek is el kellett fernie benne.
Igazabol akkor latom ertelmet a doctrine hasznalatanak, amikor nagy belso intrantetes projekt van, ahol elobb utobb valtozas fog tortenni az adatbazist illetoen. Lehet ez verziovaltas vagy akar komplett motorvaltas is. Minden mas eseteben a nativ sql lekerdezesek letrehozasa es tesztelese nalam 1 nagysagrenddel kevesebb idobe telett, mint doctrine hasznaltaval. Ehhez hozzajarul az is, hogy nekem tetszik az sql nyelv.
Programtervezesi szempontbol, sulyozni kell, hogy kinek mennyire nehez sql-eket irni, mennyire valtozik a futtato kornyezet, hanyan dolgoznak a projektben es ez alapjan merlegelni, h. segedeszkozokhoz nyuljon vagy sajat maga csinalja meg. Az applikacio tobbi reszeben en is altalaban keretrendszerekhez fordulok. Nekem eddigi tapasztalataim alapjan majdnem minden keretrendszer eseteben a leggyengebb lancszem az adatbaziskezeles volt.
Kesobb szerencsere talalkoztam masik orm-mel, amely olyan kezes volt, mint a barany es nem kellett nekem 3 oranal tobb az elsajatitasahoz, ezt hivjak ezComponent-nek(ez nem reklam akar lenni). Az itt talalhato logika nagyon kis mertekben mas, mint magaban az sql-ben talalhato, mindossze az osszehasonlito muveletek igenyelnek nemi megszokast.
-cs-
Sanyi
Hmm
Joel
lworm
RedBeanPHP
Propel vs Doctrine
A keretrendszer használata is nyilván memória igényesebb és lassabb mint nélküle, de főleg a sok legenerált kód miatt gyorsabb a fejlesztés. De a PHP eleve ilyen, ráférne nagyon egy GC. Volt olyan hogy nagy mennyiségű rekordot akartunk bevinni a formok segítségével, de sehogy se sikerült megállítani a memória szivárgást. Valahogy végül nagy nehezen sikerült belepréselni magunkat az 512 megába :-) A sebesség meg sok mindenen múlik. Ha a vevő oldalon a rendszergazda láma, akkor lehetsz bármilyen okos, ha viszont okos, akkor akár még segíthet is (pl: APC cache).
De jó tapasztalatom nincs azzal kapcsolatban hogy a Propel mysqlen kívül bármire használható lenne. Firebirden nem megy. Oracle alatt meg rengeteg a szívás. A saját magad által leírt queryk meg pont azért rosszak, mert lehet benne olyan ami a másik db-ben nincs (pl: Groupconcat, de firebirdnél nincs limit se).