it-swarm.dev

Kiedy należy denormalizować?

Myślę, że wszyscy znamy normalizacja bazy danych .

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

47
Richard

Denormalizuj kiedy to OLAP, normalizuj kiedy OLTP (z 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). OLTP charakteryzują się dużą liczbą małych transakcji, takich jak aktualizacja rekordu sprzedaży w kasie w supermarkecie. Oczekuje się, że każda transakcja opuści bazę danych w spójnym stanie. Natomiast, bazy danych przeznaczone dla OLAP są przede wszystkim bazami „głównie do odczytu”) OLAP mają tendencję do wyodrębniania danych historycznych, które gromadziły się przez długi czas. Dla takich bazy danych, dane nadmiarowe lub „zdenormalizowane” mogą ułatwić aplikacje analizy biznesowej. W szczególności tabele wymiarowe w schemacie gwiazdy często zawierają dane zdenormalizowane. Dane zdormalizowane lub nadmiarowe muszą być dokładnie kontrolowane podczas przetwarzania, przekształcania, ładowania (ETL), a użytkownicy powinni nie wolno oglądać 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 zniknęła, gdy komputery i oprogramowanie RDBMS stały się Jest bardziej wydajny, ale ponieważ ilość danych ogólnie wzrosła wraz z wydajnością sprzętu i oprogramowania, OLAP często nadal używają schematów zdenormalizowanych).

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 także użyć, gdy nie ma RDBMS dla platformy (takiej jak Palm) lub nie ma potrzeby wprowadzania żadnych zmian w danych, a odpowiedź Swift jest kluczowa.

35
billinkc

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

25
Andrei Rînea

Jednym z potencjalnie rozsądnych powodów do zastosowania kontrolowanej denormalizacji jest to, że umożliwia zastosowanie pewnego ograniczenia integralności do danych, które w innym przypadku nie byłyby możliwe. Większość SQL DBMS ma bardzo ograniczone wsparcie dla ograniczeń wielu tabel. W SQL czasami jedynym skutecznym sposobem na wdrożenie niektórych 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.

Kontrolowane 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ą fizyczna niezależność danych DBMS powinien mieć środki do konfigurowania wewnętrznych struktur pamięci bez niepotrzebnej zmiany logicznej reprezentacji danych w bazie danych. Niestety wiele DBMS bardzo ogranicza fizyczne opcje 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.

15
nvogel

Denormalizuj, 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 obliczania ich w kółko, jeśli Twój profil obciążenia jest obciążony odczytem.

4
Nick Chammas

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 blog .

Nie możesz używać wiązań CHECK do porównywania kolumn w różnych wierszach lub w różnych tabelach, chyba że zawrzesz 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ć 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. Tak czy inaczej możesz skończyć z danymi naruszającymi regułę biznesową, nie wiedząc o tym.

Pokażę, jak zaimplementować 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 na wymuszenie, aby przedziały czasowe nie miały luk ani nakładania się .

3
A-K