Co to jest baza danych i dlaczego ma być normalna?
Czytamy sobie dokument, w którym napisane jest, że system będzie posiadał 3 bazy danych: jedną OLTP i dwie OLAP. Myślimy sobie od razu, że pewnie to jakiś wielki system za grube miliony. Jakież jest nasze zdziwienie, gdy okazuje się, że to mały “systemik”, a każda baza ma tak naprawdę po 3 tabele. Nasuwa się od razu pytanie — po co ta cała komplikacja? Czyż nie uczono nas na studiach, że baza ma być jedna i to w 3. postaci normalnej i dzięki temu wszyscy będą żyli długo i szczęśliwie?
Otóż nie. Błąd (mój w tym wypadku) polegał na użyciu terminu “baza danych”, w miejsce prawidłowego “magazyn danych”. Baza danych kojarzy się jednoznacznie z bardzo konkretnym fizycznym bytem żyjącym na serwerze RDBMS: ma przypisane pliki, w których przechowywane są dane, swój log transakcyjny itp.
Magazyn danych jest natomiast tworem czysto logicznym. Jest on dla mnie tak bardzo użyteczny, ponieważ definiując architekturę systemu dbam właśnie o logiczną organizację danych:
- granice między obszarami o transakcyjnej (ACID) integralności danych
- sposób reprezentacji danych
Mogę także umieścić dowolnie wiele logicznych magazynów danych na jednym serwerze bazodanowym, a nawet w jednej fizycznej bazie. Czemu nie! Przynajmniej na początku, kiedy nie wiadomo, czy system będzie potrzebował dodatkowej wydajności.
Dane, które nie muszą być aktualizowane w sposób transakcyjny mogą zostać przypisane do różnych logicznych obszarów integralności. W granicach tych obszarów wszelkie operacje zachowują charakterystykę ACID. Pomiędzy obszarami semantyka ACID nie jest zachowana. Możemy liczyć jedynie na możliwość przesyłania komunikatów. Dzięki temu, w razie potrzeby, możemy poszczególne obszary ulokować na różnych fizycznych maszynach i cała operacja będzie przeźroczysta dla systemu.
Czy konieczność przesyłania komunikatów jest dla mnie bolesna? W żadnym razie! Pierwsza wersja może być po prostu wyposażona w “zaślepkę”, która realizuje asynchroniczne przesyłanie komunikatów synchronicznie. Takie rozwiązanie znalazło się m.in. w projekcie DDDSample (zarówno oryginalnym, jak i moim porcie).
W ramach poszczególnych obszarów dane mogą mieć różną organizację. Moim drugim błędem było użycie terminu “OLAP” w odniesieniu do dwóch z proponowanych “baz”. Termin ten jednoznacznie kojarzy się z hurtowniami danych. Tak naprawdę chodziło mi jedynie o sposób reprezentacji danych relacyjnych specyficzny dla zastosowań OLAP — denormalizację oraz schematy gwiazdowe (śnieżynkowe). Nie trzeba wcale w oparciu o te dane budować wielowymiarowej kostki — wystarczy, że będę potrzebował zrobić kilka bardziej skomplikowanych zapytań i już trud włożony w budowę osobnej struktury raportowej zwróci się z nawiązką.
Z drugiej strony reprezentacja danych transakcyjnych także nie jest kwestią banalną. Bardzo wiele można zyskać jeszcze na poziomie modelowania, gdzie, poprzez odpowiednie przekształcenia, możemy np. wyeliminować potrzebę aktualizacji istniejących danych (na korzyść dodawania nowych).
Podsumowując:
- wiele logicznych magazynów danych nikomu nie szkodzi
- podobnie asynchroniczna komunikacja
- rozwiązania rodem z OLAP (denormalizacja i schemat gwiazdy) są przydatne także w prostszych zastosowaniach
- największą poprawę wydajności systemu bazodanowego można uzyskać na poziomie modelu, a nie samej bazy danych
Co o tym sądzicie?




