Moim zdaniem to nie jest wada, że sprawdzanie poprawności danych (walidacja) jest wykonywana na kilku poziomach. Każda z warstwa ma bowiem inne zadanie. W pierwszej kolejności baza danych, struktura bazy powinna zapewniać jak największą kontrolę spójności danych poprzez stosowanie ograniczeń (constraints) kluczy (primary keys, foreign keys) oraz kontroli danych (typy pól, unique constraints, trigers, stored procedures). To zapewnia kontrolę spójności na pierwszym poziomie (najważniejszym - ponieważ dane powinny być logicznie spójne). Powstaje natomiast problem przekazywania informacji do aplikacji co do jakości błędu, nie do samego jego wystąpienia lecz do tego jaki błąd wystąpił oraz jakie są np. poprawne wartości. Jak to przekazać do aplikacji aby ta właściwie poinformowała o tym końcowego użytkownika?
W aplikacji stosuję warstwę pośredniczącą pom. obiektami (tabelami) bazy danych a aplikacją (np tabela produkt i klasa DBProdukt - u mnie to jest generowane półautomatycznie ale nie wnikam w szczegóły). Klasa ta zapewnia drugi poziom walidacji kontrolując podstawowe dane takie jak typ, zakres, maska, not null itd dla danych (można to sprowadzić do kontroli danych na poziomie jednego pola bez powiązań). Warstwa ta nie jest odpowiedzialna za wystawiani komunikatów użytkownikowi.
Jest również kolejna warstwa, która waliduje dane pod względem logicznym włączając w to powiązania pom. polami takie jak data 1 nie może być większa niż data 2 itp. Stosuję tutaj 2 rozwiązania. Albo zawieram takie powiązania w osobnej klasie walidatora albo mam to w klasie vidoku - nieistotne. Ta warstwa jest odpowiedzialna za pierwsze (po poście) - wstępne zwalidowanie popranwości pól począwszy od typu, zakresu, maski, aż do powiązań i walidacji logicznej pól. W zasadzie przepuszczenie błędu przez tą warstę skutkuje bądź to wywaleniem się aplikacji w drugiej warstwie (DBProdukt) albo ostatecznie wywaleniem się bazy. Ta warstwa również dokłądnie wie jaki błąd wystąpił i jaki (czytelny) komunikat ma wyświetlić użytkownikowi.
Dzięki temu zapewniam sobie mocną kontrolę danych. Mimo tego, że mam z tym sporo pracy, uważam że wysiłek się opłaca. Klasy DB (DBProdukt) używam w wielu miejscach gdzie nie zawsze stosuję te same reguły logicznych powiązań.
Należy tworzyć taki kod walidacji aby można go był wykorzystać w innych miejscach aplikacji, aby przy zmianie reguł nie poprawiać ich w 100 miejscach tylko w jednym.
Należy jednak pamiętać o kilku zasadach:
- baza danych to świętość - należy tak ją konstruować aby była maksymalnie spójna w każdej sytuacji
- kontrola danych na poziomie podstawowym (typ, maska, zakres)
- kontrola danych logiczna - powiązania logiczne pól w określonej sytuacji (kontekście aplikacji)
-

! starać się tak pisać kod reguł aby był do wykorzystania w innych miejscach aplikacji a nie pisane zawsze od nowa (a poprawiać tylko raz)
Pozdro