Gdzie aplikacja zgodna z JDBC powinna przechowywać swoje instrukcje SQL i dlaczego?
Do tej pory udało mi się zidentyfikować te opcje:
- Zakodowane na stałe w obiektach biznesowych
- Osadzone w klauzulach SQLJ
- Hermetyzuj w oddzielnych klasach, np. Obiekty dostępu do danych
- Oparte na metadanych (oddziel schemat obiektu od schematu danych - opisz mapowania między nimi w metadanych)
- Pliki zewnętrzne (np. Pliki właściwości lub zasobów)
- Procedury składowane
Jakie są „zalety” i „wady” każdego z nich?
Czy kod SQL powinien być uważany za „kod” czy „metadane”?
Czy procedury składowane powinny być używane tylko do optymalizacji wydajności, czy też stanowią uzasadnioną abstrakcję struktury bazy danych?
Czy wydajność jest kluczowym czynnikiem przy podejmowaniu decyzji? A co z uzależnieniem od dostawcy ?
Co jest lepsze - luźne połączenie czy ciasne połączenie i dlaczego?
EDITED: Dziękuję wszystkim za odpowiedzi - oto podsumowanie:
Oparte na metadanych, tj. Mapowanie relacyjne obiektu (ORM)
Plusy:
- Bardzo abstrakcyjny - serwer DB można przełączyć bez konieczności zmiany modelu
- Szerokie - praktycznie standard
- Zmniejsza ilość potrzebnego kodu SQL
- Może przechowywać SQL w plikach zasobów
- Wydajność jest (zwykle) akceptowalna
- Podejście oparte na metadanych
- (Baza danych) niezależność dostawcy
Cons:
- Ukrywa SQL i prawdziwe intencje programistów
- SQL trudny do przejrzenia / zmiany przez DBA
- SQL może być nadal potrzebny w dziwnych przypadkach
- Może wymusić użycie zastrzeżonego języka zapytań, np. HQL
- Nie nadaje się do optymalizacji (abstrakcji)
- Może brakować referencyjnej integralności
- Zastępuje brak znajomości języka SQL lub brak dbałości o kod w bazie danych
- Nigdy nie dopasowuj wydajności natywnej bazy danych (nawet jeśli jest blisko)
- Kod modelu jest bardzo ściśle powiązany z modelem bazy danych
Zakodowane na stałe / zamknięte w warstwie DAO
Plusy:
- SQL jest przechowywany w obiektach uzyskujących dostęp do danych (hermetyzacja)
- SQL jest łatwy do napisania (szybkość rozwoju)
- SQL można łatwo wyśledzić, gdy wymagane są zmiany
- Proste rozwiązanie (bez bałaganu w architekturze)
Cons:
- SQL nie może być sprawdzany / zmieniany przez DBA
- SQL prawdopodobnie stanie się specyficzny dla bazy danych
- SQL może stać się trudny do utrzymania
Procedury składowane
Plusy:
- SQL przechowywany w bazie danych (blisko danych)
- SQL jest analizowany, kompilowany i optymalizowany przez DBMS
- SQL jest łatwy do przeglądu / zmiany dla administratora
- Zmniejsza ruch sieciowy
- Zwiększone bezpieczeństwo
Cons:
- SQL jest powiązany z bazą danych (blokada dostawcy)
- Kod SQL jest trudniejszy do utrzymania
Pliki zewnętrzne (np. Pliki właściwości lub zasobów)
Plusy
- SQL można zmienić bez konieczności przebudowywania aplikacji
- Oddziela logikę SQL od logiki biznesowej aplikacji
- Centralne repozytorium wszystkich instrukcji SQL - łatwiejsze w utrzymaniu
- Łatwiejsze do zrozumienia
Cons:
- Kod SQL może stać się nie do utrzymania
- Trudniej sprawdzić kod SQL pod kątem błędów (składni)
Osadzone w klauzulach SQLJ
Plusy:
- Lepsze sprawdzanie składni
Cons:
- Zbyt ściśle wiąże się z Javą
- Niższa wydajność niż JDBC
- Brak dynamicznych zapytań
- Nie tak popularne