|
PHP PHP aplikacije, Smarty, PEAR |
|
Alati teme | Način prikaza |
27. 03. 2006. | #1 | |
Direktor Kombinata
Invented the damn thing
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
|
Generator klasa za pristup bazi podataka
Ovo pitanje se poteglo pre nekog vremena pa da i odgovorim na njega:
Citat:
Stvar funkcioniše prilično jednostavno. Dve abstraktne klase: DataObject (objekat koji predstavlja jedan row) i DataManager (poseduje definiciju tabele i metode za izvlačenje podataka i keširanje). Generator projuri sve tabele u navedenoj bazi i generiše naslednice ovih klasa tako da npr za usera dobiješ: /base/BaseUser.class.php /base/BaseUsers.class.php /User.class.php /Users.class.php Bazne klase sadrže opis objekta i njegove metode (npr. accessori za polja, funkcije za izvlačenje podataka itd). Druge dve klase su prazne i u njih možeš da trpaš svoj kod. Kad sledeći put generator bude preletao diraće samo bazne klase, neće i ove koje ti modifikuješ tako da je sinhronizacija tabela i klasa koje im pristupaju jako jednostavna (izvršim jedan skript), a ti ne moraš da se brineš da će doći do nekog gubitka podataka. Sve manje više liči na ActiveRecord, ali mi se nije svidelo učitavanje podataka o tabelama i redovima u svakom prolazu pa sam napravio generator. Manje više ista stvar jer ti omogućava: PHP kôd:
PHP kôd:
Overkill? Za sve što ima preko 5 tabela ne po mom mišljenju. Sa ovim se stvarno radi brže... BTW: Mana je što je samo persistance layer, nema mogućnost da skonta relacije među objektima... Za sada
__________________
activeCollab - Project Management and Collaboration Tool iz domaće kuhinje | area51.rs - Blog Poslednja izmena od Ilija Studen : 27. 03. 2006. u 21:19. |
|
27. 03. 2006. | #2 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
Ako ti treba da skonta "relacije" medju tabelama tipa da bi dobio neki tabelarni prikaz podataka na stranici koji povezuje podatke iz vise tabela u bazi onda samo napravi takav pogled u bazi podataka. Koliko mi je poznato MySQL 5 to podrzava.
A svaki pogled je u biti virtuelna tabela. I onda samo izgenerises klasu i za taj pogled. Naravno, podrazumeva se da ne vrsis apdejt koristeci pogled, vec klase za tabele koje su obuhvacene tim view-om. Naravno da se stedi vreme mnogo. Svako ko je imao priliku da programira dok se jos vrse razgovori o detaljima, zna koliko ovo pomaze. Npr. svake dve nedelje na sastanak, a tamo malo hoce ovo, malo ono, pa se i sama baza menja. Imas li podrsku za transakcije?
__________________
Commercial-Free !!! |
27. 03. 2006. | #3 |
Direktor Kombinata
Invented the damn thing
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
|
Podrška za transakcije postoji, naravno. Na žalost, MySQL ne podršava ugneždene transakcije pa se za kompleksnije operacije same trensakcije moraju kontrolisati spolja, ručno. Da li neko za rešenje za ovaj problem?
Što se relacija među objektima tiče kad sam rekao da nema podršku za njih mislio sam da ne generiše funkcija tipa Message::getComments() i slično ili Comment::getMessage(). Ovo i kaskadni update / brisanje je nešto što ću definitivno morati uskoro da dodam pošto jako često nalećem na situacije gde odsustvo toga pravi probleme (ili oduzima vreme ili moram da pazim na stvari koje se inače podrazumevaju). Što se pogleda tiče oni su jedna od stvari koja mi definitivno nedostaje kod MySQL 4.x. Kad 5ica uđe među mase neće biti problem dodati da generator prepozna view i na osnovu njega generiše read only klase...
__________________
activeCollab - Project Management and Collaboration Tool iz domaće kuhinje | area51.rs - Blog |
27. 03. 2006. | #4 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Mozda da pogledas PEAR::DB_Data_Object, ona radi skoro isto sto i ovaj tvoj kod, dakle, neka vrsta DAO (Data Access Object) patterna.
Nazovi me jos jednim "old school" momkom ovde, ali meni nista od toga nema previse smisla, tj. isuvise komplikacija da bi bilo korisno u jednom normalnoj PHP aplikaciji. Ja vise volim da sam pisem sql (ukljucujuci i join-e, sam bog zna kako se to radi sa ovim cudom :). |
28. 03. 2006. | #5 |
Direktor Kombinata
Invented the damn thing
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
|
Prosto učitanje, čuvanje, brisanje + keš + par sitnica (lazy load kolone npr) dobiješ gotove. Proizvod je jasno definisan, proširiv API za sve objekte koje čuvaš u bazi podataka.
Poenta ovoga nije da u potpunosti zameni SQL (kao recimo Criteria kod Propela / Torquea) ili nešto slično tome. Poenta je da napraviš granicu između aplikacije i baze (da ne moraš non stop da brineš o njoj) i automatizuje smorne delove. Kad treba da odradiš neki složeniji upit samo odradiš: PHP kôd:
Izmena: Pogledah DB_DataObject. Zahteva šemu... Pošto znam kakav je smor kad imaš šemu i kompleksan build proces (Propel) pa malo malo treba da rebuilduješ pored klasa i tabele u bazi to sam izbegao. Imaš bazu, odatle generator kupi informacije o klasama i to je to. Problem je što si osuđen samo na informacije koje baza pazi o tabeli, ali u ogromnoj većini slučajeva to je i više nego dovoljno. Po meni ne pruža svu fleksibilnost šema, ali radi posao dovoljno dobro...
__________________
activeCollab - Project Management and Collaboration Tool iz domaće kuhinje | area51.rs - Blog Poslednja izmena od Ilija Studen : 28. 03. 2006. u 00:16. |
28. 03. 2006. | #6 |
Branimir Momcilovic
Qualified
Datum učlanjenja: 15.02.2006
Lokacija: Beograd
Poruke: 167
Hvala: 47
25 "Hvala" u 8 poruka
|
Nisam odmah video da si odgovorio na "poziv". Vec neko vreme se mislim da napisem neki Code Generator za PHP, pa kad sam primetio da koristis nesto slicno, obradovao sam se da postoji dobro gotovo resenje, ono postoji, samo ne znam da li je open source...
Slazem se da je pristup dobar, on naravno ima ogranicenja, ali te nista ne sprecava da iskodiras rucno kad i sta ti treba, jednostavno skracuje onaj dosadni deo da svaki put iznova pises Select, Insert, Update, Delete. Pristup po kome sad ja radim (C#), nije moj vec nasledjen od iskusnijeg programera, je da se na osnovu tabela u bazi i gotovih templejta (CodeSmith) generisu neke osnovne SP, znaci GetByPrimaryKey, GetList, Update, Insert, bla bla, templejt je dovoljno pametan da prepozna i Foreign keys pa dobijas jos nekoliko SP-a u zavisnosti od relacija izmedju tabela. Kad kreiram SP onda obicno dopisem jos neku koja mi treba, eventualno neku izmenim... Onda generisem DAL (opet CodeSmith) komande (prakticno klase) koje primaju parametre za SP izvrsavaju ih (pune dataset ili sta vec treba) i to mu u osnovi dodje to... Posle toga svu komunikaciju sa bazom radim pomocu tako generisanog DAL-a, tako da na stranicama nema ni pozivanja SP, niti kakvog drugog SQL-a... |
28. 03. 2006. | #7 | |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
Citat:
Zamisli nesto malo vece.. pa treba ti 7 dana samo da otkucas sve CRUD funkcije, pa jos testiranje.. ko ce to vreme da ti odobri (= plati)? Ako isti posao ovakvi alati urade za manje od 1 minuta? I ti alati su obicno DOBRO provereni i testirani - gomila ljudi ih koristi, svi vazniji bagovi su odavno uhvaceni.. Iskreno ja da sam ti sef , ne bih ti dopustio da gubis vreme na ovakve trivijalnosti. Sto se JOIN-a tice: taj svoj komplikovani SELECT sa 100 JOIN-ova sacuvas u bazi kao VIEW i onda opet koristis ove alate posto je view u biti virtuelna tabela.. gotova prica. Dakle, ne drzis se ko pijan plota mantre "ne diram SQL" vec kombinujes jedno i drugo za sto efikasnije i jednostavnije resenje..
__________________
Commercial-Free !!! Poslednja izmena od degojs : 28. 03. 2006. u 18:02. |
|
28. 03. 2006. | #8 | |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Citat:
|
|
28. 03. 2006. | #9 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
Pa znam, napisao sam to jos u prvoj poruci.
Nije to onda ni old school ni new school, nego - ne moze i tacka jer baza ne podrzava pa nema sta ni da se prica old school i slicno..
__________________
Commercial-Free !!! |
29. 03. 2006. | #10 |
Predrag Supurović
Grand Master
Datum učlanjenja: 24.01.2006
Lokacija: Užice
Poruke: 791
Hvala: 3
200 "Hvala" u 12 poruka
|
Nije neizvodljivo da se klasi umesto samo imena tabele da ceo sql upit koji ona tretira kao tabelu.
__________________
Peđina beležnica (blog) - www.uzice.net - wireless.uzice.net - www.vokabular.org - www.vodic.net - forum.uzice.net |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
enkripcija podataka u mysql bazi | ivanhoe | SQL baze podataka - Sponzor: Baze-Podataka.net | 3 | 30. 08. 2009. 23:56 |
Koji jezik da koristim za pristup bazi? | biske | Programiranje | 10 | 08. 09. 2008. 13:12 |
performanse klasa vs. statickih klasa vs. funkcija | ivanhoe | PHP | 8 | 22. 08. 2008. 08:48 |
[C#] Modeli/Pristup bazi | Bojan Zivanovic | Programiranje | 6 | 03. 07. 2008. 19:10 |
Izmjena podataka u bazi putem dinamicke forme - uz koristenje Ajax-a | bokacbl | (X)HTML, JavaScript, DHTML, XML, CSS | 4 | 04. 02. 2006. 03:25 |