Archyno
Data modellingPrax modelovania

Od ER modelu k databázovej schéme

Normalizácia má povesť akademickej disciplíny, ktorú si vyslúžila tým, že sa učí ako päť očíslovaných pravidiel namiesto jedinej opakovanej otázky: patrí tento údaj sem?

11 min čítaniaER - crow's foot3 z 3

Krátka odpoveď

  • Tretia normálna forma v jednej vete: každý nekľúčový stĺpec závisí od kľúča, celého kľúča a ničoho okrem kľúča.
  • Náhradný kľúč prežije, keď si biznis rozmyslí, čo vlastne niečo identifikuje - a to si napokon rozmyslí vždy.
  • Denormalizujte až po zmeraní cesty čítania. Pred meraním vymieňate záruku správnosti za nepotvrdený prínos.
  • Prevod z ER do SQL je mechanický: entita na tabuľku, jeden k mnohým na cudzí kľúč na strane mnohých, mnoho k mnohým na vlastnú tabuľku.
Normalizovaná schéma objednávok v štyroch tabuľkách. customers má kľúč customer_id; orders má kľúč order_id a cudzí kľúč customer_id; order_lines má kľúč order_line_id s cudzími kľúčmi order_id a product_id plus quantity a unit_price; products má kľúč product_id so sku, name a list_price.
Kam sa tento článok dostane: štyri tabuľky, každý stĺpec fakt o kľúči svojej tabuľky a každý vzťah vynútený cudzím kľúčom, nie nádejou.

01Tabuľka, ktorou začína každý#

Nenormalizovaná tabuľka orders s order_id ako primárnym kľúčom a so stĺpcami customer_name, customer_email, product_names, quantities a total.
Jedna tabuľka, päť problémov. Funguje bezchybne až do chvíle, keď ju niekto použije druhýkrát.

Toto nie je vymyslený protivník - je to tvar, ktorý má tabuľkový hárok, a tabuľkovým hárkom väčšina schém začína. Oplatí sa presne pomenovať, čo je na ňom zle, lebo "nie je normalizovaná" nevysvetľuje nič:

To, čo nasleduje, je modelovanie databázovej schémy v úplne bežnom zmysle: rozhodnúť, aké budú tabuľky, ktorý stĺpec identifikuje riadok a kde smie fakt bývať. Je to krok medzi ER diagramom a DDL, ktoré databáza prijme, a oplatí sa spraviť ho na papieri, lebo každé z týchto rozhodnutí sa draho vracia späť, keď už v tabuľke sú dáta.

  1. Nemôžete uložiť zákazníka, ktorý si nič neobjednal. Zákazník existuje len ako stĺpce na objednávke.
  2. Oprava e-mailu znamená aktualizovať každý riadok, na ktorom zákazník vystupuje - a keď jeden vynecháte, databáza drží dve rôzne odpovede.
  3. Zmazanie poslednej objednávky zmaže zákazníka. Informácia zmizne ako vedľajší účinok niečoho, čo s ňou nesúvisí.
  4. product_names obsahuje zoznam. Odteraz každý dopyt, ktorý potrebuje jeden produkt, parsuje reťazec a žiadny index mu nepomôže.
  5. total môže nesúhlasiť s položkami, ktorých má byť súčtom.

Tá pätica má mená - vkladacia, aktualizačná a mazacia anomália, opakujúca sa skupina a odvodená hodnota - a normalizácia je jednoducho postup, ktorý ich odstráni.

02Najskôr vyberte kľúče#

Všetko ďalšie od toho závisí, takže to prichádza skôr než tabuľky. Primárny kľúč musí byť jedinečný, nikdy null a nikdy sa nemeniť. Tretia podmienka je tá, ktorá vyradí väčšinu kandidátov.

PrvokNotáciaČo znamená
Náhradný kľúčbigint alebo uuidGenerovaný, bezvýznamný, navždy stabilný. Predvoľba. Sekvenčné celé číslo je kompaktné a priateľské k indexom; UUID vie vygenerovať klient a neprezrádza objemy.
Prirodzený kľúčISBN, IBAN, kód krajinyVýznamový, a bezpečný len vtedy, keď normalizačný orgán garantuje, že sa nezmení. Skutočne sa kvalifikuje len krátky zoznam.
Zložený kľúčdva alebo viac stĺpcovSprávny pre spojovacie tabuľky, kde dvojica cudzích kľúčov je identitou a zároveň obmedzením jedinečnosti, ktoré ste aj tak chceli.
Biznisový kľúččíslo objednávky, SKUUrčený ľuďom, musí byť jedinečný a mal by byť obmedzením UNIQUE, nie primárnym kľúčom - aby sa dal opraviť, keď sa v ňom nájde preklep.

03Normalizácia v troch krokoch#

Normálnych foriem je šesť a potrebujete tri. Každá je jediná otázka o tabuľke a odpoveď "nie" vám povie, ktorý stĺpec kam presunúť.

