Siirry sisältöön

Sijoita tiedot oikeaan paikkaan

Saatavilla myös 28 kielellä

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

Two identical drawers on a workbench, seen from above: one jammed with everything mixed together, one divided so each kind of thing has its own compartment.
Kuva on luotu tekoälyllä

Moduuli 4/6 luvussa Tietojen mallintaminen merkityksen kautta, Data Architect -kurssin luku 2. Jokainen moduuli on itsenäinen. Edellinen: Rakenna looginen malli · Seuraava: Suunnittele kolmanteen normaalimuotoon ja peräänny sitten

Kysymys, johon tämä moduuli vastaa: Miten normalisointi auttaa minua selvittämään, mihin tiedot oikeasti kuuluvat?

Meillä on looginen malli: entiteetit, suhteet, attribuutit ja avaimet. Nyt haluan kysyä yhden tietomallinnuksen tärkeimmistä kysymyksistä: kuuluvatko nämä tiedot oikeasti tänne?

Se kuulostaa yksinkertaiselta. Ei se ole. Olen nähnyt paljon järjestelmiä, joissa jokainen kenttä oli järkevä silloin, kun joku sen loi. Ongelma ei ollut se, että kentät olisivat olleet naurettavia; ongelma oli, että tiedot oli tallennettu väärään paikkaan. Toimituksessa on tietoa, joka oikeasti kuvaa jakelukeskusta. Sama osoite esiintyy sadoissa tietueissa. Yhdessä kentässä on kolme pilkuilla erotettua arvoa. Yhden liiketoimintatiedon muutos tarkoittaa 10 000 tietueen päivittämistä. Juuri tähän ongelmaan normalisointi auttaa, ja ennen kuin hukumme tietokantaterminologiaan, tässä on koko idea: sijoita tieto sinne, minne se kuuluu. Kaikki muu tässä moduulissa auttaa meitä tekemään sen järjestelmällisemmin.

Normalisointi on tietojen järjestämistä niin, että jokainen tieto tallennetaan kerran, siihen paikkaan, johon se kuuluu. Kun yksi taulu tekee liian monta työtä, jaamme sen tauluihin, joista kukin kuvaa yhtä asiaa, ja yhdistämme ne avaimilla.

Miksi vaivautua? Koska kerran tallennettu tieto on tieto, jonka muutamme kerran. Normalisointi estää toisteisuuden eli saman tiedon kopioitumisen moniin tietueisiin, ja sen mukana epäjohdonmukaisuudet, jotka hiipivät mukaan, kun yksi kopio päivitetään ja muut eivät. Siksi se sopii tapahtumajärjestelmiin, kuten Salesforceen, jossa tietueita luodaan ja päivitetään koko päivän.

Normalisoimme vaiheittain, joita kutsutaan normaalimuodoiksi, ja jokainen niistä esittää yhden kysymyksen:

  • Ensimmäinen normaalimuoto (1NF): yksi arvo kenttää kohden ja jotain, mikä tunnistaa jokaisen rivin yksiselitteisesti.
  • Toinen normaalimuoto (2NF): jokainen tieto kuvaa koko sitä, mikä rivin tunnistaa, ei vain osaa siitä.
  • Kolmas normaalimuoto (3NF): jokainen tieto kuvaa tätä asiaa, ei jotain muuta, mihin se liittyy.

Kolmannen jälkeen on vielä muitakin muotoja. Sanon niistä sanasen myöhemmin, samoin siitä, miksi yleensä pysähdymme kolmanteen. Katsotaan ensin, miten kolme vaihetta tapahtuvat.

Kun opetan tätä livenä, en aloita toimituksista. Aloitan koirista. Kaikki ymmärtävät koiria, joten kenenkään huomio ei karkaa liiketoimintaan, ja voimme katsoa, miten tiedot yrittävät löytää kotinsa. Sitten viemme samat siirrot Steve Truckingiin.

Alku: raaka taulukko. Laitan pari koiraa näytölle, ja sitten sali lisää omansa. Muutamassa minuutissa meillä on yksi iso luettelo: koira, sen syntymävuosi, kuka sen omistaa, missä omistaja asuu, rotu, kuka sen kasvatti ja temput, jotka se osaa.

