Przejdź do głównej zawartości

Projektuj do trzeciej postaci normalnej, potem odpuść

Dostępne także w 28 językach

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A park seen from above: paths at right angles, and one diagonal shortcut that people kept walking, now deliberately paved, with the old worn track still faint beside it.
Obraz wygenerowany przez AI

Moduł 5 z 6 w rozdziale Modelowanie danych, które coś znaczą, rozdziale 2 kursu Data Architect. Każdy moduł jest samodzielny. Wstecz: Umieść dane tam, gdzie ich miejsce · Dalej: Przenieś model do Salesforce

Pytanie, na które odpowiada ten moduł: kiedy celowo odejść od czystego, znormalizowanego modelu?

W poprzednim module mówiłem ci, żeby projektować do trzeciej postaci normalnej.

Teraz powiem ci, żeby ją łamać.

Czasami.

To ważne rozróżnienie. Jest wielka różnica między przypadkowym zbudowaniem bałaganiarskiego modelu danych a świadomą denormalizacją czystego modelu. Jeśli w ogóle nie rozumiesz, gdzie należą dane, kopiowanie ich gdzie indziej to nie architektura. To zwykła duplikacja.

Ale gdy rozumiem czysty model logiczny, mogę świadomie zdecydować, że ukształtuję dane inaczej dla ludzi i systemów, które z nich korzystają.

Projektuj do trzeciej postaci normalnej, gdzie to wykonalne. Potem odpuść, gdy to konieczne.

Zwróć uwagę, czego to zdanie nie mówi. Nie mówi, że trzecia postać normalna jest łatwiejsza do zrozumienia. Czasem jest trudniejsza: w pełni znormalizowany model potrafi rozrzucić jedną ideę biznesową po pięciu obiektach, a osoby, które z niego korzystają, muszą ją składać z powrotem w głowie. Normalizacja mówi mi, gdzie należy każdy fakt. Nie obiecuje, że to najłatwiejszy kształt do czytania, używania czy raportowania. Właśnie dlatego odpuszczanie to umiejętność projektowa, a nie porażka.

Zacznij od zamodelowania prawdy. Potem zdecyduj, jak tę prawdę trzeba dostarczyć.

Wracamy do psów i tym razem podejmujemy kilka świadomych decyzji.

Rasa: lista wyboru czy osobna tabela? Przepuść ją przez pytania, które podam ci w dalszej części tego modułu. Czy jest więcej niż jedna kolumna informacji? Tak: przynajmniej wielkość. Ile wartości? Związki kynologiczne uznają kilkaset ras (sam American Kennel Club wymienia 205), znacznie ponad moją praktyczną granicę około 20. Rasa zasługuje więc na własną tabelę, a każdy pies wskazuje na swoją rasę. To rozstrzyga pytanie, które nosimy od modułu 1: Rasa to osobny prostokąt.

Poziom umiejętności: lista wyboru. Uczy się, Dobry, Ekspert. Trzy etykiety, nic więcej o nich do powiedzenia, i nie będą się zmieniać. Dokładnie do tego służy lista wyboru.

Ile sztuczek zna każdy pies? Odpowiedź już jest w modelu: policz rekordy Sztuczki psa danego psa. Ale trener chce mieć tę liczbę w każdym raporcie, sortować po niej i filtrować, bez budowania raportu na dwóch tabelach. Więc odpuszczam i trzymam licznik Liczba sztuczek bezpośrednio na psie. To kopia. Prawda nadal mieszka w Sztuczce psa; licznik jest jej odwzorowaniem i musi za nią nadążać. Salesforce daje nam czysty sposób, żeby dokładnie to zrobić, i zobaczymy go w module 6.

A teraz zwrot akcji: szkoła dla psów zaczyna przyjmować koty. Co robimy? Jedna opcja: dodać tabelę Kot obok tabeli Pies i Sztuczkę kota obok Sztuczki psa. Wszystko się podwaja: dwa egzemplarze każdego ekranu, dwa każdego raportu, a w dniu, w którym przyjmą króliki, trzy. Druga opcja: zrobić krok w tył i zauważyć, że kot ma właściciela, może hodowcę, rasę, datę urodzenia i, przy odrobinie cierpliwości, sztuczkę czy dwie. Te same fakty i te same relacje co pies. Uogólniamy więc: Zwierzę z Gatunkiem, pies albo kot. Każda rasa też należy do gatunku i to tam gatunek naprawdę mieszka: labrador to pies. Zwierzę nosi kopię, celowo, żeby każdy ekran i raport mógł zacząć od „pies czy kot?” bez sprawdzania rasy. Kolejna świadoma kopia, a w module 6 dostanie własne zadanie.

