Zacząłem pracować w nowej organizacji, a jednym z wzorców, które widziałem w bazie danych, są powielanie pól, aby ułatwić pisanie zapytań analitykom biznesowym. Używamy Django i jego ORM.
W jednym przypadku przechowujemy obiekt MedicalRecordNumber z unikalnym ciągiem identyfikującym pacjenta w określonym kontekście. Mamy obiekty rejestracyjne, które śledzą pacjentów i mają powiązane numery MedicalRecordNumbers , ale zamiast używać relacji klucza obcego, duplikują ciąg, aby uniknąć pisania sprzężenia ( nie ze względu na wydajność). Ten wzorzec jest powszechny w całej bazie danych.
Dla mnie znaczenie czystego modelu danych jest po prostu tak, że mogę o nim dobrze myśleć. Niepotrzebna złożoność to strata mojego ograniczonego czasu przetwarzania poznawczego. To systematyczny problem. Niekomfortowe pisanie łączy jest problemem, który można naprawić. Niekoniecznie chcę opowiadać się za powrotem i zmianą schematu, ale chciałbym móc przekonująco przedstawić problemy związane z tego rodzaju powielaniem.
źródło
Odpowiedzi:
Twoja operacyjna baza danych powinna być wysoce znormalizowana, aby zmniejszyć anomalie .
Twoja analityczna baza danych (magazyn) powinna być wysoce zdenormalizowana, aby ułatwić analizę.
Jeśli nie masz osobnej analitycznej bazy danych, powinieneś stworzyć wysoce zdenormalizowane [zmaterializowane] widoki.
Jeśli powiesz starszym analitykom / menedżerom biznesowym, aby wykonali wiele połączeń w celu przeprowadzenia prostej analizy, możesz zostać zwolniony.
Agile Data Warehouse Design to dobra książka
Zobacz moje szybkie porady dotyczące hurtowni danych tutaj
źródło
Rozumiem, dlaczego ktoś chce uniknąć pisania złączenia dla każdego wyboru.
Ale można utworzyć raz myślą o łączeniu i używać go zamiast swojego nieznormalizowanych tabeli.
Łączymy więc zaletę normalizacji z wygodą łatwego wyboru.
źródło
Odpowiedzi, które zostały już ocenione, w dużej mierze obejmują „jak uniknąć powielania” (korzystanie z widoków), ale nie dlaczego. Zasadniczo pokazują, że duplikacja kolumn jest złym rozwiązaniem problemu ułatwiającego pisanie zapytań. Ale pytanie „dlaczego nie zduplikować przypadkowej kolumny tylko ze względu na nią?” wciąż stoi.
Odpowiedź brzmi „Z powodu prawa Murphy'ego”. Prawo Murphy'ego stanowi, że:
W takim przypadku zawartość każdego pola wiersza zduplikowanej kolumny powinna być identyczna z zawartością każdego odpowiadającego pola wiersza oryginalnej kolumny. Co może się nie udać, zawartość niektórych pól wierszy może różnić się od oryginałów, siejąc spustoszenie. Możesz pomyśleć, że podjąłeś wszelkie możliwe środki ostrożności, aby upewnić się, że nie będą się różnić, ale prawo Murphy'ego stanowi, że skoro mogą się różnić, będą się różnić. I nastąpi spustoszenie .
Jako przykład tego, jak to się może stać, po prostu rozważ fakt, że zduplikowane kolumny nie są wypełnione magią; ktoś musi napisać kod, który przechowuje w nich wartości, ilekroć wiersze są tworzone w oryginalnej tabeli, a ktoś musi pisać kod, który aktualizuje je za każdym razem, gdy oryginały zostaną zmodyfikowane. Pomijając fakt, że powoduje to nadmierne obciążenie kodu, który wprowadza dane do bazy danych (i który z definicji jest znacznie bardziej istotny niż jakikolwiek kod, który po prostu wysyła zapytanie do bazy danych), ktoś może w pewnych okolicznościach zapomnieć do wykonania tej kopii. Następnie wartości będą się różnić. Mogą też pamiętać o przeprowadzeniu duplikacji, ale nie w ramach transakcji, więc w pewnych rzadkich przypadkach może zostać pominięty. Ale tak naprawdę nie musiałem tracić czasu na pisanie tych przykładów,jeśli coś pójdzie nie tak, to zrobi to.
źródło
Myślenie o tym w kategoriach kompromisów zamiast dobrych / złych będzie bardziej produktywne. Wymieniają zalety normalizacji (zwłaszcza spójność) za zalety w użyteczności zapytań.
Z jednej strony baza danych stałaby się bezużyteczna, gdyby dane stały się bardzo niespójne. Z drugiej strony baza danych byłaby bezużyteczna, gdyby ludzie, którzy muszą codziennie przesyłać do niej zapytania, nie mogliby uzyskać wyników, na które mogą liczyć.
Co możesz zrobić, aby zmniejszyć ryzyko i koszty?
źródło
Myślę, że najsilniejszym argumentem za normalizacją danych dla analityków biznesowych jest to, że promuje integralność danych. Jeśli twoje kluczowe dane są przechowywane tylko w jednym miejscu (jedna kolumna, w jednej tabeli), jest znacznie mniej prawdopodobne, że dane zostaną uszkodzone przez nieprawidłowe aktualizacje. Myślę, że zapewne by im zależało na znaczeniu integralności danych, więc może to być dobry sposób na przekonanie ich do zaktualizowania sposobów interakcji z bazą danych.
Nieco trudniejsza metoda zapytań będzie prawdopodobnie lepsza niż potencjalne uszkodzenie danych.
źródło
Aby dodać do tego, co sugerowali inni faceci powyżej. Jest to kwestia zarządzania danymi. Musisz współpracować z odpowiednimi interesariuszami: architektami danych i zarządcami danych, aby opracować zasady, zasady i konwencje nazewnictwa danych.
Bądź cierpliwy i pracuj metodycznie. Zmiana nie nastąpi w nocy.
źródło
Porzucić.
Szczerze mówiąc, możesz spędzać miesiące na kłótniach o normalizację, spójność i zwalczanie szalonych błędów spowodowanych czystym lenistwem, a następnie zrezygnować.
Albo możesz po prostu zaoszczędzić czas, frustrację i rzucić teraz.
Dobrzy programiści to bardzo leniwi ludzie. Rozumieją potrzeby klientów i kierownictwa. Ale co najważniejsze, rozumieją, że dobre rozwiązywanie problemów, stosowanie dobrze zaprojektowanych i dobrze wdrożonych rozwiązań oszczędza im osobiście OGROMNE ilości pracy, wysiłku, a przede wszystkim cierpienia i stresu.
Lepiej byłoby więc pracować w miejscu, które rozumie i ceni dobrą inżynierię.
Powodzenia.
Po namyśle: być może potrzebują narzędzi BI / OLAP ... http://en.wikipedia.org/wiki/Online_analytical_processing
źródło