KoiraSyntynytOmistajaPostinumeroKaupunkiRotuKasvattajaTemput
Bella2017Marcus80202DenverLabradorinnoutajaMaple RidgeIstu, Paikka, Anna tassu
Milo2019Marcus80202DenverVillakoiraGolden MeadowIstu, Kieri
Max2022Ana64105Kansas CitySekarotuinenIstu, Kuollut koira
Luna2020Kenji98101SeattleHuskyCascadeIstu, Paikka, Pyöri
Rocky2024Priya30301AtlantaBeagleMaple RidgeIstu
Coco2014Ana64105Kansas CityChihuahuaLittle PawsAnna tassu, Pyöri

Se toimii. Jokainen taulukko toimii ensimmäisenä päivänä. Mutta katso, mikä on jo pielessä. Miten löydän jokaisen koiran, joka osaa Anna tassu -tempun? Anan postinumero on kahdella rivillä, samoin Marcuksen: mitä tapahtuu, jos joku päivittää toisen mutta ei toista? Maple Ridge esiintyy kahdesti, samoin Kansas City. Ja Max tuli löytöeläinkodista, joten kasvattajaa ei ole lainkaan.

Vaihe 1: ensimmäinen normaalimuoto. Kaksi sääntöä. Jokaisessa kentässä on yksi arvo, joten pilkuilla erotettu temppuluettelo saa lähteä. Ja jokainen rivi tarvitsee jotain, mikä tunnistaa sen yksiselitteisesti. Ei koiran nimeä; Max-nimisiä koiria on paljon. ID: automaattisesti luotu ID tai GUID. Temput siirtyvät omille riveilleen, yksi rivi kutakin koiraa ja temppua kohden. Ja kun tempulla on oma rivinsä, on tilaa sille, mitä pilkkuluettelossa ei voinut koskaan sanoa: kuinka vaikea temppu on, kuinka hyvin tämä koira sen tekee ja milloin se oppi sen.

Koira (tunnisteena koiran ID)

Koiran IDNimiSyntynytOmistajaPostinumeroKaupunkiRotuKasvattaja
D-001Bella2017Marcus80202DenverLabradorinnoutajaMaple Ridge
D-002Milo2019Marcus80202DenverVillakoiraGolden Meadow
D-003Max2022Ana64105Kansas CitySekarotuinen
D-004Luna2020Kenji98101SeattleHuskyCascade
D-005Rocky2024Priya30301AtlantaBeagleMaple Ridge
D-006Coco2014Ana64105Kansas CityChihuahuaLittle Paws

Koiran temppu (tunnisteena koiran ID + temppu)

Koiran IDTemppuVaikeusTaitotasoOpittu
D-001IstuHelppoMestari2017-11
D-001PaikkaHelppoMestari2018-01
D-001Anna tassuKeskitasoHyvä2018-06
D-002IstuHelppoMestari2020-02
D-002KieriVaikeaOpettelee2023-05
D-003IstuHelppoHyvä2022-06
D-003Kuollut koiraVaikeaOpettelee2024-03
D-004IstuHelppoMestari2020-11
D-004PaikkaHelppoHyvä2021-01
D-004PyöriKeskitasoMestari2021-06
D-005IstuHelppoOpettelee2025-02
D-006Anna tassuKeskitasoMestari2015-06
D-006PyöriKeskitasoOpettelee2025-04

Nyt ”jokainen koira, joka osaa Anna tassu -tempun” on helppo kysymys. Mutta huomaa, millä koiran temppu tunnistetaan: ei yhdellä asialla vaan kahdella asialla yhdessä, koiralla ja tempulla. Pidä se mielessä.

Vaihe 2: toinen normaalimuoto. Toisella normaalimuodolla on merkitystä vain, kun rivi tunnistetaan yhdistelmällä, ja koiran temppu tunnistetaan. Kysyn siis jokaisesta sarakkeesta: kuvaako se koko yhdistelmää vai vain osaa siitä? Taitotaso kuvaa sitä, miten tämä koira tekee tämän tempun: Bella on Istu-tempun mestari, Rocky opettelee sitä vielä. Oppimispäivä samoin. Mutta vaikeus? Istu on helppo, teki sen mikä koira tahansa. Se kuvaa temppua, vain osaa avaimesta, ja siksi ”Helppo” toistuu jokaisella Istu-rivillä. Temppu saa siis oman taulunsa, ja jäljelle jää pari.

Temppu

