Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Warstwa dostępu do danych
cicik
post
Post #1





Grupa: Zarejestrowani
Postów: 219
Pomógł: 5
Dołączył: 18.07.2006
Skąd: Piekary Śląskie

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


Witam.
Od kilku lat systematycznie rozwijam swoją aplikację.
Jest ona coraz większa i zachciało mi się odzielić zapytania do bazy od logiki tak aby w przyszłości móc zamienić bezproblemowo mysqla na postgresa albo xmla albo jeszcze cokolwiek innego.
I tu pojawia się problem.
Przeczytałem sporo o wzorcach projektowych (ActiveRecord itp.) jednak one nie za bardzo spełniają moje założenia. W zapytaniach używam wielokrotnych złączeń, funkcji agregujących, funkcji dodatkowych (np. concat() czy date_add() w mysql). Tak więc ich koncepcja generalnie mi nie odpowiada.
Na phppatterns.com widziałem tez rozwiązanie brute forcowe polegające na tym, że tworzy się dla każdego modułu osobną klasę, w której dla każdego zapytania używanego w logice tworzy się osobną metodę zwracającą zestandaryzowany wynik zapytania. Jednak przy wielu zapytaniach klasa taka rozrośnie się niemiłosiernie.
Wszelkie kreatory zapytań też wydają mi się mało optymalne ze względu na bogactwo języka zapytań i na to, że nie może nikt mi zagwarantować, że późniejsze migracje do xmola zachowają kompatybilność np. z frazą gruoupby. Może się więc okazać, że jeżeli napiszę klasę kreatora zapytań implementującą metodę groupby() to potem nie będę miał jak tego przekonwertować do nowego enginu.

Pytanie moje jest więc takie.
Czy macie jakiś sensowny, łatwo dostosowywalny sposób na oddzielenie zapytań od logiki?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mike
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


php Pro?
Przenoszę na php.


P.S.
AdoDB
Creole
Propel
....
Go to the top of the page
+Quote Post
cicik
post
Post #3





Grupa: Zarejestrowani
Postów: 219
Pomógł: 5
Dołączył: 18.07.2006
Skąd: Piekary Śląskie

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


Cytat(mike_mech @ 18.07.2006, 23:42 ) *
php Pro?
Przenoszę na php.


Oto cytat z opisu forum php Pro: "Inżynieria programowania w php, strategie budowy aplikacji."
Jak dla mnie oddzielanie warstwy dostępu do danych od logiki aplikacji dotyczy jak najbardziej inżynierii programowania i strategii budowy aplikacji.


Cytat(NuLL @ 19.07.2006, 00:06 ) *


Nie chodziło mi o interfejs umożliwiający wykonanie zapytań dla różnych silników baz danych przez to samo ApI jakim jest PDO. Tylko o sposób oddzielenia zapytań od logiki systemu. Czyli o coś takiego abym w module aplikacji nie miał "Select * from ...".
Go to the top of the page
+Quote Post
bigZbig
post
Post #4





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Cytat(cicik @ 19.07.2006, 07:12 ) *
Nie chodziło mi o interfejs umożliwiający wykonanie zapytań dla różnych silników baz danych przez to samo ApI jakim jest PDO. Tylko o sposób oddzielenia zapytań od logiki systemu. Czyli o coś takiego abym w module aplikacji nie miał "Select * from ...".


Przecież u podstaw zawsze masz zapytanie do bazy danych, a caly problem polega na tym, ze rozne silniki baz danych stosuja rozne "wersje" SQLa. Dlatego zapytanie select z limitem dla MySQLa nie zadziala dla Oracla czy MSSQLa. Pdo wcale nie rozwiązuje wspomnianego przez Ciebie problemu bo PDO nie jest abstrakcją baz danych w pełnym tego słowa znaczeniu.

Wzorzec aktywnego rekordu nie jest rozwiązaniem stosowanym w celu unikniecia problemu niezgodnosci pomiedzy silnikami baz danych - chyba ze jest częścią tzw. ORMa (Object - Relational Mapping) - np. Propel lub Creole. Sa wygodne w uzyciu i nie wymagaja znajomosci SQLa, ale moim zdaniem jest to rozwiązanie mało optymalne i ograniczone do stosunkowo prostych relacji pomiedzy tabelami w bazie danych.

Alternatywą są rozwiązania typu ADO (Abstract Data Objects) jak ADOdb czy Zend_Db. Tłumacza zapytania na format obslugiwany przez dany silnik bazy. W praktyce nie wyszystko da sie "przetlumaczyc", ale jest to rozwiązanie o wiele bardziej elastycznie niz wyzej wspomniane.

Z kolei klasy typu DAO (Data Access Objects) to wlasnie to co miałeś na myśli pisząc o brute forcowych rozwiązaniach. Tu masz nieograniczona elastyczność i najwieksze mozliwosci optymalizacji. Klasy typu DAO nie ograniczają cie do silnikow baz danych, jako źródła danych. Minusem jest stosunkowo duży nakład pracy przy przejściu na inne źródło danych.
Go to the top of the page
+Quote Post
cicik
post
Post #5





Grupa: Zarejestrowani
Postów: 219
Pomógł: 5
Dołączył: 18.07.2006
Skąd: Piekary Śląskie

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


Cytat(bigZbig @ 19.07.2006, 13:11 ) *
Sa wygodne w uzyciu i nie wymagaja znajomosci SQLa, ale moim zdaniem jest to rozwiązanie mało optymalne i ograniczone do stosunkowo prostych relacji pomiedzy tabelami w bazie danych.


O to mi wlasnie chodzilo. Nie uwzgledniaja wszystkich mozliwosci.

Cytat(bigZbig @ 19.07.2006, 13:11 ) *
Z kolei klasy typu DAO (Data Access Objects) to wlasnie to co miałeś na myśli pisząc o brute forcowych rozwiązaniach. Tu masz nieograniczona elastyczność i najwieksze mozliwosci optymalizacji. Klasy typu DAO nie ograniczają cie do silnikow baz danych, jako źródła danych. Minusem jest stosunkowo duży nakład pracy przy przejściu na inne źródło danych.


Do tego rozwiazania jak narazie jestem najbardziej przekonany.
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 01:15