Denormalizacja jest podejściem do przyspieszenia wydajności pobierania danych zorientowanych na odczyt w relacyjnej bazie danych, gdzie administrator bazy danych selektywnie dodaje z powrotem określone instancje zbędnych danych po tym, jak struktura danych została znormalizowana. Nie należy mylić denormalizowanej bazy danych z bazą danych, która nigdy nie została znormalizowana.
Używając normalizacji w SQL, baza danych będzie przechowywać różne, ale powiązane typy danych w oddzielnych tabelach logicznych, zwanych relacjami. Kiedy zapytanie łączy dane z wielu tabel w jedną tabelę wynikową, nazywane jest to złączeniem. Wydajność takiego złączenia w obliczu złożonych zapytań jest często okazją dla administratora do zbadania alternatywy w postaci denormalizacji.
Normalizacja vs. denormalizacja
Wielokrotne złączenia w tym samym zapytaniu mogą mieć negatywny wpływ na wydajność. Wraz ze wzrostem liczby tabel tworzonych przez projekt, złożoność złączeń może tworzyć narzut obliczeniowy, który jest nie do zaakceptowania. Łączenia mogą być intensywne pod względem operacji wejścia/wyjścia, a związane z nimi wykonywanie zapytań może pochłaniać nieproporcjonalnie dużo czasu, czasami nawet powodując awarię aplikacji.
W przypadku denormalizacji bazy danych, projektanci danych łączą ze sobą rozbieżne tabele. Dzieje się to kosztem pewnej liczby nadmiarowych danych, ale może być przydatne do zmniejszenia liczby złączeń, a tym samym przyspieszenia operacji. Kompromis dla projektanta baz danych polega na tworzeniu systemów baz danych, które mają mniej dużych tabel lub więcej małych tabel, w oparciu o zasoby i wymagania dotyczące interaktywności zapytań. Projektant musi również rozważyć problemy związane z redundancją danych, zwłaszcza możliwość zwiększenia niespójności danych.
Po zduplikowaniu danych projektant bazy danych musi wziąć pod uwagę, w jaki sposób będą utrzymywane wielokrotne instancje danych. Jednym ze sposobów denormalizacji bazy danych jest umożliwienie systemowi zarządzania bazą danych przechowywania nadmiarowych danych na dysku. Daje to dodatkową korzyść w postaci zapewnienia spójności nadmiarowych kopii. Ponieważ koszty dysków spadły na przestrzeni lat, takie podejście zyskało na popularności. Twórcy relacyjnych baz danych udoskonalili bazy danych w celu zapewnienia lepszej spójności, gdy stosowana jest denormalizacja.
Projekt danych logicznych
Jednym z podejść do denormalizacji jest denormalizacja rzeczywistego projektu danych logicznych. Może to szybko doprowadzić do niespójności danych. Reguły zwane ograniczeniami mogą być użyte do określenia sposobu synchronizacji nadmiarowych kopii informacji, ale zwiększają one złożoność projektu bazy danych, a także niosą ze sobą ryzyko wpływu na wydajność zapisu.
Powszechne przypadki, w których denormalizacja może być efektywnie wykorzystana, obejmują tabele wstępnie połączone, które pakują dane do wspólnych zastosowań, tabele dzielone dostosowane do określonych grup użytkowników oraz tabele łączone, które konsolidują relacje jeden do jednego i jeden do wielu.
Denormalizacja w hurtowniach danych i NoSQL
W relacyjnych hurtowniach danych denormalizacja często odgrywa ważną rolę. Jest to szczególnie prawdziwe w przypadku wymiarowych baz danych, zgodnie z zaleceniami wpływowego architekta hurtowni danych i autora Ralpha Kimballa. Jego nacisk na struktury wymiarowe wykorzystujące denormalizację ma na celu przyspieszenie wykonywania zapytań, co może być szczególnie ważne w hurtowniach danych wykorzystywanych do analityki biznesowej. Denormalizacja pomaga administratorom hurtowni danych zapewnić bardziej przewidywalne wyniki.
Przykłady denormalizacji wykraczają poza denormalizację w SQL. Pewien rodzaj denormalizacji ma również zastosowanie poza relacyjnymi bazami danych. Technika ta jest często stosowana w aplikacjach opartych na bazach danych NoSQL, w szczególności bazach NoSQL zorientowanych na dokumenty. Na takich bazach danych często opierają się architektury zarządzania treścią stron profili internetowych, które korzystają z optymalizacji odczytu. Celem denormalizacji w tym kontekście jest skrócenie czasu potrzebnego na złożenie stron składających się z rozbieżnych danych profilowych. W takich przypadkach utrzymanie spójności danych staje się zadaniem aplikacji, a co za tym idzie – jej twórcy.