Tempun IDTemppuVaikeus
T-01IstuHelppo
T-02PaikkaHelppo
T-03Anna tassuKeskitaso
T-04KieriVaikea
T-05Kuollut koiraVaikea
T-06PyöriKeskitaso

Koiran temppu (koiran ID + tempun ID)

Koiran IDTempun IDTaitotasoOpittu
D-001T-01Mestari2017-11
D-001T-02Mestari2018-01
D-001T-03Hyvä2018-06
D-002T-01Mestari2020-02
D-002T-04Opettelee2023-05
D-003T-01Hyvä2022-06
D-003T-05Opettelee2024-03
D-004T-01Mestari2020-11
D-004T-02Hyvä2021-01
D-004T-06Mestari2021-06
D-005T-01Opettelee2025-02
D-006T-03Mestari2015-06
D-006T-06Opettelee2025-04

Tuo koiran temppu -taulu on se, jonka löysimme moduulissa 2, ja tietomallinnuksessa sillä on nimi: liitos, tai kuten minä sitä kutsun, looginen liitosobjekti. Koira osaa monta temppua; tempun osaa moni koira. Liitos on niiden välissä, eikä se ole tyhjää putkistoa: siinä ovat tiedot, jotka kuuluvat itse suhteelle, taitotaso ja päivämäärä. Kohtaamme sen uudelleen moduulissa 6, ja luvussa 3 näemme, että Salesforce käyttää sanaa ”junction object” suppeammin: Salesforcen liitosobjekti (Salesforce Junction Object) on mukautettu objekti, jolla on kaksi master-detail-suhdetta (luku 3, moduuli 7).

Vaihe 3: kolmas normaalimuoto. Palataan nyt koiratauluun. Kaikki siinä tunnistetaan koiran ID:llä, joten toisella normaalimuodolla ei ole sanottavaa. Kolmas normaalimuoto kysyy eri kysymyksen: kuvaako tämä tieto koiraa vai jotain muuta, mihin koira liittyy? Rotu on oma asiansa: labradorinnoutaja on labradorinnoutaja, oli koira mikä tahansa, ja sitä koskevat tiedot, kuten koko, kuuluvat rodulle eivätkä Bellalle. Postinumero ja kaupunki kuvaavat omistajaa, eivät koiraa: siellä Ana asuu, katsoimmepa kumpaa hänen koiristaan tahansa. Kasvattajan tiedot kuvaavat kasvattajaa. Jokainen niistä on tieto toisesta tiedosta, joten jokainen siirtyy omaan tauluunsa, ja koira osoittaa siihen viiteavaimella:

  • Koira: koiran ID, nimi, syntynyt, omistajan ID, rodun ID, kasvattajan ID
  • Omistaja: omistajan ID, nimi, postinumero, kaupunki
  • Rotu: rodun ID, rotu, koko
  • Kasvattaja: kasvattajan ID, nimi, kaupunki
  • Temppu ja koiran temppu vaiheesta 2

Ana on nyt tallennettu kerran, ja hänen molemmat koiransa osoittavat häneen. Maple Ridge on tallennettu kerran, ja rotutaulu antaa kodin kutakin rotua koskeville tiedoille, kuten koolle, joille taulukossa ei ollut paikkaa. Viiteavain voi olla tyhjä: Maxilla ei ole kasvattajan ID:tä, ja se on rehellinen vastaus, ei aukko. Sitten heitän salille kompakysymyksen: kun omistaja sai koiran, mihin se päivämäärä menee? Koiraan. Tässä mallissa koiralla on yksi omistaja kerrallaan, joten se päivämäärä kuvaa koiran suhdetta omistajaansa.

Voisit mennä vielä askeleen pidemmälle ja erottaa kaupungin postinumerosta; oppikirjat tekevät niin. Käytännössä osoite pysyy koossa, ja Kansas City sijaitsee joka tapauksessa kahdessa osavaltiossa, mukava muistutus siitä, ettei todellinen maailma lue oppikirjojamme.

Siinä on eteneminen: taulukko, sitten kolme kysymystä, ja jokainen tieto päätyy yhteen paikkaan. Astu askel taaksepäin ja katso, mitä rakensimme. Yhdestä sotkuisesta luettelosta tuli kuusi taulua, joista kukin kuvaa yhtä asiaa, avaimilla yhdistettyinä:

Koiramalli kolmannen normaalimuodon jälkeen Kuusi laatikkoa viivoilla yhdistettyinä. Omistaja omistaa yhden tai monta koiraa. Koiralla on yksi omistaja, se on yhtä rotua, ja sen on kasvattanut nolla tai yksi kasvattaja (kasvattaja kasvattaa yhden tai monta koiraa). Koiran ja Tempun välissä on Koiran temppu: koira osaa nolla tai monta koiran temppua, temppua osataan nollassa tai monessa koiran tempussa, ja jokainen koiran temppu kuuluu täsmälleen yhdelle koiralle ja yhdelle tempulle. omistaa kasvattaa on osaa osataan Omistaja Kasvattaja Koira Rotu Koiran temppu Temppu täsmälleen yksi nolla tai yksi yksi tai monta nolla tai monta © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Kukaan ei tarvinnut yhtään Salesforce-sanaa pysyäkseen mukana. Siinä on vain koirat, niiden ympärillä olevat ihmiset ja se, mitä koirat osaavat.

Sovelletaan sitä nyt Steve Truckingiin

Osio nimeltä “Sovelletaan sitä nyt Steve Truckingiin ”

Koirien avulla siirrot on helppo nähdä. Oikeassa liiketoiminnassa niillä on väliä, koska samat virheet maksavat suuressa mittakaavassa oikeaa rahaa. Viedään siis samat kolme kysymystä Steve Truckingiin. Kuvittele, että se pitää toimituksiaan näin:

ToimitusVähittäiskauppakumppaniJakelukeskusJakelukeskuksen kaupunkiTiimiKuorma-auto
1001KeystoneKeystone Phoenix DCPhoenixTiimi 12117
1002KeystoneKeystone Phoenix DCPhoenixTiimi 8122
1003KeystoneKeystone Phoenix DCPhoenixTiimi 12117

Ensisilmäyksellä tässä ei ole mitään monimutkaista. Mutta katso jakelukeskusta. Toistamme ”Keystone Phoenix DC, Phoenix” jokaisessa sieltä lähtevässä toimituksessa: Steve Trucking tekee noin 3 300 toimitusta päivässä yhdeksästä jakelukeskuksesta, joten kustakin muutama sata päivässä. Mitä tapahtuu, jos jakelukeskus muuttaa? Kuinka monta tietuetta muutamme, ja mitä tapahtuu, jos yksi jää huomaamatta? Nyt tiedot sanovat, että jakelukeskus on kahdessa kaupungissa yhtä aikaa. Se on päivitysanomalia. Entä jos haluamme perustaa uuden jakelukeskuksen ennen sen ensimmäistä toimitusta? Entä jos poistamme jakelukeskuksen viimeisen toimituksen: poistimmeko juuri ainoan paikan, johon olimme tallentaneet siitä mitään?

Nämä ovat saman ongelman eri oireita: sekoitimme eri asioita koskevat tiedot keskenään. Jakelukeskuksen tiedot kuuluvat jakelukeskukselle. Toimituksen tiedot kuuluvat toimitukselle. Tiimin tiedot kuuluvat tiimille. Se on normalisointia käytännössä.

Ensimmäinen normaalimuoto: älä piilota toistuvaa rakennetta

Osio nimeltä “Ensimmäinen normaalimuoto: älä piilota toistuvaa rakennetta ”

Aloitetaan ensimmäisestä normaalimuodosta eli 1NF:stä, jossa ihmiset joskus tekevät normalisoinnista vaikeampaa kuin sen tarvitsisi olla.

Oletetaan, että toimituksella on kenttä nimeltä Tuotteet: ”Jääkaappi, jääpalakonesarja, vanhan poisvienti.” Olemme laittaneet kolme tietoa yhteen kenttään. Se tuntuu kätevältä, kunnes joku kysyy: ”Montako poisvientiä teimme viime kuussa?” Tai kuvittele kentät nimeltä Tuote 1, Tuote 2 ja Tuote 3. Se toimii, kunnes tulee toimitus, jossa on neljä tuotetta. Ongelma ei ole se, että valitsimme väärän määrän tuotekenttiä. Ongelma on, ettemme tunnistaneet toistuvaa rakennetta. Toimituksessa voi olla useita tuotteita. Se on tietoa, joka meidän pitäisi mallintaa: moduulissa 2 löytämämme toimitusrivi.