PrvokNotáciaČo znamená
Prvá normálna formažiadne opakujúce sa skupinyKaždý stĺpec drží jednu hodnotu. Žiadne zoznamy oddelené čiarkami, žiadne product_1 / product_2 / product_3. Opakujúcu sa časť rozdeľte do vlastnej tabuľky.
Druhá normálna formažiadne čiastočné závislostiKaždý nekľúčový stĺpec závisí od celého kľúča. Problém výhradne pri zložených kľúčoch: názov produktu v tabuľke (order_id, product_id) závisí od polovice kľúča, takže patrí do products.
Tretia normálna formažiadne tranzitívne závislostiŽiadny nekľúčový stĺpec nezávisí od iného nekľúčového stĺpca. customer_email na objednávke závisí od zákazníka, nie od objednávky. Presuňte ho do customers.

Staré zhrnutie je stále najlepšie: každý nekľúčový stĺpec závisí od kľúča, celého kľúča a ničoho okrem kľúča.

Preveďte cez ne plochú tabuľku. 1NF rozdelí product_names a quantities do tabuľky order_lines, jeden riadok na produkt. 2NF si všimne, že názov a cena produktu závisia len od produktu, takže sa objaví products. 3NF si všimne, že meno a e-mail zákazníka závisia od zákazníka, nie od objednávky, takže sa objaví customers. Štyri tabuľky, čo je práve hlavičkový diagram - a žiadny krok nevyžadoval úsudok, len tú otázku.

04Odvodené hodnoty a denormalizácia#

Stĺpec total v plochej tabuľke je iný problém než ostatné štyri: nie je zle umiestnený, je nadbytočný. Dá sa vypočítať z položiek objednávky, takže s nimi môže nesúhlasiť - a raz nesúhlasiť bude.

Tri legitímne odpovede v poradí podľa preferencie: počítať ho v dopyte; počítať ho v pohľade; uložiť ho a nechať databázu, nech ho udržiava - generovaný stĺpec, materializovaný pohľad alebo trigger. Legitímne nie je uložiť ho a spoliehať sa, že si aplikačný kód spomenie ho aktualizovať; to je verzia, ktorá produkuje faktúry, ktoré nesedia.

Siahnite po ňom, keď

  • Zmeraný vzor čítania je príliš pomalý a spojenie je preukázateľne príčinou
  • Hodnota je snímkou v čase, nie odvodením - cena v momente objednania
  • Reportovacia tabuľka plnená naplánovanou úlohou, jasne takto pomenovaná
  • Databáza si kópiu vie udržiavať sama, takže sa nemôže rozísť

Siahnite po niečom inom, keď

  • Mohlo by to byť pomalé neskôr - najprv merajte, obvykle to pomalé nie je
  • Aplikačný kód si musí pamätať, že kópiu má držať v súlade
  • Duplikát je zároveň zdrojom pravdy pre niečo iné
  • Denormalizujete transakčnú schému kvôli obsluhe dashboardu

05Modelovanie dedičnosti#

ER model vie vyjadriť nadtyp s podtypmi; relačná databáza takú konštrukciu nemá, takže fyzický model musí vybrať jedno z troch rozložení. Všetky tri sa široko používajú a voľba je skutočným kompromisom.

PrvokNotáciaČo znamená
Jedna tabuľkajedna tabuľka, stĺpec typuStĺpce všetkých podtypov v jednej tabuľke, väčšina z nich null. Jednoduché dopyty, žiadne spojenia - a databáza nevie vynútiť "platba šekom musí mať kód banky".
Tabuľka na podtyptabuľka pre každý, spoločný kľúčRodičovská tabuľka so spoločnými stĺpcami a detská tabuľka na podtyp, naviazaná na ňu kľúčom. Obmedzenia fungujú poriadne; každý dopyt sa spája.
Tabuľka na konkrétny typúplne oddelené tabuľkyŽiadna spoločná tabuľka. Rýchle a čisté v rámci podtypu - a dopyt na "všetky platby" znamená úniu, ktorá rastie s každým pridaným podtypom.

Hrubé pravidlo: málo podtypov s prevažne spoločnými stĺpcami hovorí pre jednu tabuľku; veľa podtypov s rozchádzajúcimi sa stĺpcami a reálnymi obmedzeniami hovorí pre tabuľku na podtyp; a podtypy, na ktoré sa nikdy nedopytujete spolu, hovoria pre oddelené tabuľky. Diagram tried pre tú istú doménu si dedičnosť obvykle vybral bez toho, aby čokoľvek z tohto riešil, a práve preto tie dva modely tu smú byť odlišné.

06Cesta k DDL#

Logický ER model sa na DDL mapuje takmer mechanicky, čo je odmena za to, že ste ho nakreslili poriadne:

PrvokNotáciaČo znamená
EntitaCREATE TABLEJedna tabuľka. Názov tabuľky v množnom čísle, názov entity v jednotnom - vyberte si jedno a držte sa toho.
Primárny kľúčPRIMARY KEYImplikuje not null a unique a vytvára index.
VzťahREFERENCESCudzí kľúč na strane mnohých. Index si pridajte sami - väčšina databáz ho pre cudzí kľúč nevytvorí a jeho absencia spomalí mazanie na plazenie.
Povinný koniecNOT NULLVnútorná čiarka vo vranej nohe je presne toto obmedzenie.
Jeden k jednémuUNIQUE na cudzom kľúčiInak je to vzťah jeden k mnohým, ktorý má zatiaľ len jeden riadok.
Spojovacia entitazložený PRIMARY KEYOba cudzie kľúče spolu. Práve to zabráni tomu, aby sa tá istá dvojica zapísala dvakrát.