To projektowanie z myślą o zmianie i to jest kompromis. Uogólnij za wcześnie, a wszystko stanie się mglistą „Rzeczą” z polem typu, którego nikt nie rozumie. Uogólniam wtedy, gdy biznes naprawdę przynosi mi drugi rodzaj, a oba mają prawie wszystko wspólne, tak jak tu psy i koty. Gdyby koty potrzebowały zupełnie innych faktów, zastanowiłbym się dwa razy.

Model zwierząt po kompromisach Model zwierząt jako szczegółowy model danych. Zwierzę stoi tam, gdzie był Pies: ID zwierzęcia, znane także po numerze mikrochipa, ID właściciela, hodowcy i rasy, Gatunek (lista wyboru: pies albo kot), imię, data urodzenia oraz licznik Liczba sztuczek trzymany na potrzeby raportów. Rasa jest już połączona (Zwierzę jest jednej Rasy) i ma własny gatunek, nazwę i wielkość. Sztuczka zwierzęcia, między Zwierzęciem a Sztuczką, ma poziom umiejętności jako listę wyboru i datę nauki; Ocena sztuczki, pod nią, ma datę, poziom umiejętności i to, kto ocenił. Właściciel ma Zwierzęta, a Hodowca je hoduje, jak wcześniej. ma hoduje jest rasy zna znana w oceniana w Właściciel ID właściciela IDENTYFIKATOR REKORDU Imię i nazwisko Telefon ZIP Miasto Hodowca ID hodowcy IDENTYFIKATOR REKORDU Nazwa Miasto Zwierzę ID zwierzęcia IDENTYFIKATOR REKORDU Numer mikrochipa ZNANY TAKŻE JAKO ID właściciela ID hodowcy ID rasy Gatunek (lista wyboru) Imię Data urodzenia Liczba sztuczek (licznik) Rasa ID rasy IDENTYFIKATOR REKORDU Gatunek (lista wyboru) Nazwa Wielkość Sztuczka zwierzęcia ID sztuczki zwierzęcia IDENTYFIKATOR REKORDU ID zwierzęcia ID sztuczki Poziom umiejętności (lista wyboru) Data nauki Sztuczka ID sztuczki IDENTYFIKATOR REKORDU Nazwa Trudność Ocena sztuczki ID oceny sztuczki IDENTYFIKATOR REKORDU ID sztuczki zwierzęcia Data Poziom umiejętności (lista wyboru) Kto ocenił dokładnie jeden zero lub jeden jeden lub wiele zero lub wiele © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Teraz te same rodzaje decyzji w Steve Trucking, gdzie stawka jest wyższa.

Wyobraź sobie ekipę na przystanku. Dostawa ma swoje pozycje. Instalacja ma listę kontrolną. Każdy krok wymaga zdjęć. Odbiorca podpisuje.

Znormalizowany model jest piękny: dostawa → pozycja dostawy → lista kontrolna instalacji → zdjęcie, każde tam, gdzie jego miejsce.

Potem siadam z ludźmi, którzy naprawdę z niego korzystają. Ekipa zamyka mniej więcej dziesięć przystanków dziennie, na podjazdach, często bez zasięgu. Jeśli mój piękny model prowadzi ich przez labirynt ekranów i list powiązanych rekordów, żeby zamknąć jeden przystanek, mam problem architektoniczny.

Model danych to nie jedyna rzecz, którą projektujemy.

Projektujemy system.

To jeden z powodów, dla których czasem odchodzę od idealnie znormalizowanego modelu: doświadczenie użytkownika.

Może jakieś pojęcie technicznie mogłoby być osobną encją, ale jego wydzielenie dodaje złożoności, która daje bardzo niewiele. Może rekord nadrzędny z kilkoma poziomami rekordów podrzędnych jest akademicko czysty, ale wprowadzanie i utrzymywanie danych to męka. Może pojęcie jest małe, stabilne i używane głównie jako wybór z listy.

W tym miejscu przestaję pytać tylko: „Gdzie teoretycznie należy ten fakt?” i zaczynam pytać: „Jak ten system będzie naprawdę używany?”