Toimituksen tuotteet, kolmella tavalla Kolme korttia näyttää saman toimituksen tuotteet tallennettuina kolmella tavalla. Yksi kenttä: toimituksella 1001 on Tuotteet-kenttä, jossa lukee ”Jääkaappi, jääpalakonesarja, poisvienti”, eikä se pysty vastaamaan, montako poisvientiä oli viime kuussa. Toistuvat kentät: Tuote 1 jääkaappi, Tuote 2 jääpalakonesarja, Tuote 3 poisvienti, eikä se mahduta toimitusta, jossa on neljä tuotetta. Alatietue, korostettuna: toimituksella 1001 on kolme toimitusriviä, jääkaappi, jääpalakonesarja ja poisvienti, ja seuraava tuote on uusi tietue, ei uusi kenttä. Huomautus alla: jos jokin voi tapahtua monta kertaa, ehkä toinen entiteetti yrittää päästä esiin. Yksi kenttä kolme tosiasiaa yhdessä arvossa TOIMITUS 1001 Tuotteet: Jääkaappi, jääpalakonesarja, poisvienti KYSYMYS, JOHON SE EI VASTAA Montako poisvientiä viime kuussa? Toistuvat kentät Tuote 1, Tuote 2, Tuote 3 TOIMITUS 1001 Tuote 1: Jääkaappi Tuote 2: Jääpalakonesarja Tuote 3: Poisvienti TOIMITUS, JOTA SE EI MAHDUTA Se, jossa on neljä tuotetta Alatietue toimitusrivi kullekin TOIMITUS 1001 Toimitusrivi: Jääkaappi Toimitusrivi: Jääpalakonesarja Toimitusrivi: Poisvienti SEURAAVA TUOTE Uusi tietue, ei uusi kenttä Jos jokin voi tapahtua monta kertaa, ehkä toinen entiteetti yrittää päästä esiin. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

1NF:n käytännön opetus: älä piilota toistuvaa rakennetta kenttien sisään. Jos liiketoiminta kertoo, että jokin voi tapahtua monta kertaa, kuuntele. Siellä voi olla toinen entiteetti, joka yrittää päästä ulos.

Näet tätä oikeissa orgeissa jatkuvasti. Joku tarvitsee kuvauksen usealla kielellä, joten hän luo kentän nimeltä Description_English, sitten Description_French, sitten Description_German. Tai hyväksyntään tarvitaan muutama ihminen, joten saamme kentät Hyväksyjä 1, Hyväksyjä 2, Hyväksyjä 3. Kun löydän tuollaista arvioinnissa, siitä tulee näpeille: korjaa tietomallisi. Yksi tai kaksi, ehkä, jos liiketoiminnalla todella on aina vain yksi tai kaksi. Kaiken sen yli pitäisi olla alaobjekti: käännös, jolla on kieli, tai hyväksyntävaihe, jolla on hyväksyjä. Seuraavasta kielestä tai neljännestä hyväksyjästä tulee uusi tietue, ei uusi kenttä ja käyttöönotto.

Toisella normaalimuodolla eli 2NF:llä on merkitystä, kun tietue tunnistetaan asioiden yhdistelmällä. Otetaan toimitusrivi. Sillä on oma tietueen ID, mutta jokainen niistä on yksilöllinen yhdistelmällä toimitus + tuote. Oletetaan, että tallennamme toimituksen, tuotteen, määrän ja tuotteen kuvauksen.

Määrä on tässä järkevä: se kuvaa tätä tuotetta tässä toimituksessa. Mutta tuotteen kuvaus ei kuvaa yhdistelmää; se kuvaa tuotetta. Laita se jokaiseen toimitusriviin, niin toistamme sen aina, kun tuo jääkaappimalli lähtee uudella kuorma-autolla. Se on vihje siitä, että tieto kuuluu jonnekin muualle.

2NF:n kysymys on siis: kuvaako tämä attribuutti koko asiaa, jota tunnistan, vai vain osaa siitä? Jos se kuvaa vain tuotetta, se menee tuotteelle. Jos se kuvaa tuotteen paikkaa juuri tässä toimituksessa (määrä, asennetaanko se), se kuuluu toimitusriville. Moni ylläpitäjä ei koskaan tietoisesti sano: ”Nyt sovellan toista normaalimuotoa.” Se on ihan hyvä. Minulle on paljon tärkeämpää, että opit kysymään: mitä tämä tieto oikeasti kuvaa?

Kolmas normaalimuoto: älä tallenna tietoja muista tiedoista

