Aplikacje bazodanowe - kwestia słowników

0

Ostatnio piszę dość dużo aplikacji DB. Często w bazach danych istnieją pewne pojęcia, które się powtarzają (np. nazwy miast) dlatego ujęte są w osobne tabele. W innych tabelach tworzy się powiązania do tej tabeli i tak dalej.

W aplikacji taka relacja jest często widoczna jako pole wyboru Combo.

Zasadniczo sam wykorzystywałem dwa sposoby pobierania danych:

1). Miałem funkcję pobierzCombo, która gdy było to potrzebne (przykładowo otwierało się jakieś okienko z tym polem), łączyła się z bazą danych i pobierała spis np. miast. Połączenie musiało nastąpić za każdym razem, gdy otwierało się okienko zawierające pole combo. Problem był taki, że często potrzebny był numer ID danej nazwy miasta, ale w combo widoczne miały być tylko nazwy, więc rozwiązanie się nieco komplikowało.

2). Utworzyłem sobie klasę MIASTA i tworzyłem z niej listę obiektów MIASTO. Dzięki temu łączyć się z bazą musiałem tylko raz, a potem mogłem wstawiać do Combo miasta prostą pętlą pobierającą nazwy z listy obiektów. Dodatkowo dostanie się do ID wybranego miasta było banalne.

Zasadniczo bardziej podoba mi się metoda 2, jednak martwi mnie wykorzystanie pamięci przy bardzo dużej ilości takich obiektów. Druga sprawa, to jeśli z bazą pracują dwie osoby, to w przypadku modyfikacji danych przez jedną osobę, zmiany nie są widocznie u osoby drugiej.

Jak wy rozwiązujecie następujący problem?

0

Cóż problem zmiany danych pod nosem użytkownika istnieje w obu przypadkach. Co czy przechowujesz tylko stringi z nazwami w combo box'ie, czy obiekty miasto nie ma znaczenia. Jeżeli w trakcie przeglądania combo box'a ktoś np. usunie jedno miasto lub zmieni jego nazwę to w obu przypadkach masz niespójny stan danych w pamięci względem bd.

Drugie rozwiązanie jest wygodniejsze generalnie są to tego całe frameworki. Mówi się na nie ORM (object-relation mapping) i pod Javą masz do tego np. Hibernate. Pierwsze stosuje się wtedy gdy częściej wykonujesz operacje na całych tabelach niż na pojedynczych krotkach lub gdy po prostu nie chcesz dokładać kolejnego frameworku do swojego projektu.

A problem synchronizacji danych w pamięć z danymi w bd i utrzymaniem spójność rozwiązuje się transakcjami. Raczej mało aplikacji pracujących na bd napisałeś skoro tego nie wiesz. Generalnie na poziomie izolacji serializable jak jedna transakcja pobierze jakąś krotkę do odczytu to żadna inna transakcja nie ma prawa pobrać ją do zapisu. Czytnij sobie jakąś książkę o relacyjnych bazach danych bo w prawie każdej transakcje są opisane a jest to zbyt szeroki temat żeby go na forum poruszać.

0

Co do ilości napisanych aplikacji zgadza się, napisałem ich mało. Raczej wcześniej tworzyłem same struktury baz bez interface'u.

Co do transakcji, na razie wykorzystywałem je tylko w przypadku jeśli kilka zapytań miało wykonać się "jako jedno".

0

Komplikujesz sobie życie tworząc coś, co już jest.
Przecież TStrings ma coś takiego jak lista obiektów.
Czyli Objects.

Tego używaj. Oczywiście mówię o Delphi, ale myślę, że w innych językach też to może być.

0
Juhas napisał(a)

Przecież TStrings ma coś takiego jak lista obiektów.

Komplikujesz sobie z czym ?

poza tym co ma TStrings to problemu zachowania spójności danych w pamięci w tymi w bazie danych :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1