Interesujące w tym wątku pytania i odpowiedzi jest to, że w rzeczywistości są 3 pytania. Każdy odpowiedział na inny i prawie nikt nie odpowiedział na pierwszy:
- Dlaczego nie są niektóre bazy danych w środowisku naturalnym znormalizowane?
- Dlaczego / kiedy powinna być znormalizowana w bazie nieznormalizowana ?
- W jakich sytuacjach normalizacja jest szkodliwa lub niepotrzebna?
Alert czytelnicy zauważą, że są to bardzo różne pytania, i postaram się odpowiedzieć na każde z nich osobno, unikając zbyt wielu szczegółów. Przez „zbyt wiele” mam na myśli to, że nie uważam, aby był to odpowiedni kontekst, w którym należy prowadzić dłuższą debatę na temat zalet różnych argumentów za lub przeciw normalizacji; Po prostu wyjaśnię, jakie są te argumenty, może wymienię kilka zastrzeżeń i zachowam filozofię na bardziej szczegółowe pytania, jeśli kiedykolwiek się pojawią.
Ponadto w tej odpowiedzi zakładam , że „normalizacja” implikuje „BCNF, 3NF lub co najmniej 2NF” , ponieważ taki poziom normalizacji zwykle zamierzają osiągnąć projektanci. Rzadziej można zobaczyć konstrukcje 4NF lub 5NF; chociaż z pewnością nie są celami niemożliwymi, zajmują się semantyką relacji, a nie tylko ich reprezentacją , co wymaga znacznie większej wiedzy na temat dziedziny.
A więc dalej i wyżej:
1. Dlaczego niektóre bazy danych na wolności nie są znormalizowane?
Odpowiedź na to może być „ponieważ nie powinny”, ale przyjęcie tego założenia od samego początku jest dość kiepską pracą detektywistyczną. Jako społeczeństwo nie osiągnęlibyśmy wielkiego postępu, gdybyśmy zawsze działali w oparciu o założenie, że cokolwiek jest, powinno być.
Rzeczywiste powody, dla których bazy danych nie podlegają normalizacji, są bardziej skomplikowane. Oto top 5, z którymi się spotkałem:
Programiści, którzy go zaprojektowali, nie wiedzieli lub nie rozumieli, jak normalizować. Mocnym dowodem na to jest wiele innych towarzyszących złych wyborów projektowych, takich jak stosowanie kolumn varchar do wszystkiego lub spaghetti bałaganu o bezsensownych nazwach tabel i kolumn . Zapewniam cię, że widziałem „prawdziwe” bazy danych, które są tak samo złe, jak te w artykułach TDWTF.
Deweloperzy, którzy go zaprojektowali, nie dbali o to lub zasadniczo czynnie sprzeciwiali się normalizacji . Uwaga: tutaj nie mówię o przypadkach, w których podjęto świadomą decyzję, aby nie normalizować na podstawie analizy kontekstowej, ale raczej zespoły lub firmy, w których normalizacja jest mniej lub bardziej rozumiana, ale po prostu ignorowana lub odrzucana z przyzwyczajenia. Znowu zaskakująco powszechne.
Oprogramowanie zostało / zostało wykonane jako projekt Brownfield . Wielu purystów ignoruje ten całkowicie uzasadniony biznes, a nie techniczną przyczynę braku normalizacji. Czasami tak naprawdę nie możesz zaprojektować nowej bazy danych od zera, musisz skorzystać z istniejącego starszego schematu, a próba normalizacji w tym momencie wymagałaby zbyt dużego bólu. 3NF został wynaleziony dopiero w 1971 r., A niektóre systemy - zwłaszcza systemy finansowo-księgowe - mają swoje korzenie jeszcze dalej!
Baza danych była pierwotnie znormalizowana , ale nagromadzenie małych zmian w długim okresie czasu i / lub szeroko rozpowszechniony zespół wprowadził subtelne formy powielania i inne naruszenia jakiejkolwiek normalnej formy, która pierwotnie istniała. Innymi słowy, utrata normalizacji była przypadkowa i zbyt mało czasu poświęcono na refaktoryzację.
Podjęto świadomą decyzję biznesową, aby nie tracić czasu na analizę biznesową lub projektowanie baz danych i po prostu „zrobić to”. Jest to często fałszywa ekonomia i ostatecznie staje się rosnącą formą długu technicznego , ale czasami jest racjonalną decyzją, przynajmniej opartą na informacjach, które były wówczas znane - na przykład baza danych mogła być zaprojektowana jako prototyp, ale ostatecznie awans do wykorzystania produkcyjnego z powodu ograniczeń czasowych lub zmian w otoczeniu biznesowym.
2. Dlaczego / kiedy należy znormalizować znormalizowaną bazę danych?
Ta dyskusja często pojawia się, gdy baza danych jest normalizowana na początek. Albo wydajność jest niska, albo jest dużo powielania zapytań (dołączeń), a zespół czuje, słusznie lub niesłusznie, że posunął się tak daleko, jak to możliwe przy obecnym projekcie. Ważne jest, aby pamiętać, że normalizacja poprawia wydajność przez większość czasu i istnieje kilka opcji, aby wyeliminować nadmierne sprzężenia, gdy normalizacja wydaje się działać przeciwko tobie, z których wiele jest mniej inwazyjnych i ryzykownych niż zwykła zmiana na model zdormalizowany:
Utwórz indeksowane widoki zawierające najczęstsze obszary problemów. Nowoczesne systemy DBMS umożliwiają ich wstawianie lub aktualizowanie (np. INSTEAD OF
Wyzwalacze programu SQL Server ). Wynika to z niewielkim kosztem instrukcji DML w bazowych tabelach / indeksach, ale ogólnie jest pierwszą opcją, którą powinieneś wypróbować, ponieważ jest prawie niemożliwe, aby zepsuć i prawie nic nie kosztuje. Oczywiście nie każde zapytanie można przekształcić w widok indeksowany - zapytania zagregowane są najbardziej kłopotliwe. Co prowadzi nas do następnego elementu ...
Utwórz zdenormalizowane tabele agregatów, które są automatycznie aktualizowane przez wyzwalacze. Tabele te istnieją oprócz tabel znormalizowanych i stanowią rodzaj modelu CQRS . Innym popularniejszym obecnie modelem CQRS jest użycie pub / sub do aktualizacji modeli zapytań, co daje korzyść asynchronii, chociaż może to nie być odpowiednie w bardzo rzadkich przypadkach, w których dane nie mogą być nieaktualne.
Czasami widoki indeksowane nie są możliwe, stawki transakcji i woluminy danych są zbyt wysokie, aby dopuszczać wyzwalacze o akceptowalnej wydajności, a zapytania zawsze muszą zwracać dane w czasie rzeczywistym. Te sytuacje są rzadkie - zaryzykuję przypuszczenie, że mogą dotyczyć takich transakcji jak transakcje o wysokiej częstotliwości lub bazy danych organów ścigania / wywiadu - ale mogą istnieć. W takich przypadkach naprawdę nie masz innej opcji, jak denormalizować oryginalne tabele.
3. W jakich sytuacjach normalizacja jest szkodliwa lub niepotrzebna?
Istnieje tutaj kilka dobrych przykładów:
Jeśli baza danych jest używana tylko do raportowania / analizy. Zazwyczaj oznacza to , że dla OLTP używana jest dodatkowa , znormalizowana baza danych, która jest okresowo synchronizowana z bazą danych analizy za pośrednictwem ETL lub wiadomości.
Egzekwowanie znormalizowanego modelu wymagałoby niepotrzebnie złożonej analizy przychodzących danych. Przykładem może być system, który musi przechowywać numery telefonów zebrane z kilku systemów zewnętrznych lub bazy danych. Państwo mogłoby denormalize kod wywoławczy i numeru kierunkowego, ale trzeba by uwagę wszystkich różnych możliwych formatach, nieprawidłowych numerów telefonów, numerów vanity (1-800-GET-stuff), nie wspominając o różnych lokalizacjach. Zwykle jest to więcej kłopotów niż jest to warte, a numery telefonów są zwykle po prostu umieszczane w jednym polu, chyba że potrzebujesz konkretnej potrzeby biznesowej, aby samodzielnie wybrać numer kierunkowy.
Gdy relacyjna baza danych jest przede wszystkim w celu zapewnienia obsługi transakcji dla dodatkowej, nierelacyjnej bazy danych. Na przykład możesz używać relacyjnej bazy danych jako kolejki komunikatów lub do śledzenia statusu transakcji lub sagi, gdy podstawowe dane są przechowywane w Redis, MongoDB lub czymkolwiek. Innymi słowy, dane to „dane kontrolne”. Normalizacja danych, które nie są danymi biznesowymi , zwykle nie ma sensu .
Architektury zorientowane na usługi, które współużytkują fizyczną bazę danych. Jest to trochę dziwne, ale w prawdziwym SOA czasami będziesz musiał fizycznie zduplikować dane, ponieważ usługi nie mogą bezpośrednio nawiązywać zapytań o dane. Jeśli zdarzy się, że współużytkują tę samą fizyczną bazę danych, wydaje się , że dane nie są znormalizowane - ale ogólnie dane posiadane przez poszczególne usługi są nadal znormalizowane, chyba że istnieje jeden z innych czynników łagodzących. Na przykład usługa fakturowania może być właścicielem podmiotu wystawiającego rachunek, ale usługa rachunkowości musi otrzymać i przechowywać datę i kwotę rachunku, aby uwzględnić ją w przychodach za dany rok.
Jestem pewien, że jest więcej powodów, których nie wymieniłem; W gruncie rzeczy mam na myśli to, że są one dość specyficzne i będą dość oczywiste, kiedy pojawią się w praktyce. Baz danych OLAP są niby do schematów użycie gwiezdnych, SOA są powinien mieć jakąś powielania itd Jeśli pracujesz z dobrze znanego modelu architektury, które po prostu nie działa z normalizacją, wtedy nie normalizować; ogólnie rzecz biorąc, model architektury ma pierwszeństwo przed modelem danych.
I aby odpowiedzieć na ostatnie pytanie:
Czy to prawda, że dobrzy architekci i eksperci wybierają projekt zdenormalizowany, a niedoświadczeni programiści wybierają coś przeciwnego? Jakie są argumenty przeciwko rozpoczęciu projektowania z myślą o normalizacji?
Nie, to kompletne i kompletne BS To również BS, że eksperci zawsze wybierają znormalizowany projekt. Eksperci nie tylko przestrzegają mantry. Badają, analizują, dyskutują, wyjaśniają i iterują, a następnie wybierają takie podejście, które najbardziej odpowiada ich konkretnej sytuacji.
Baza danych 3NF lub BCNF jest zwykle dobrym punktem wyjścia do analizy, ponieważ została wypróbowana i udowodniona, że odnosi sukcesy w dziesiątkach tysięcy projektów na całym świecie, ale z drugiej strony, podobnie jak C., to nie znaczy, że automatycznie używamy C w każdym nowy projekt. Rzeczywiste sytuacje mogą wymagać pewnych modyfikacji modelu lub zastosowania innego modelu. Nie wiesz, dopóki nie znajdziesz się w takiej sytuacji.