Osio nimeltä “Kolmas normaalimuoto: älä tallenna tietoja muista tiedoista ”

Nyt se, josta välitän eniten jokapäiväisessä mallinnuksessa: kolmas normaalimuoto eli 3NF.

Jokaisella jakelukeskuksella on esihenkilö vähittäiskauppakumppanin puolella, joku, joka käyttää kumppaniportaalia. Oletetaan, että laitamme jakelukeskuksen esihenkilön nimen suoraan jokaiseen toimitukseen. Mitä tapahtuu, kun jakelukeskus saa uuden esihenkilön? Päivitämme jokaisen toimituksen siitä jakelukeskuksesta. Siinä on taas sama haju: toistamme tietoa, joka kuuluu jonnekin muualle. Toimitus lähtee jakelukeskuksesta; jakelukeskuksella on esihenkilö. Ne ovat kaksi suhdetta, ja esihenkilön nimi kuuluu jakelukeskukselle.

Klassinen oppikirjaversio on osoite: postinumero, kaupunki ja osavaltio tallennettuina yhdessä jokaiseen tietueeseen, vaikka kaupunki ja osavaltio yleensä seuraavat postinumerosta. Sama muoto, sama kysymys.

Tosiasia toisesta tosiasiasta: DC:n esihenkilö Kaksi paneelia. Jokaisessa toimituksessa: toimitustietue, jossa on tietueen ID, toimituspäivä, jakelukeskus sekä DC:n kaupunki ja esihenkilö, kumpikin merkittynä toistuvaksi. Tallennettu kerran, DC:n luona: toimitus säilyttää tietueen ID:n, toimituspäivän ja jakelukeskuksen ID:n ja lähtee jakelukeskuksesta, jolla on oma tietueen ID, nimi, kaupunki ja esihenkilö. Huomautus alla: uusi DC:n esihenkilö tarkoittaa satoja päivityksiä vasemmalla ja yhtä oikealla. JOKAISESSA TOIMITUKSESSA TALLENNETTU KERRAN, DC:N LUONA lähtee Toimitus Toimitus-ID TIETUEEN ID Toimituspäivä Jakelukeskus DC:n kaupunki TOISTUVA DC:n esihenkilö TOISTUVA Toimitus Toimitus-ID TIETUEEN ID Toimituspäivä Jakelukeskuksen ID Jakelukeskus Jakelukeskuksen ID TIETUEEN ID Nimi Kaupunki Esihenkilö Uusi DC:n esihenkilö: satoja päivityksiä vasemmalla, yksi oikealla. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

3NF:n käytännön kysymys on: kuvaako tämä tieto tätä asiaa vai jotain muuta, mihin tämä asia liittyy? Haluan, että kysyt sitä jatkuvasti.

Astu nyt askel taaksepäin, samoin kuin koirien kanssa. Toimitustaulusta, josta aloitimme, on tullut viisi asiaa, joista kullakin on omat tietonsa: toimitusrivi erottui ensimmäisessä normaalimuodossa, tuote toisessa, ja jakelukeskuksen kaupunki ja esihenkilö siirtyivät jakelukeskukselle kolmannessa.

Steve Trucking normalisoinnin jälkeen Viisi laatikkoa viivoilla yhdistettyinä. Vähittäiskauppakumppani ylläpitää nollaa tai montaa jakelukeskusta. Toimitus lähtee täsmälleen yhdestä jakelukeskuksesta ja sisältää yhden tai monta toimitusriviä. Jokainen toimitusrivi on täsmälleen yksi tuote, ja tuote esiintyy nollassa tai monessa toimitusrivissä. ylläpitää lähtee sisältää esiintyy Vähittäiskauppakumppani Toimitus Toimitusrivi Tuote Jakelukeskus täsmälleen yksi nolla tai yksi yksi tai monta nolla tai monta © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Samat kolme kysymystä, sama tulos: jokainen tieto yhdessä paikassa.

Yksinkertainen tapa ajatella 1NF:ää, 2NF:ää ja 3NF:ää

Osio nimeltä “Yksinkertainen tapa ajatella 1NF:ää, 2NF:ää ja 3NF:ää ”

