sql >> Database teknologi >  >> RDS >> Mysql

Eksisterer praksis/retningslinjer for oprettelse af ikke-normaliserede tabeller under normaliseringsprocessen?

TL;DR Du skal følge en offentliggjort algoritme for at dekomponere til en given normal form.

PS Du fik ikke kunstner fra den originale cd via normalisering, da du introducerede en ny spalte. Men antag, at bordet Kunstner har den åbenlyse betydning. Hvorfor tror du, at det "igen ikke er i tredje normalform, så vidt jeg forstår det"? Hvis kunstner -> årstal i den originale cd, så gør det også i kunstner. Men så er {artist}, med {artist_id}, en CK (kandidatnøgle) for kunstner, og kunstner er i 3NF (og 5NF).

Fra dit spørgsmåls originale version plus den nuværende, har du en foreslået basistabel-cd med kolonner cd_id, title, group &year, med tuples hvor cd cd_id med titlen titel blev lavet af gruppen gruppe der blev dannet i år år . Kolonne cd_id er unik, og er derfor en CK. FD {gruppe} -> år gælder også.

Normalisering introducerer ikke nye kolonnenavne. Den erstatter en foreslået basistabel af andre, hver med en mindre delmængde af dens kolonner, som altid slutter sig til, hvad dens værdi ville have været. Normalisering op til BCNF er baseret på FD'er (funktionelle afhængigheder), som også er det, der bestemmer CK'erne i en basistabel. Så dit spørgsmål indeholder ikke en nedbrydning. En mulig dekomponering, der minder om dit spørgsmål, som måske eller måske ikke har nogen særlige egenskaber, ville være til tabeller med kolonnesæt {cd_id, title, group} og {group, year}.

Andre FD'er holder i originalen. Nogle holder på grund af, hvad søjlerne er; nogle holder på grund af CK; nogle holder, fordi {gruppe} -> år holder; generelt holder visse, fordi alle tre gør det. Og måske holder andre på grund af hvilke tupler der skal gå ind i forholdet og hvilke situationer der kan opstå. Du skal beslutte dig for hver muligt FD om det holder.

Selvfølgelig er du måske blevet fortalt at de eneste der holder er dem der skal holde under de omstændigheder. Men du vil ikke har fået at vide, at den eneste FD, der holder, er {group} -> år, fordi der er trivielle FD'er og hver supersæt af en CK bestemmer funktionelt hvert sæt kolonner .

En definition af 3NF er, at en relation er i 2NF, og ingen ikke-primær kolonne er transitivt funktionelt afhængig af nogen CK. (Bemærk, at hver betingelse involverer andre definitioner.) Hvis du vil bruge dette til at finde ud af, om din relation er i 3NF, skal du derefter finde ud af, hvad alt CK'erne er. Du kan gøre dette hurtigst via en passende algoritme, men du kan bare se, hvilke sæt af kolonner der funktionelt bestemmer hver kolonne, men ikke indeholder et mindre sådant sæt, da det er CK'erne. Tjek derefter de to betingelser i definitionen.

Hvis du vil normalisere til 3NF, skal du følge en algoritme for nedbrydning til 3NF. Du forklarer ikke, hvilken proces du synes, du skal følge. Men hvis du ikke følger en gennemprøvet algoritme, kan uanset hvilke komponenter du vælger, eller måske ikke altid slutte sig til originalen, og måske er hver især i en bestemt højere normal form. Bemærk, at eksempler på nedbrydninger du har set ikke er præsentationer af dekomponeringsalgoritmer .

NF (normalform) definitionerne giver betingelser, som en relation skal opfylde for at være i den pågældende NF. De fortæller dig ikke, hvordan du ikke kan dekomponere (bevare FD'er, når det er muligt) til relationer i højere NF'er. Folk har udarbejdet algoritmer til at producere nedbrydninger til bestemte NF'er. (Og nedbrydning til en given NF involverer generelt ikke første nedbrydning til lavere NF'er. At gå gennem lavere NF'er kan faktisk forhindre, at der genereres gode højere NF-nedbrydninger af originalen, når du kommer til at nedbryde pr. en højere NF.)

Du er måske heller ikke klar over, at når nogle FD'er holder, skal visse andre holde. Sidstnævnte kan bestemmes via Armstrongs aksiomer fra førstnævnte. Så bare fordi du gik i opløsning for at slippe af med en bestemt FD, hvis tilstedeværelse krænker en bestemt NF, betyder det ikke, at der ikke var en flok andre, der krænkede den, som du ikke beskæftigede dig med. De kan være til stede i de nye komponenter. Eller de kan ikke være til stede på problematiske måder, så du ikke har "bevaret" dem, når du kunne have det, hvilket fører til dårlige designs.

Lær om specifikke NF-algoritmer, og for den sags skyld NF'er og selve normaliseringen, i en skole/universitets lærebog/kursus/præsentation. Mange er online.




  1. =) Operatør for begyndere

  2. Hvordan kan jeg se, hvor mange MySQL-forbindelser der er åbne?

  3. Sådan konverteres en windows-1251 (russisk kyrillisk) MySql-database til UTF-8

  4. Django tegnsæt og kodning