Jak daleko posunąć się z normalizacją?

30

Mam przyzwoitą ilość danych w bazie danych. Mam dobrze utworzone tabele i dobre relacje między nimi z pewną nadmiarowością w moich danych. Ale jak daleko mam iść z normalizacją? Czy występują wady wydajności związane ze zbyt dużą normalizacją?

Fergus
źródło

Odpowiedzi:

37

Powinieneś iść tak daleko, jak powinieneś i nie dalej. Oczywiście. ~ Problemem może być to, że to trochę sztuka, i dlatego nie jest to czysta nauka.

Naszym głównym produktem jest system analizy i raportowania, dlatego w tym zakresie mamy sporo szczegółowych zapisów. Początkowo zaprojektowaliśmy go z dużą liczbą złączeń na wspólnym identyfikatorze dla niektórych rekordów potomnych, ale okazało się, że jeśli zdenormalizujemy kilka pól, moglibyśmy wyciąć DUŻĄ liczbę złączeń i moglibyśmy usunąć wiele problemów z wydajnością.

Ale wiedzieliśmy to tylko dlatego, że 1) stworzyliśmy „znormalizowany” projekt, 2) zaczęliśmy go używać, 3) profilowaliśmy rzeczywistą wydajność po setkach milionów wierszy w dziesiątkach tabel.

Ostateczna historia jest taka, że ​​dopóki się nie sprofilowaliśmy, nie mogliśmy mieć pewności, co dla nas zadziała. Podobał nam się pomysł normalizacji, abyśmy mogli łatwiej aktualizować, ale ostatecznie decydująca była rzeczywista wydajność. Oto moja rada dla Ciebie: profil, profil, profil.

jcolebrand
źródło
4
sztuka, a nie nauka, pozwala mi wierzyć, że to voodoo. Jakieś referencje?
abel
3
@Abel, a co z moją anegdotą w ogóle? Profilujący może zaproponować reguły denormalizacji, ale reguły te pochodzą od programisty z doświadczenia. Całe programowanie jest sztuką. Znajdę kogoś bardziej znanego, kto powiedziałby to samo, gdy później przejdę do pełnej klawiatury.
jcolebrand
1
@Abel no cóż, więc wszystko in ('forgiven','pardoned');): p
jcolebrand
2
@Fergus cieszę się, że ci się podobało. Zawsze uważałem, że anegdoty działają najlepiej.
jcolebrand
2
@abel - „Sztuka to nauka o ponad 7 stopniach swobody”. Powyżej pewnego poziomu złożoności wyczerpujące podejście do problemu staje się niemożliwe. W tym momencie podejścia heurystyczne oparte na doświadczeniu są najbardziej skuteczne. Niestety w dziedzinie obliczeń poziom złożoności jest dość łatwy do osiągnięcia w przypadku innych niż trywialne systemy oprogramowania.
ConcernedOfTunbridgeWells
10

Normalizacja jest celem tylko wtedy, gdy obsługuje model danych wystarczająco dobrze, aby to uzasadnić. Ma on stanowić przewodnik umożliwiający wzrost, zarządzanie i utrzymanie. Pamiętaj, że książka o normalizacji ani jej autor nie zamierzają budować ani utrzymywać bazy danych ani aplikacji.

Dobra lektura na temat „zbyt dużej normalizacji” znajduje się tutaj.

I tak, zbyt duża normalizacja może mieć wpływ na wydajność. Byłoby to głębsze przechodzenie do stołu, aby podnieść takie rzeczy, jak tabele wskaźników statusu, gdy zostały one wyciągnięte do osobnego stołu. Niektórzy powiedzą, że jest to zwykle zanegowane w szybkości aktualizacji (zmiana tekstu statusu z „Dobry” na „DOBRY” lub coś podobnego) lub w utrzymywalności.

REW
źródło
2
Oto dodatkowa dobra lektura na ten temat i dużo ciekawsza qntm.org/gay
jcolebrand
5

Polecam lekturę następującego dodatku znajdującego się w kilku najnowszych książkach Chrisa Date :

Dwa zdrowie dla normalizacji

Normalizacja daleka jest od bycia panaceum, co możemy łatwo zobaczyć, zastanawiając się, jakie są jej cele i jak dobrze je mierzy ...

Muszę wyjaśnić, że nie chcę, aby moje komentarze w tej sekcji były postrzegane jako jakikolwiek rodzaj ataku. Jestem przekonany, że cokolwiek mniej niż w pełni znormalizowany projekt jest zdecydowanie przeciwwskazane ...

oneedaywhen
źródło
2

Myślę, że równie ważne jest przyjrzenie się jawnie dodanym denormalizacjom, albo dodanym wartościom zagregowanym, albo niektórym polom z tabeli wzorcowej skopiowanej do kopii szczegółowej.

Argument ten jest głównie argumentem wydajności.

Jeśli to zrobisz, wymusisz, aby te pola były aktualizowane przez wyzwalacze, i to od bazy danych zależy, czy będą spójne.

bernd_k
źródło
2

Całkowicie zgadzam się z @jcolebrand. Projektując model aplikacji, należy znormalizować wszystko, co możesz. Ale powinieneś profilować zapytania zbudowane w twoim modelu, szczególnie te często wykonywane.

Moje własne doświadczenie: atrybuty, które wymagały dwóch złączeń (co oznacza, że ​​dołączyły trzy tabele), będą głównie świnią wydajności. Co gorsza, jest wykorzystywany w transakcjach internetowych. Denormalizuję atrybut, więc potrzebuje tylko jednego sprzężenia i poprosił programistę o dostosowanie aplikacji do zapytania i zaktualizowanie atrybutu. Teraz działa znacznie lepiej ...

Innymi słowy, należy zrównoważyć normalizację z wydajnością.

Isaac A. Nugroho
źródło