Dve veci, ktoré vám diagram nepovie a DDL o nich musí rozhodnúť: čo sa stane pri mazaní (CASCADE pri identifikujúcom vzťahu, RESTRICT takmer všade inde) a ktoré stĺpce dostanú indexy nad rámec kľúčov. Oboje sú rozhodnutia o správaní a záťaži, nie o modeli, a oboje sa oplatí zapísať vedľa schémy, nie ich objaviť neskôr v logu pomalých dopytov.

07Časté chyby#

  1. Normalizovanie za hranicu užitočnosti. 3NF je cieľ transakčnej schémy. Rozdeliť tabuľku preto, že sa stĺpec možno raz zopakuje, neprinesie nič a bude stáť spojenie navždy.
  2. Žiadne cudzie kľúče, "kvôli výkonu". Cena je jedno vyhľadanie v indexe pri zápise; prínosom je, že osirotené riadky sú nemožné. Takmer nikdy nie je to výmena, ktorá sa oplatí.
  3. Nullovateľné stĺpce zastupujúce chýbajúcu tabuľku. Šesť stĺpcov, ktoré sú vyplnené len pre jeden druh riadku, je podtyp, ktorý si pýta vlastnú tabuľku.
  4. status ako voľný text. Obmedzte ho - kontrolným obmedzením, enumom alebo číselníkovou tabuľkou - inak bude do roka obsahovať shipped, Shipped aj SHIPPED.
  5. Časové pečiatky bez časového pásma. Správne presne raz, v jednej kancelárii, do prvého presunu servera.
  6. Diagram opustený po prvej migrácii. Diagram schémy, ktorý nesúhlasí s databázou, je horší než žiadny, lebo mu ľudia veria.

Ak symboly kardinality na diagramoch vyššie potrebujú preklad, sú pokryté v notácii vranej nohy; tvar samotného modelu je v ER diagramoch.

Po jednom riadku na každé

  1. 01Kľúče vyberte skôr než tabuľky; jedinečné, not null a nikdy sa nemeniace.
  2. 02Každý nekľúčový stĺpec závisí od kľúča, celého kľúča a ničoho okrem kľúča.
  3. 031NF rozdelí opakujúce sa skupiny, 2NF opraví čiastočné kľúče, 3NF presunie zle umiestnené fakty.
  4. 04Denormalizujte na základe merania a len tam, kde kópiu udržiava databáza.
  5. 05Historická cena nie je duplikát - je to iný fakt.
  6. 06Vraňa noha sa na DDL mapuje takmer mechanicky; indexujte si cudzie kľúče.

08Časté otázky#

Čo je tretia normálna forma?

Tabuľka je v tretej normálnej forme, keď každý nekľúčový stĺpec závisí od kľúča, celého kľúča a ničoho okrem kľúča. V praxi: žiadne opakujúce sa skupiny, žiadny stĺpec závislý len od časti zloženého kľúča a žiadny stĺpec závislý od iného nekľúčového stĺpca.

Aký je rozdiel medzi náhradným a prirodzeným kľúčom?

Prirodzený kľúč sú dáta, ktoré riadok už identifikujú, napríklad ISBN. Náhradný kľúč je bezvýznamná generovaná hodnota, napríklad celé číslo alebo UUID. Náhradné kľúče zostanú stabilné, keď si biznis rozmyslí, čo vlastne niečo identifikuje - a to si napokon rozmyslí vždy.

Kedy je denormalizácia opodstatnená?

Keď ste zmerali cestu čítania, ktorú normalizácia spomalila príliš, a viete žiť s tým, že zduplikovaná hodnota zostarne. Denormalizovať skôr, než tú mieru máte, znamená vymeniť záruku správnosti za výkonnostný prínos, o ktorom ste si nepotvrdili, že existuje.

Ako sa v relačnej schéme implementuje dedičnosť?

Tri možnosti: jedna tabuľka pre celú hierarchiu s rozlišovacím stĺpcom a množstvom nullovateľných stĺpcov, jedna tabuľka na konkrétnu triedu so zopakovanými spoločnými stĺpcami, alebo jedna tabuľka na triedu spojená cez zdieľaný kľúč. Ktorá je správna, závisí od toho, ako často sa dopytujete naprieč hierarchiou, oproti tomu, ako veľmi sa podtriedy líšia.

Ako spraviť z ER diagramu SQL?

Každá entita sa stane tabuľkou, každý atribút stĺpcom a identifikujúci atribút primárnym kľúčom. Vzťahy jeden k mnohým sa stanú cudzím kľúčom na strane mnohých a vzťahy mnoho k mnohým vlastnou tabuľkou. Potom pridajte obmedzenia not null a unique, ktoré kardinality na diagrame naznačujú.

V tejto sérii

Súvisiace články

Všetky články