Kiedy należy denormalizować?

45

Myślę, że wszyscy znamy normalizację baz danych .

Moje pytanie brzmi: z jakich wskazówek korzystasz, kiedy chcesz denormalizować tabele?

Richard
źródło
3
Witryny StackExchange mają wyjątkową przewagę nad innymi witrynami w Internecie, ponieważ 1) pozwalają na znalezienie najłatwiejszych odpowiedzi i 2) najlepsze odpowiedzi są określane przez społeczność. Z tego powodu uważam, że ta strona i Internet skorzystałyby na tym pytaniu, mimo że jest to w pewien sposób sprzeczne z najczęściej zadawanymi pytaniami .
Richard
2
możliwy duplikat Jak daleko posunąć się z normalizacją?
Jack Douglas,
1
Możliwe duplikaty / powiązane informacje Kiedy denormalizować projekt bazy danych
John Sansom

Odpowiedzi:

34

Denormalizuj, gdy są to operacje OLAP, normalizuj, kiedy OLTP (z połączonego artykułu w sekcji Denormalizacja)

Bazy danych przeznaczone do przetwarzania transakcji online (OLTP) są zwykle bardziej znormalizowane niż bazy danych przeznaczone do przetwarzania transakcji online (OLAP). Aplikacje OLTP charakteryzują się dużą liczbą małych transakcji, takich jak aktualizacja rejestru sprzedaży w kasie w supermarkecie. Oczekuje się, że każda transakcja pozostawi bazę danych w spójnym stanie. Natomiast bazy danych przeznaczone do operacji OLAP są przede wszystkim bazami „głównie do odczytu”. Aplikacje OLAP mają tendencję do wydobywania danych historycznych, które gromadziły się przez długi czas. W przypadku takich baz danych nadmiarowe lub „zdenormalizowane” dane mogą ułatwiać aplikacjom analizy biznesowej. W szczególności tabele wymiarowe w schemacie gwiazdy często zawierają dane zdenormalizowane. Zdenormalizowane lub nadmiarowe dane muszą być dokładnie kontrolowane podczas przetwarzania, ekstrakcji, transformacji, ładowania (ETL), a użytkownicy nie powinni mieć dostępu do danych, dopóki nie będą w spójnym stanie. Znormalizowaną alternatywą dla schematu gwiazdy jest schemat płatka śniegu. W wielu przypadkach potrzeba denormalizacji zmniejszyła się, gdy komputery i oprogramowanie RDBMS stały się bardziej wydajne, ale ponieważ wolumeny danych ogólnie wzrosły wraz z wydajnością sprzętu i oprogramowania, bazy danych OLAP często nadal używają zdormalizowanych schematów.

Denormalizacja służy również do poprawy wydajności na mniejszych komputerach, takich jak w komputerowych kasach fiskalnych i urządzeniach mobilnych, ponieważ mogą one wykorzystywać dane tylko do wyszukiwania (np. Wyszukiwania cen). Denormalizacji można również użyć, gdy nie ma RDBMS dla platformy (takiej jak Palm) lub nie ma potrzeby wprowadzania żadnych zmian w danych, a szybka reakcja ma kluczowe znaczenie.

billinkc
źródło
4
Denormalizuję, kiedy tworzę raporty lub analizy i chcę szybkich rezultatów. Wszystkie indeksy na świecie z wieloma łączeniami nigdy nie są tak szybkie jak zdormalizowana tabela reprezentująca buforowane dane, które się nie zmienią.
kevinsky
Zwięzły i bardzo pomocny. Pracowałem na peryferiach DBA, co pomaga w zakreśleniu wielu rzeczy.
Jason P Sallinger
Wiele aplikacji ma pewne wymagania zarówno OLAP, jak i OLTP, dlatego każdy programista zaplecza powinien nauczyć się mieszać oba te elementy i dbać o to, aby zdominowane dane były aktualne.
JustAMartin
22

Normalizuj, aż boli, denormalizuj, aż działa (tj .: wydajność staje się akceptowalna) :)

Andrei Rînea
źródło
5
To chyba nie najlepsza odpowiedź, ale jest to jeden z najlepszych jedno-liniowych filmów, które widziałem na Stack Overflow :)
Owen
15

Jednym z potencjalnie rozsądnych powodów zastosowania kontrolowanej denormalizacji jest to, że pozwala ona zastosować pewne ograniczenie integralności do danych, które w innym przypadku nie byłoby możliwe. Większość SQL DBMS ma bardzo ograniczone wsparcie dla ograniczeń wielu tabel. W SQL czasami jedynym skutecznym sposobem implementacji pewnych ograniczeń jest upewnienie się, że atrybuty związane z ograniczeniem są obecne w tej samej tabeli - nawet jeśli normalizacja dyktuje, że należą one do oddzielnych tabel.