To nie znaczy, że każda skarga na dodatkowe kliknięcie spłaszcza model. Znaczy, że użyteczność to uprawniony czynnik architektoniczny.

Raportowanie to kolejny częsty powód.

Każdy partner detaliczny chce karty wyników: dostawy na czas według regionu i miesiąca. W czystym modelu dostawa zna swoje centrum dystrybucyjne, a CD zna swój region. Technicznie możemy przez to przejść.

Ale czy potrafi to narzędzie raportowe? Czy potrafią to ludzie, którzy sami budują swoje raporty? Czy mogą odpowiedzieć na pytanie bez architektury raportowej bardziej skomplikowanej niż samo pytanie?

Wtedy mogę skopiować albo wyprowadzić region na dostawę, bliżej miejsca, gdzie jest używany.

Teraz wprowadziłem duplikację. Potrzebuję więc kolejnego pytania: kto jest właścicielem prawdy?

Jeśli wartość źródłowa się zmieni, co stanie się z moją kopią? Powinna się zmienić? Czy powinna zachować to, co było prawdą w chwili dostawy? To różne wymagania.

Denormalizacja nie usuwa złożoności.

Ona ją przenosi.

Oto mniejszy przykład, na który administratorzy Salesforce trafiają bez przerwy. Użytkownik musi wybrać z zestawu wartości. Czy tworzę kolejną encję i się z nią wiążę, czy używam listy wyboru?

Weźmy status dostawy: zaplanowana, załadowana, w drodze, na miejscu za chwilę, dostarczona, zainstalowana, wyjątek, zwrócona. Krótka, stabilna lista etykiet. Lista wyboru to dokładnie to, czego chcę.

Teraz weźmy rodzaj przystanku: tylko dostawa, dostawa z instalacją, dostawa z wywozem starego sprzętu. Ten niesie własne informacje: ile trwa przystanek, jakich umiejętności potrzebuje ekipa, która lista kontrolna instalacji obowiązuje. Zmienia się niezależnie i zarządza nim biznes. To encja, a nie etykieta.

Jeśli tworzę obiekt dla każdego pojęcia, które teoretycznie da się znormalizować, mogę zbudować technicznie piękny system, z którego nikt nie lubi korzystać. Jeśli zamieniam każde pojęcie w listę wyboru, bo tak łatwo, mogę bardzo szybko zapędzić się w kozi róg.

Pytam więc: czy ma własne informacje? Relacje? Czy zmienia się niezależnie? Czy trzeba nim zarządzać jako danymi? Czy biznes może w końcu potrzebować od niego czegoś więcej niż etykiety?

Oto pytania, które naprawdę zadaję na sesji projektowej.

Czy jest więcej niż jedna kolumna informacji? Jeśli wartość potrzebuje opisu, czasu trwania, listy umiejętności, właściciela, to już nie jest etykieta.

Ile wartości? Moja reguła kciuka to około 20. Powyżej 20 wartości lista wyboru zaczyna się sypać i czas pomyśleć o obiekcie. Stany USA, w liczbie pięćdziesięciu, to wyjątek, z którym żyjemy, a kraje są jeszcze gorsze; szczerze, czy ktoś kocha listy wyboru z krajami? Moim zdaniem są irytujące.

Czy wartości powstają z czasem i kto je dodaje? Dodanie wartości listy wyboru to zmiana konfiguracji, czyli zadanie dla administratora. Jeśli biznes dodaje wartości co tydzień, a osoby, które je dodają, nie są administratorami, lista wyboru stawia zgłoszenie przed każdą nową wartością.

Czy ludzie muszą po tym filtrować i raportować? Listy wyboru świetnie się do tego nadają. Lookupy nie są tak wygodne. Każdy lookup dodaje skok: typ raportu przechodzi tylko przez krótki łańcuch powiązanych obiektów (niestandardowy typ raportu pozwala na co najwyżej cztery relacje między obiektami), ekran zamienia się w listy powiązanych rekordów wewnątrz list powiązanych rekordów, a kod się komplikuje.

Lista wartości często zaczyna życie jako lista wyboru i z czasem zapracowuje na własny obiekt. Pozwól jej na niego zapracować.

