Projektowanie baz danych - różne architektury

Projektowanie baz danych - różne architektury
D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 124
0

Panowie,

Ostatnio wgłębiłem się w temat projektowania baz danych jako model ERD i po wyrysowaniu kilka baz w różnych model tabel zastanawiam się jak dobrze zdecydować o wyborze modelu w którym ułożymy tabele pomijając jakie faktycznie będę między nimi interakcje. Gdzie dobrze znajduje zastosowanie jednolity model 1NF a gdzie podział na kilka różnych tabel w 3NF. Chyba, że Waszym zdaniem wynika to bardziej z pozytywów i neg. danego modelu. Tworzy się dziś diagram encji i konwertuje go na Diagram Relacji Obiektów chyba, że od razu skupiamy sie na relacjach miedzy obiektami bazy ?

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1951
4

Pod zapisy chcesz mieć znormalizowany model danych, aby nie musieć aktualizować danych w wielu miejscach - data consistency. Natomiast pod odczyty, wydajniejszy będzie zdenormalizowany model danych - indeksy, offline, hurtownie.

D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 124
0

Ok, tyle, że na ile np zastosowanie modelu 3NF przy dodawaniu książki do bazy gdzie mamy podział nawet na 3 tabelki będzie ew szybszy od 1NF i upchania wszystkiego w jednym skoro w tym I wszystkim który wymieniłem obiekt będzie w tabelce z identyfikatorem. Chyba, że pownienem wykonać jakieś testy czasowe na obu.

SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1185
1

Tak naprawdę nie ma dobrej odpowiedzi na to pytanie. Dla każdej decyzji robimy nową tabelę czy też nie trzeba wziąć pod uwagę czy plusy przeważają nad minusami

Przykładowo możesz mieć bazę dla jakiejś gry online. Informacje takie jak dane użytkownika, postacie, tranzakcje pieniężne raczej chcesz trzymać w sposób znormalizowany, bo te informacje są często aktualizowane/odpytywane przez różne miejsca w systemie. Z drugiej strony zapisy (jaka jest postać w danej sesji, ile ma życia, jakie przedmioty) mogą być lepsze w postaci 0NF w formie jakiegoś dokumentu np. JSONa

Z zalet takiego podejścia:

  • aplikacja wcale nie chce czytać/aktualizować konkretne pole z zapisu. Dużo prościej wszystko wczytać i zapisać za każdym razem. Dodanie nowego pola to może być po prostu nowa linia w aplikacji bez ruszania schematu bazy.
  • takie zapisy mogą mocno ewoulować. Przykładowo w jednej wersji postać ma tylko punkty życia a w kolejnej dodałeś manę. Baza danych nie ma dobrej wiedzy jaka powinna być ilość punktów mana dla postaci z wersji gry, która jeszcze nie miała magii. Zamiast tego możesz w bazie trzymać wersję zapisu np. "version: "1.0" a kod w aplikacji będzie wiedział jak go zmigrować do nowej wersji np. o ta postać ma rasę czarującą to jej damy dużo many
  • co tyczy się poprzedniego punktu: utrzymywanie złożonego modelu bazy jest upierdliwe. Migracje są często stresujące i mogą zablokować całą bazę. Jeżeli nie dbasz o zalety normalizacji (redundacja, łatwe odpytanie/aktualizacja konkretnej wartości z bloba) to uproszczony model może być lepszy

Tak naprawdę to nie ma lepszej metody niż spróbowania kilku podejść i wybranie, która się nam bardziej podoba. Warto sobie wyobraźić jakiego rodzaju zapytania/zapisy będą dotykały bazy i czy konkretny model bazy jest do tego dobrze dostosowany

Ok, tyle, że na ile np zastosowanie modelu 3NF przy dodawaniu książki do bazy gdzie mamy podział nawet na 3 tabelki będzie ew szybszy od 1NF i upchania wszystkiego w jednym skoro w tym I wszystkim który wymieniłem obiekt będzie w tabelce z identyfikatorem.

Jak nie projektujesz w jakiejś ogromnej skali to się tym nie przejmuj. Rób tak, żeby dobrze się tego używał a nie, żeby było szybko.

W przypadku wydajności nie ma dobrej odpowiedzi. Poczytaj jak działa MVCC w bazach danych. Taki postgres o ile dobrze wiem to zazwyczaj kopiuje cały wiersz przy aktualizacji co oznacza, że dla tabel z dużymi polami/dużą ilością pól brak normalizacji może sprawić, że marnujesz procesor i storage na kopiowaniu wszystkiego. Z drugiej strony dodanie jednego wiersza, którego nigdy nie będziesz modyfikował będzie raczej szybsze niż 20 nowych wierszy rozbitych na różne tabele

D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 124
0

Rozumiem więc kwestia zaprojetkować pewien model wprowadzić dane testowe i przepytać dobrze taką bazę analizując zarówno co pokazuje oraz w jakim czasie to robi. Niestety w moim przypadku to będzie baza większa z parametrami czujników maszyn, aby można było kontrolować parametry.

nawet jeśli spytam się wujka google ,,where should I use 3NF table model" to może gdzieś na forum ang skrawki porad znajdziesz więc co na razie sam projektuje mniejsze bazy z przykładów :-p.

Dziękuję rzecz jasna za porady i przykład ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.