Kontrolowana denormalizacja oznacza, że ​​mechanizmy są wdrażane w celu zapewnienia, że ​​niekonsekwencje nie mogą powstać z powodu nadmiarowych danych. Przy podejmowaniu decyzji, czy denormalizacja jest opłacalna, należy wziąć pod uwagę koszt tych dodatkowych kontroli i ryzyko niespójności danych.

Innym częstym powodem denormalizacji jest dopuszczenie pewnych zmian w strukturach pamięci lub innej fizycznej optymalizacji, na którą DBMS inaczej nie pozwoliłby. Zgodnie z zasadą niezależności danych fizycznych DBMS powinien dysponować środkami do konfiguracji wewnętrznych struktur pamięci bez niepotrzebnej zmiany logicznej reprezentacji danych w bazie danych. Niestety wiele DBMS bardzo ogranicza możliwości fizycznej implementacji dostępne dla dowolnego schematu bazy danych. Zwykle zagrażają niezależności fizycznej bazy danych, obsługując jedynie nieoptymalną implementację pożądanego modelu logicznego.

Powinno to być oczywiste, ale nadal trzeba powiedzieć: we wszystkich przypadkach zmiany w fizycznych funkcjach implementacyjnych mogą decydować o wydajności - takich jak wewnętrzne struktury danych, pliki, indeksowanie, sprzęt i tak dalej. Normalizacja i denormalizacja nie mają nic wspólnego z optymalizacją wydajności lub pamięci masowej.

nvogel
źródło
4

Wykonaj normalizację, jeśli często uzyskujesz dostęp do danych obliczeniowych, jak sugerują odpowiedzi na to pytanie . Koszt przechowywania i utrzymywania obliczonych danych będzie często niższy niż koszt ponownego ich obliczania w kółko, jeśli Twój profil obciążenia jest obciążony odczytem.

Nick Chammas
źródło
Zauważ, że jest to szczególnie przydatne, jeśli denormalizacja służy po prostu buforowaniu wartości. Aby nadal istniała znormalizowana kolekcja tabel / pól. Oznacza to, że dla każdej wartości powinna istnieć pojedyncza „główna” komórka przechowująca tę wartość - inne wartości są jedynie kopiami lub obliczeniami z tego wzorca - i jeśli nie ma wyraźnych korzyści, aby zrobić inaczej, zachowaj wszystkie komórki nadrzędne w znormalizowanych związkach.
ToolmakerSteve
3

Rutynowo denormalizuję, aby móc egzekwować integralność danych z ograniczeniami. Jednym z przykładów jest ostatnie pytanie na tej stronie - replikuję kolumnę w innej tabeli, dzięki czemu mogę użyć ograniczenia CHECK, aby porównać ją z inną kolumną. Innym przykładem tej techniki jest mój post na blogu .

Nie można używać wiązań CHECK do porównywania kolumn w różnych wierszach lub w różnych tabelach, chyba że zawinie się taką funkcjonalność w skalarnych UDF wywoływanych z ograniczenia CHECK. Co zrobić, jeśli faktycznie chcesz porównać kolumny w różnych wierszach lub w różnych tabelach, aby wymusić regułę biznesową? Załóżmy na przykład, że znasz godziny pracy lekarza i chcesz się upewnić, że wszystkie spotkania mieszczą się w godzinach pracy? Oczywiście możesz użyć wyzwalacza lub procedury przechowywanej do wdrożenia tej reguły biznesowej, ale ani wyzwalacz, ani procedura przechowywana nie dają 100% gwarancji, że wszystkie twoje dane są czyste - ktoś może wyłączyć lub upuścić twój wyzwalacz, wprowadzić niektóre brudne dane i ponownie włącz lub ponownie uruchom wyzwalacz. Również ktoś może bezpośrednio zmodyfikować tabelę, omijając procedury składowane.

Pokażę, jak wdrożyć tę regułę biznesową przy użyciu tylko ograniczeń FK i CHECK - to zagwarantuje, że wszystkie dane spełniają regułę biznesową, o ile wszystkie ograniczenia są zaufane.

Jeszcze innym przykładem jest sposób egzekwowania, aby okresy nie miały luk ani nakładania się .

AK
źródło
1
„Rutynowo denormalizuję, aby móc egzekwować integralność danych z ograniczeniami”. To samo tutaj. To świetny kompromis: trochę się denormalizujesz, ale zyskujesz DRI .
Nick Chammas
@NickChammas - to bardzo interesujące. Czy możesz udostępniać scenariusze, gdy robisz takie rzeczy?
AK
1
Na pewno. Mamy system realizacji, który obejmuje kolejkę elementów do spełnienia. Istnieje Fulfillabletabela ze wszystkimi szczegółami na temat każdego realizowalnego elementu, a następnie FulfillableQueuetabela, która implementuje kolejkę w SQL Server . W kolejce StateIDmogą znajdować się tylko spełniające określone elementy. StateIDznajduje się w Fulfillabletabeli, ale powielam to, FulfillableQueuea następnie wymuszam to ograniczenie FOREIGN KEYi CHECKograniczenia.
Nick Chammas