about 1 year ago
Bardzo dziwnym zjawiskiem jest traktowanie stwierdzenia “jedna baza danych per aplikacja” jako prawdy objawionej, niekwestionowanego dogmatu. Wiele razy spotkałem się ze zdziwioną miną i prymitywnym HĘĘ?? na wzmiankę o możliwości wykorzystania więcej niż jednej bazy dla danego, nawet nieskomplikowanego, systemu. Czy to pokutuje wspomniane przez ciebie wbijanie takiego myślenia do głowy przez całe studia?
about 1 year ago
To zalezy… taka mam na ten temat opinie. Wszystko zalezy od tego co chcemy trzymac i jakie to ma znaczenie dla aplikacji.
pracowalem z roznymi systemiami czasami nawet nie tylko serwer bazodanowy byl inny (Object DB, XML DB, Oracle, DB2 – jedna aplikacja dane w wyzej wymienionych serwerach bazodanowych) dla kazdej instancji bazy danych ale takze dane roznily sie struktura jak i przeznaczeniem.
Dla przykladu na MS interview mialem zaprojektowac system ktory domyslnie wspiera jednego uzytkownika a po godzinie rozmowy mial juz wpsierac 100 milionow uzytkownikow w rozporszonym systemie itp itd – wiem, przyklad duzego rozwiazania a nie malego, ale to pokazuje, ze wszystko jest zalezne.
dla prostego systemu przechowujacego CV kilku osob nie tworzylbym kilku instancji baz o roznych schematach, bo nie widze w tym sensu. ale na przyklad przy systemie fakturowania i obslugi wielu klientow juz bym sie zastanawial.
Dodatkowo, wiele “logicznych magazynow danych” oczywisice ze moze szkodzic – glupi przyklad, maintenance. Wprowadzenie poprawek itp. wiec to nie jest tak ze dodamy sobie klase i jest spoko – oj nie, tutaj wchodzi dodatkowa praca.
“rozwiązania rodem z OLAP (denormalizacja i schemat gwiazdy) są przydatne także w prostszych zastosowaniach” – nie we wszystkich, zmienilbym na moga byc przydatne a nie sa.
“największą poprawę wydajności systemu bazodanowego można uzyskać na poziomie modelu, a nie samej bazy danych” – zakladajac ze schemat/model zostal zwalony, bo jezeli jest dobry to juz niekoniecznie. Choc i widzialem przyklady gdzie fatalny schemat bazy danych dostawal maksymalnego kopa po pewnych zmianach serwerowych i konfiguracyjnych.
“podobnie asynchroniczna komunikacja” – znow zalezy
od tego co z czym ma sie komunikowac, na jakiej zasadzie i od czego jest to uzaleznione.
ale sie rozpisalem
ale tak jak na poczatku napisal: To zalezy
Gutek
about 1 year ago
@Gutek
Co masz na myśli mówiąc o datkowej pracy w przypadku większej liczny logicznych magazynów danych? Jeśli to tylko kilka tabelek w tej samej bazie to nie powinno być z tym większych problemów od strony IT stuff
“rozwiązania rodem z OLAP…” – zgadzam się:)
“największą poprawę…” – OK, znowu się wyraziłem zbyt czarno-biało
“podobnie asynchroniczna komunikacja” – miałem na myśli fakt, że można ją symulować synchronicznie, więc nie wiąże się z dodatkowym nakładem pracy.
“To zależy” — doookładnie. Wszystko zależy. Celem mojego posta było pokazanie, że sposób zaprojektowania bazy danych też zależy i nie koniecznie jest to 3cia forma normalna.
about 1 year ago
@Szymon
Ok, mowiac “logiczna” to rozumiem osobny schemat bazy/osobna instancje bazy, a w Management Studio to porpostu kolejny lisc drzewa
Dla mnie w jezyku polskim brak okreslenia “server baz danych” jako ze potocznie sie mowi: zainstalujemy baze danych maja na mysli DB Server, nastepnie sie mowi: “utworzy sie baze danych” i ma sie na mysli stworzenie instancji bazy danych o okreslonym schemacie.
Roznica pomiedzy Database Server a Database w polskim jezyku nie istnieje, to znaczy istnieje, ale w 95% ludzie wykorzystuja slowo Baza Danych zamiennie.
Wiec rasumujac, zrozumialem Twoj “logiczny magazyn dancych” jako kolejna database – ha nie uzylem polskiego slowa!
Wytlumaczylem o co mi chodzilo?
Gutek