Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> db layer, jak pisac?
dr_bonzo
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Stoje przed zadaniem napisania abstrakcji na bazy danych i mam dwa rozwiazania do wyboru:

1. zupelna abstrakcja od api az po pseudo skladnie sql, ktora ma byc identyczna dla kazdej z baz (lub zamiast skladni, budowanie zapytania, np.
$q = $db->newQuyery( 'select' );
$q->addFields( array( 'ID', 'blabla' ) );
$q->addTable(...
$q->limited( 3,5 );
subqueries
triggers
transactions
itd...
masa roboty, ale za to mam calkowita niezaleznosc od bazy, nie moge wykorzystac wszystkich mozliwosci bazy (np. triggery w psql -- w mysqlu chyba nie ma?)

[aplikacja]<->[db layer]<-**[DB]

lub

2. tworze tylko wspolne api -- sql bedzie recznie wpisywany i bedzie rozny dla roznych baz + tworze kolejna abstrakcje (dla kazdej z baz) zawierajaca podstawowe zapytanie uzywane przez aplikacje, np. pobierz dane usera, pobierz wszystkie newsy

[aplikacja]<->[podstawowe operacje]<-**[db layer (bardziej API)]<->[DB]

co jest latwiejsze (chyba) do napisania ale nie mam calkowitej niezaleznosci od bazy i przenoszenie na inna baze wymaga napisania nowych "podstawowych funkcji".

Jak wy to rozwiazaliscie, ktore z rozwiazan sie sprawdza? A moze macie inne pomysly?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
rzseattle
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 554
Pomógł: 0
Dołączył: 4.04.2002
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Problem ktory poruszyles jest dosc zlozony. Mozna do niego podejsc na roznorakie sposoby. Ja proponuje ci calkowicie uniezaleznienie sie od SQL i potraktowanie tabeli jako obiektu.

Nie bede na ten temat sie rozpisywal. http://rzseattle.piwko.pl/doObject/ tutaj znajdziesz stara dokumentacje do mojego obiektu obslugujacego baze danych. Dokumentacja obejmuje niezbedna podstawe do tego co ci jest potrzebne. Niestety obecnie dokumentacja nie nadaza za kodem wiec nie ma w niej opisanych bardziej zaawansowanych rzeczy.

Jesli ktos ma podobne dokumentacje to chetnie je obejze.
Go to the top of the page
+Quote Post
M4chu
post
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


A może Propel?
Go to the top of the page
+Quote Post
Nievinny
post
Post #4





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


Ja myślę, że wystarczy API, na tyle spójne aby obsługiwało kilka baz (MySQL, PostgerSQL, MSSQL, itp). Zwykle DB Layer składa się z niskopoziomowych funkcji. Można stworzyć klasę funkcji wysokopoziomowych jako dodatek. To jest moje zdanie.
Go to the top of the page
+Quote Post
hawk
post
Post #5





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


@dr_bonzo: A po co ty to w ogóle piszesz? Pisanie takiej biblioteki ma sens wtedy, gdy ma ona być lepsza (przynajmniej w czymś) od istniejących. A jest tego sporo, począwszy od prostych API, skończywszy na ORM. PEAR DB, ADODB, PDO, EZPDO, Creole, MetaStorage, Entity, Propel, DB_DataObject... większości nie znam, więc nie będę oceniał. Czym twoja biblioteka będzie się wyróżniać?

@rzseattle: większość z tego, co wymieniłem, to chyba właśnie ORM. Możesz obejrzeć dokumentację, ja się niestety nie znam na temacie.

@Nievinny: jaki jest sens pisania własnego, spójnego API, skoro php ma takie API wbudowane?
Go to the top of the page
+Quote Post
Nievinny
post
Post #6





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


@hawk -> dlatego aby współnym AIP obsłużyć MySQL, SQLite etc..
Go to the top of the page
+Quote Post
hawk
post
Post #7





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


@Nievinny: powtarzam, jaki jest sens tworzyć wspólne API do obsługi MySQL, SQLite etc., skoro php ma wbudowane wspólne API do obsługi MySQL, SQLite, etc.?

Dla niewtajemniczonych: PDO. I w zasadzie to wbudowane ono dopiero będzie, na razie chyba trzeba sobie dociągnąć. Co nie zmienia faktu że będzie.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


@hawk: najpierw mial to byc prosty layerek, ale wzrpsly wymagania wbec niego i zaczalem wywazac otwarte drzwi. Dzieki za przypomnienie i linki (zaoszczedziles mi troche roboty (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Dobry pomysl z tym PDO (na razei jako PECL a od 5.1 w php).

Biore sie za sprawdzanie Creola.
Go to the top of the page
+Quote Post
Nievinny
post
Post #9





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


@hawk -> OK, ale czemu nie stworzyć własnego z dodatkowymi funkcjami, np Cache, lub zliczanie zapytań?
Go to the top of the page
+Quote Post
hawk
post
Post #10





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


@Nievinny: a czemu nie stworzysz od podstaw własnego parsera XML? Własnego silnika do regexpów? Własnego <tu wstaw dowolne rozszerzenie php>... Bo php już to ma.

Dlaczego nikt w Javie nie pisze własnego JSP? Nikt nie pisze aplikacji desktopowych pisząc najpierw własną implementację Swinga?

Dlaczego wreszcie nie napisać w ogóle aplikacji w php zaczynając od reimplementacji od nowa w C samego silnika php?

A konkretnie: jeżeli warto zaimplementować mechanizm cache (pewnie warto, bo PDO AFAIK nie ma), to chyba lepiej oprzeć się o PDO, niż pisać wszystko samemu od podstaw?
Go to the top of the page
+Quote Post
Nievinny
post
Post #11





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


@hawk -> Czyli twoim zdaniem należy wykorzystać PDO i dodać do tego Cache?
Ale, PDO nie ma w PHP4, a ładowanie rozszerzeń za pomocą dl() to przesada, więc jak to zrobić w PHP4? (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


Przesiasc sie na 5ke.
Go to the top of the page
+Quote Post
Nievinny
post
Post #13





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


@dr_bonzo -> ja działam na PHP5, ale nie każdy zleceniodawca ma tę 5, więc nie da się inaczej. A poprosiłbym jeszcze o jakieś przykłady wykorzystania PDO?
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


A czytales cokolwiek o PDO?
Mozesz z nim zrobic to samo co ze standardowymi rozszerzeniami (mysql, psql, ...) tylko dla kazdego uzywasz tych samych metod (wspolne API) niezaleznie od bazy danych.
Go to the top of the page
+Quote Post
SongoQ
post
Post #15





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


@dr_bonzo Co do pierwszego rozwiazania to troche bedzie problem niby SQL to standard ale w roznych bazach rozne sie zapisuje, np limit - w ORACLE takie cos nie istnieje.
Go to the top of the page
+Quote Post
Nievinny
post
Post #16





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


@dr_bonzo -> czytałem i chodzi mi oto, że jakiś ksrypcik przykładowo... A pozatym jak admin serwera nie udostępni tych rozszerzeń? To co? Myślę, że dopuki nie będzie na standardzie to nie ma szans na skuteczne użycie zawsze i wszędzie...
Go to the top of the page
+Quote Post
hawk
post
Post #17





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


@Nievinny: jak admin serwera nie udostępni rozszerzenia do <tu wstaw swoją bazę danych> to i tak nic nie będzie działać.

No dobra, skoro działasz na PHP4, to czemu nie chcesz używać ADODB? Trochę się czepiam, nie chodzi mi akurat o ciebie ani o to samo ADODB. Chodzi mi o to, że jest dla php wiele gotowych rozwiązań. Jedne już wchodzące jako standard (PDO), inne powszechnie używane. I co? I nic. Napiszmy wszystko od nowa.

BTW, pomijając różnice pomiędzy PHP4 a 5, PDO nie jest rozszerzeniem, które może być lub nie być. Od PHP5.1 sprawa ma być prosta: masz obsługę np. MySQL = automatycznie masz PDO dla MySQL.

BTW2, jak ktoś interesuje się PDO, to niech poszuka też o DBDO. Świat php nie jest jednomyślny, ale to są już dyskusje na znacznie wyższym poziomie merytorycznym.
Go to the top of the page
+Quote Post
Nievinny
post
Post #18





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

Ostrzeżenie: (0%)
-----


@hawk -> działam na 4 tylko kiedy zlecą mi wykonanie skryptu pod 4. Zwykle działam pod 5. I używam co prawda nie ADoDB, ale innego dobrego db layera. I chętnie zacznę używać gotowego PDO, tylko wskażcie mi, że admin servera na którym jest php powiedzmy 5.0.3 (lub inne z serii 5.0.x) udostępni rozszerzenie PDO dla skryptów to będe to wykorzystywał. Inaczej muszę używać mysql_cos lub sqlite_cos
Go to the top of the page
+Quote Post
radziel
post
Post #19





Grupa: Zarejestrowani
Postów: 103
Pomógł: 0
Dołączył: 25.04.2003
Skąd: Olsztyn

Ostrzeżenie: (0%)
-----


Hm, a ja mam do Was pytanie. Chcąc pisać skrypty, w miarę niezależne od typów baz, jednocześnie nie komplikując ich kodu, jak byście rowiązali problem dot. zwracania przez dany model, tych samych danych, ale przy różnych (w treści) zapytaniach.
Czy wyralibyście:

A) tworzymy globalną tablicę typu:
  1. <?
  2. $arrQueries['mysql']['select user'] = 'SELECT * FROM...';
  3. $arrQueries['pgsql']['select user'] = 'SELECT * FROM...';
  4. $arrQueries['sqlite']['select user'] = 'SELECT * FROM...';
  5. ?>

Potem, odwołując się odpowiednio do tej tablicy:
  1. <? $resResult = $db->query($arrQueries[DB_TYPE]['select user']);?>


B) Tworzymy oddzielne modele i sterownik bazy dla każdej z baz.
C) Tworzymy jeden model, ale w każdej metodzie występuje switch.
  1. <?
  2. switch(DB_TYPE)
  3. {
  4. case 'mysql': $q='SELECT * FROM...'; break;
  5. case 'pgsql': $q='SELECT * FROM...'; break;
  6. case 'sqlite': $q='SELECT * FROM...'; break;
  7. }
  8. $resResult = $db->query($q);
  9. ?>

D) Przygotowujemy oddzielne skrypty. z odpowiednią obsługą - najprostrze,ale najbardziej czasochłonne przy modyfikacjach.

Szczerze mówiąc, wybrał bym wariant B. Co o tym myślicie?
Go to the top of the page
+Quote Post
M4chu
post
Post #20





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


e) Kozystamy z gotowego rozwiazania: ezsql, adodb, creole. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Btw: przyklady troche bez sensu, bo we wszystkich tych bazach zapytania maja niemal identyczna strukture (selecty we wszystkich), wiec po co do kazdej bazy dawac inne zapytanie (ktore de facto bedzie identyczne? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:42