Valmistautuminen ohjelmointihaastatteluihin · Oppitunti

Normalisointi 3NF:ään asti

Ensimmäinen, toinen ja kolmas normaalimuoto sekä niiden poistamat poikkeamat.

Oppitunti 1/413 vaihetta

Normalisointi 3NF:ään asti on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Miksi haastattelijat kysyvät normalisoinnista

Normalisointi on tietokantojen mallintamisen perusasia, ja haastattelijat käyttävät sitä testatakseen, ymmärrättekö tietojen eheyden suunnittelutasolla. Kysymys kuuluu usein esimerkiksi näin: "Mitä normalisointi on ja miksi sillä on merkitystä?"

Normalisointi tarkoittaa sarakkeiden ja taulujen järjestämistä siten, että redundanssia vähennetään ja päivitys-, lisäys- ja poistopoikkeamat estetään. Jokainen normaalimuoto (1NF, 2NF, 3NF) lisää tiukemman säännön.

Hyvässä vastauksessa nimetään poikkeamat, jotka normalisointi poistaa, eikä vain toisteta oppikirjamääritelmiä.

Kolme poikkeamaa

Ennen normaalimuotoja kannattaa opetella ongelmat, jotka ne ratkaisevat. Huonosti suunniteltu taulu, johon tallennetaan kaikki samaan paikkaan, kärsii kolmesta poikkeamasta:

  • Päivityspoikkeama: sama tieto tallennetaan monelle riville, joten muutos on tehtävä kaikkiin niihin, tai tiedot muuttuvat ristiriitaisiksi.
  • Lisäyspoikkeama: tietoa ei voi lisätä antamatta samalla myös asiaan liittymättömiä tietoja (esimerkiksi tuotetta ei voi lisätä ilman tilausta).
  • Poistopoikkeama: yhden rivin poistaminen poistaa vahingossa toisen, toisistaan riippumattoman tiedon.

Kun osaatte tunnistaa nämä esimerkkitaulusta, pystytte perustelemaan jokaisen normalisointivaiheen.

Normalisoimaton lähtötaulu

Tässä on klassinen haastatteluesimerkki: yksi leveä taulu, jossa tilaukset, asiakkaat ja tuotteet on sekoitettu keskenään. Huomatkaa eri riveillä toistuva asiakkaan sähköpostiosoite ja tuotteen hinta. Tässä poikkeamat piilevät.

Tehtävänne on viedä tämä taulu haastattelussa 3NF-muotoon ja selittää jokainen jako.

-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
  order_id     INT,
  customer_id  INT,
  customer_email VARCHAR(255),
  product_id   INT,
  product_name VARCHAR(100),
  unit_price   DECIMAL(10,2),
  quantity     INT
);

Ensimmäinen normaalimuoto (1NF)

1NF edellyttää, että jokainen sarake sisältää yhden atomisen arvon ja ettei solussa ole toistuvia ryhmiä tai taulukoita.

Taulu rikkoo 1NF:n, jos sarakkeeseen tallennetaan pilkuilla eroteltu luettelo, kuten 'phone1, phone2', tai jos käytössä on sarakkeet product1, product2, product3.

Korjaus on antaa jokaiselle arvolle oma rivinsä. Haastattelija haluaa kuulla: "atomiset arvot, ei toistuvia ryhmiä ja avain, joka yksilöi jokaisen rivin".

-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'

-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
  customer_id INT,
  phone       VARCHAR(20),
  PRIMARY KEY (customer_id, phone)
);

Funktionaaliset riippuvuudet

2NF:n ja 3NF:n selittämiseksi on käytettävä termiä funktionaalinen riippuvuus. Merkintä A -> B tarkoittaa, että "A määrittää B:n": jokaiselle A:n arvolle on täsmälleen yksi B:n arvo.

Taulussamme orders:

  • customer_id -> customer_email
  • product_id -> product_name, unit_price
  • order_id, product_id -> quantity

Normalisoinnissa on pohjimmiltaan kyse siitä, että jokainen ei-avainsarake riippuu koko avaimesta eikä mistään muusta kuin avaimesta.

Toinen normaalimuoto (2NF)

2NF koskee tilanteita, joissa perusavain on yhdistelmäavain. Se estää ei-avainsaraketta riippumasta vain osasta avainta (osittainen riippuvuus).

Tilausrivin avain on (order_id, product_id). Mutta product_name ja unit_price riippuvat vain product_id:stä, eivät koko avaimesta. Kyseessä on osittainen riippuvuus, joten taulu rikkoo 2NF:n.

Korjaus on siirtää tuotteen attribuutit products-tauluun, jonka avaimena on product_id.

CREATE TABLE products (
  product_id   INT PRIMARY KEY,
  product_name VARCHAR(100),
  unit_price   DECIMAL(10,2)
);

CREATE TABLE order_items (
  order_id   INT,
  product_id INT,
  quantity   INT,
  PRIMARY KEY (order_id, product_id),
  FOREIGN KEY (product_id) REFERENCES products(product_id)
);

Kolmas normaalimuoto (3NF)

3NF poistaa transitiiviset riippuvuudet: tilanteet, joissa ei-avainsarake riippuu toisesta ei-avainsarakkeesta eikä suoraan avaimesta.