Etykieta czy encja? Status i rodzaj przystanku Dwie karty. Status dostawy, lista wyboru: osiem stabilnych wartości, każda to krótka etykieta (Zaplanowana, Załadowana, W drodze, Dojeżdża, Dostarczona, Zainstalowana, Wyjątek, Zwrócona), i każda jest tylko etykietą. Rodzaj przystanku, encja: dwadzieścia cztery wartości i ciągle przybywa, na przykład tylko dostawa, dostawa z instalacją pralki albo kuchenki gazowej, dostawa z wywozem, tylko wywóz, odbiór zwrotu i osiemnaście kolejnych; każda ma własny czas trwania przystanku, wymagane umiejętności ekipy i listę kontrolną instalacji. Notatka pod spodem: powyżej mniej więcej 20 wartości albo z własnymi atrybutami to encja, a nie etykieta. Status dostawy lista wyboru WARTOŚCI: 8 I STABILNE Zaplanowana Załadowana W drodze Dojeżdża Dostarczona Zainstalowana Wyjątek Zwrócona KAŻDA WARTOŚĆ TO Tylko etykieta Rodzaj przystanku encja WARTOŚCI: 24 I CIĄGLE PRZYBYWA Tylko dostawa Dostawa + instalacja: pralka Dostawa + instalacja: kuchenka gazowa Dostawa + wywóz Tylko wywóz Odbiór zwrotu …i 18 kolejnych KAŻDA WARTOŚĆ MA WŁASNY Czas trwania przystanku Wymagane umiejętności ekipy Lista kontrolna instalacji Powyżej mniej więcej 20 wartości albo z własnymi atrybutami: to encja, a nie etykieta. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Projekt, który pięknie działa przy kilku tysiącach rekordów, przy milionach może zachowywać się zupełnie inaczej.

Nie patrz więc tylko na diagram. Znaj liczby.

Steve Trucking realizuje około miliona dostaw rocznie, przy wzroście 30 procent rocznie. Każda dostawa zbiera około ośmiu aktualizacji statusu. To osiem milionów rekordów statusu w tym roku i około 13,5 mln rocznie w trzecim roku. Do tego cztery albo pięć milionów zdjęć rocznie.

Ten sam model. Zupełnie inna architektura.

Dużo głębiej wejdziemy w to w części Architektura w skali (Architecting at Scale). Na razie zapamiętaj: wolumen może zmienić decyzję w modelowaniu danych. Relacja logicznie poprawna nie jest automatycznie najlepszym projektem fizycznym w każdej skali.

Dotąd myśleliśmy o systemie operacyjnym. Dyspozytorzy układają trasy dostaw. Ekipy zamykają przystanki. System zmienia się w miarę działania biznesu.

Ale biznes chce też analizować lata historii. Którzy partnerzy i które regiony się spóźniają? Jak zmienił się czas dostawy? Jak często instalacje wymagają drugiej wizyty?

System analityczny może chcieć tych samych informacji uporządkowanych inaczej. Usłyszysz terminy takie jak hurtownia danych, fakt, wymiar i schemat gwiazdy. Nie rozkładamy ich tu na części; w Steve Trucking to hurtownia Snowflake, a wrócimy do niej później w kursie.

Na razie: różni odbiorcy mogą potrzebować różnych kształtów tej samej prawdy.

A teraz jest jeszcze jeden odbiorca: AI.

Odbiorca pisze SMS-a: „Gdzie moja dostawa?”. Asystent AI mógłby odczytać coś takiego:

Dostawa 10427, trasa 3312, przystanek 7, ciężarówka 117, okno 13:00–15:00.

Tradycyjna aplikacja całkiem dobrze radzi sobie z przechodzeniem po tych relacjach. Ale żeby odpowiedzieć odbiorcy, asystent potrzebuje kontekstu złożonego z kilku miejsc:

Twoja zmywarka od Redrock to siódmy przystanek na dzisiejszej trasie z centrum dystrybucyjnego w Phoenix. Ciężarówka jest trzy przystanki od ciebie, a nadal mieścisz się w oknie 13:00–15:00.

Wzięliśmy informacje z kilku powiązanych encji i złożyliśmy z nich bardziej płaską, bogatą w kontekst reprezentację dla jednego konkretnego odbiorcy.

To nie znaczy, że niszczę swój znormalizowany model. I na pewno nie znaczy „AI lubi płaskie dane, więc wrzućmy wszystko do jednego gigantycznego obiektu”. Nie rób tego.

Źródło prawdy pozostaje czyste. AI dostaje reprezentację zbudowaną pod zadanie, które wykonuje. To ta sama idea, którą przed chwilą widzieliśmy przy analityce:

Jedno źródło prawdy może obsługiwać wiele kształtów do wykorzystania.

Dużo głębiej w ugruntowanie (grounding) i wyszukiwanie wejdziemy później w kursie.

Jest tu pewne niebezpieczeństwo.

Jeśli skopiuję region na dostawę na potrzeby raportowania, wyślę spłaszczoną wersję do Snowflake i zbuduję bogatą w kontekst wersję dla asystenta AI, która z nich jest poprawna?

To pytanie wymaga odpowiedzi. Chcę wiedzieć, gdzie mieszka wartość nadrzędna. Wszystko inne to reprezentacja tej prawdy w jakimś celu.

To miejsce to system of record (system ewidencji). Zdenormalizowane kopie mogą być dobre: ekran przystanku, karta wyników, Snowflake i kontekst AI wykonują swoją pracę lepiej z kształtem zbudowanym dla nich, a korzystanie z nich jest w porządku. Ale gdy coś się zmienia, zmiana zaczyna się w systemie ewidencji, zwykle w modelu relacyjnym, i płynie na zewnątrz do każdej kopii. Nikt nie poprawia regionu w Snowflake ani nie edytuje ręcznie kontekstu AI. Popraw to u źródła i pozwól zmianie popłynąć.

System of record: zmiana płynie na zewnątrz Jeden prostokąt u góry, system of record (system ewidencji), relacyjny, w którym zaczynają się zmiany, ze strzałkami płynącymi w dół do czterech zbudowanych z niego kopii: ekranu przystanku ekipy, z jednym przystankiem na jednej stronie; karty wyników partnera, spóźnione dostawy według regionu; hurtowni Snowflake, lata historii; oraz kontekstu dostawy dla AI, do pytania „Gdzie jest moja dostawa?”. Notatka pod spodem: zmiana zaczyna się w systemie ewidencji i płynie do każdej kopii; nigdy nie poprawiaj kopii. System of record relacyjny: tu zaczynają się zmiany Ekran przystanku ekipy jeden przystanek, wszystko na jednej stronie Karta wyników partnera spóźnione dostawy według regionu Hurtownia Snowflake lata historii Kontekst dostawy dla AI „Gdzie jest moja dostawa?” Zmiana zaczyna się w systemie ewidencji i płynie do każdej kopii. Nigdy nie poprawiaj kopii. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

A ma to największe znaczenie, gdy dane się zmieniają. Jeśli centrum dystrybucyjne przechodzi dziś do innego regionu, czy dostawy z zeszłego miesiąca powinny pokazywać nowy region? Może. Może nie. Na potrzeby historii mogę potrzebować regionu, który był prawdziwy w chwili dostawy. To już nie jest problem synchronizacji. To decyzja biznesowa.

Dlatego denormalizacja nigdy nie powinna dziać się przypadkiem. Każdy zduplikowany fakt rodzi pytania o własność, synchronizację, historię i zaufanie. To myślenie o kompromisach z rozdziału 1: wiedz, co kupujesz (łatwiejszy ekran, prostszy raport, lepszy kontekst dla AI) i ile płacisz (zduplikowane dane, synchronizacja, bardziej skomplikowana własność prawdy). A ponieważ zaczęliśmy od czystego modelu logicznego, możemy wskazać każdą kopię i powiedzieć: „Wiem, że to należy tam. Umieszczam tu jego reprezentację z powodu tego wymagania”. To decyzja, którą można przejrzeć, podważyć i zapisać, żeby następny architekt wiedział dlaczego.

Rozważając denormalizację, decyduję:

  • Gdzie mieszka nadrzędne źródło każdego faktu biznesowego.
  • Czy czysty model tworzy prawdziwe problemy dla użytkowników, raportowania, skali lub wydajności.
  • Czy prostsza reprezentacja jest warta duplikacji i jak kopia pozostaje wiarygodna.
  • Czy wartości historyczne powinny się zmieniać, gdy zmienia się bieżące źródło.
  • Czy analityka albo AI potrzebuje innego kształtu danych niż system operacyjny.

Punkt wyjścia nigdy się nie zmienia: wiedz, gdzie należy prawda. Potem, gdy wymagania to uzasadniają, ukształtuj ją do dostarczenia.

Dalej Salesforce wraca do gry. Zamienimy to, co zaprojektowaliśmy, w fizyczny model danych.