Normalisointiin voi käyttää kokonaisen tietokantakurssin. Me emme käytä. Tällä kurssilla haluan, että sinulla on käytännön arkkitehdin ymmärrys:

  • 1NF: piilotanko useita arvoja tai toistuvia rakenteita kentän tai tietueen sisään?
  • 2NF: kuvaako tämä tieto koko asiaa, jota tunnistan?
  • 3NF: kuvaako tämä tieto todella tätä entiteettiä vai jotain siihen liittyvää?

Ne eivät ole tietokantaoppikirjan määritelmiä. Ne ovat kysymyksiä, joita voin oikeasti käyttää suunnitellessani.

Kyllä, normalisointi menee pidemmälle: Boyce–Coddin normaalimuoto (BCNF) tiukentaa 3NF:n sääntöjä malleissa, joissa on monimutkaisempia avaimia, ja on olemassa neljäs, viides ja jopa kuudes normaalimuoto. Ne käsittelevät harvinaisempia toistuvuuden lajeja, sellaisia, jotka syntyvät epätavallisista avainrakenteista eivätkä niinkään jokapäiväisistä liiketoimintatietueista. Paljon teoriaa, ja kokemukseni mukaan ei päänvaivan arvoista sellaisissa järjestelmissä, joita rakennamme Salesforceen. Liiketoimintajärjestelmissä paine kulkee yleensä toiseen suuntaan: peräännymme kolmannesta normaalimuodosta paljon todennäköisemmin, käyttäjien, raportoinnin ja suorituskyvyn vuoksi, kuin menemme sen yli. Siitä kertoo seuraava moduuli. Tiedä, että pidemmät muodot ovat olemassa, mutta useimpaan siihen, mitä teemme, 1NF–3NF antavat meille tarvitsemamme ajattelun työkalut.

Tässä on kantani. Kun yritän ymmärtää liiketoimintaa ja suunnitella sen loogista mallia, haluan aloittaa puhtaalta pöydältä: toimituksen tiedot toimitukselle, jakelukeskuksen tiedot jakelukeskukselle, kuorma-auton tiedot kuorma-autolle, toistuvat käsitteet käsitteinä mallinnettuina. En halua liiketoimintatietoa kopioituna ympäri mallia vain siksi, että se voisi helpottaa jotain näyttöä tai raporttia. En vielä.

Mutta normalisointi ei ole uskonto. Tavoite ei ole akateemisesti puhtain mahdollinen malli. Olen nähnyt arkkitehtien keskittyvän puhtauteen niin paljon, että mallista tulee tuskallinen kaikille, joiden täytyy käyttää sitä. Emme yritä voittaa normalisointikilpailua; rakennamme järjestelmää, ja sillä järjestelmällä on käyttäjiä, raportteja, integraatioita, suorituskykytarpeita, mittakaava ja yhä useammin tekoäly, joka lukee tietoja. Ne saattavat haluta tiedot erimuotoisina.

Lähtökohtani on siis suunnittele kolmanteen normaalimuotoon, kun se on mahdollista, ja peräänny sitten, kun on pakko: ymmärrä ensin, mihin kukin tieto kuuluu. Sitten, jos aiomme poiketa siitä, haluan tietää miksi. Jos vastaus on ”koska en tiennyt, mihin muualle laittaisin kentän”, se ei riitä. Jos vastaus on ”kopioimme tämän arvon tarkoituksella, koska se tekee kumppanien tuloskortista yksinkertaisen, ja meillä on luotettava tapa pitää se synkronissa”, nyt käymme arkkitehtuurikeskustelua.

Kun normalisoin loogista mallia, etsin:

  • Toistuvia arvoja tai rakenteita, jotka pitäisi mallintaa erikseen.
  • Attribuutteja, jotka kuvaavat eri entiteettiä kuin sitä, johon ne on tallennettu.
  • Tietoja, jotka on turhaan monistettu moniin tietueisiin, ja riippuvuuksia, jotka tekevät niistä epäjohdonmukaisia.
  • Kenttien sisään piilotettuja liiketoimintakäsitteitä.
  • Puhdasta mallia, joka kuvaa totuuden ennen toteutuksen kompromisseja.

Ei siksi, että jokaisen fyysisen järjestelmän pitäisi pysyä täydellisesti normalisoituna. Päinvastoin. Seuraavassa moduulissa poikkeamme puhtaasta mallista tarkoituksella, käyttäjien, raportoinnin, mittakaavan, analytiikan ja tekoälyn vuoksi, ja teemme sen tietäen tarkalleen, mistä luovumme.