Oletetaan, että orders-taulussa on customer_id ja customer_email. Tällöin order_id -> customer_id -> customer_email. Sähköpostiosoite riippuu avaimesta vain customer_id:n kautta, joten kyseessä on transitiivinen riippuvuus.

Korjaus on jakaa asiakkaat omaan tauluunsa. Nyt kunkin taulun ei-avainsarakkeet riippuvat vain sen omasta avaimesta.

CREATE TABLE customers (
  customer_id    INT PRIMARY KEY,
  customer_email VARCHAR(255)
);

CREATE TABLE orders (
  order_id    INT PRIMARY KEY,
  customer_id INT,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Yhden lauseen muistisääntö

Haastattelijat arvostavat hakijaa, joka osaa tiivistää 3NF:n yhteen lauseeseen. Klassinen muotoilu on:

"Jokaisen ei-avainsarakkeen on riiputtava avaimesta, koko avaimesta eikä mistään muusta kuin avaimesta."

  • Avain -> 1NF (avain on olemassa ja arvot ovat atomisia).
  • Koko avain -> 2NF (ei osittaista riippuvuutta).
  • Ei mistään muusta kuin avaimesta -> 3NF (ei transitiivista riippuvuutta).

Tämän yhden lauseen avulla voitte palauttaa kaikki kolme normaalimuotoa mieleenne tarvittaessa.

BCNF: jatkokysymys

Tarkkanäköinen haastattelija saattaa kysyä Boyce-Coddin normaalimuodosta (BCNF), joka on 3NF:ää tiukempi muoto.

BCNF edellyttää, että jokaisessa funktionaalisessa riippuvuudessa X -> Y X on oltava superavain. 3NF sallii harvinaisen poikkeuksen, kun riippuva attribuutti kuuluu ehdokasavaimeen; BCNF poistaa myös tämän poikkeuksen.

Käytännössä BCNF-rikkomuksia ei tule usein vastaan, mutta sen mainitseminen ja lauseen "BCNF on 3NF ilman prime-attribuutteja koskevia poikkeuksia" sanominen osoittaa syvällistä ymmärrystä.

Milloin EI pidä normalisoida

Senioritason vastauksessa tunnistetaan kompromissi. Normalisointi parantaa eheyttä, mutta voi heikentää lukusuorituskykyä, koska kyselyn suorittaminen vaatii useampia liitoksia.

Tietoinen denormalisointi on hyväksyttävää, kun:

  • Kuormitus painottuu lukemiseen ja liitokset ovat pullonkaula.
  • Rakennatte analytiikka- tai raportointikerrosta (tähtiskeemoja käsitellään myöhemmin).
  • Pystytte pitämään redundantin kopion synkronoituna (triggerit, ETL, materialisoidut näkymät).

Sanokaa: "Normalisoikaa OLTP:n eheyttä varten; denormalisoikaa harkitusti OLAP:n lukunopeutta varten."

Taululla eteneminen

Kootaan tämä yhteen. Kun saatte live-haastattelussa eteensä sekavan taulun:

  • Määritelkää ehdokasavain ja luetelkaa funktionaaliset riippuvuudet.
  • Tarkistakaa atomisuus ja toistuvat ryhmät (1NF).
  • Jos avain on yhdistelmäavain, tarkistakaa osittaiset riippuvuudet (2NF).
  • Tarkistakaa ei-avaimesta toiseen ei-avaimeen johtavat riippuvuudet (3NF).
  • Piirtäkää tuloksena syntyvät taulut perus- ja viiteavaimineen.

Näiden vaiheiden selostaminen ääneen on juuri se, mitä haastattelija arvioi.

Pikatarkistus

Testatkaa, kuinka hyvin hallitsette normaalimuodot.

Kertaus: normalisointi 3NF:ään asti

Osaatte nyt vastata tavalliseen normalisointia koskevaan haastattelukysymykseen alusta loppuun:

  • Normalisointi poistaa päivitys-, lisäys- ja poistopoikkeamat vähentämällä redundanssia.
  • 1NF: atomiset arvot, ei toistuvia ryhmiä.
  • 2NF: ei osittaista riippuvuutta yhdistelmäavaimesta.
  • 3NF: ei transitiivista (ei-avaimesta toiseen ei-avaimeen johtavaa) riippuvuutta.
  • Tiivistäkää tämä muotoon "avain, koko avain eikä mikään muu kuin avain".
  • BCNF tiukentaa 3NF:ää; denormalisoikaa harkitusti lukupainotteista analytiikkaa varten.
Aloita maksutta

Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
90
Oppitunnit
360

Usein kysytyt kysymykset

Onko oppitunti ”Normalisointi 3NF:ään asti” ilmainen?

Kyllä – oppitunnin ”Normalisointi 3NF:ään asti” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Normalisointi 3NF:ään asti”?

Ensimmäinen, toinen ja kolmas normaalimuoto sekä niiden poistamat poikkeamat. Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Normalisointi 3NF:ään asti”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?

Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Normalisointi 3NF:ään asti
  2. ER-mallinnus ja suhteiden kardinaliteetti
  3. Tähtiskeema ja tietovaraston suunnittelu
  4. Kattava harjoitushaastattelun tehtäväsarja
← Takaisin: Valmistautuminen ohjelmointihaastatteluihin