sql >> Databasteknik >  >> RDS >> Mysql

Finns det praxis/riktlinjer för att skapa icke-normaliserade tabeller under normaliseringsprocessen?

TL;DR Du måste följa en publicerad algoritm för att bryta ned till en given normal form.

PS Du fick inte Artist från original-CD:n via normalisering, eftersom du introducerade en ny kolumn. Men anta att tabellen Artist har den uppenbara betydelsen. Varför tror du att den "återigen inte är i tredje normalform så vitt jag förstår det"? Om artist -> årtal i original-CD:n gör det det också i Artist. Men då är {artist}, med {artist_id}, en CK (kandidatnyckel) för Artist, och Artist är i 3NF (och 5NF).

Från din frågas originalversion plus den nuvarande, har du en föreslagen bastabell-CD med kolumner cd_id, title, group &year, med tupler där cd cd_id med titeln titel skapades av gruppen grupp som bildades år år . Kolumn cd_id är unik, därför en CK. FD {grupp} -> år gäller också.

Normalisering introducerar inga nya kolumnnamn. Den ersätter en föreslagen bastabell med andra, var och en med en mindre delmängd av sina kolumner, som alltid ansluter till vad dess värde skulle ha varit. Normalisering upp till BCNF är baserad på FD (funktionella beroenden), som också är det som bestämmer CK:erna för en bastabell. Så din fråga innehåller ingen sönderdelning. En möjlig uppdelning som påminner om din fråga, som kanske eller kanske inte har några särskilda egenskaper, skulle vara till tabeller med kolumnuppsättningar {cd_id, title, group} och {group, year}.

Andra FD:er håller i originalet. Vissa håller på grund av vad kolumnerna är; vissa håller på grund av CK; vissa håller eftersom {grupp} -> år håller; i allmänhet gäller vissa eftersom alla tre gör det. Och kanske andra håller på grund av vilka tuplar som ska gå in i relationen och vilka situationer som kan uppstå. Du måste bestämma dig för varje möjlig FD om det håller.

Naturligtvis kan du ha blivit berättad att de enda som håller är de som måste hålla under de omständigheterna. Men du gör inte det har fått veta att den enda FD som håller är {group} -> år, eftersom det finns triviala FD:er och varje superset av en CK bestämmer funktionellt varje uppsättning kolumner .

En definition av 3NF är att en relation är i 2NF och ingen icke-primär kolumn är transitivt funktionellt beroende av någon CK. (Observera att varje villkor innefattar andra definitioner.) Om du vill använda detta för att ta reda på om din relation är i 3NF måste du ta reda på vad allt CKs är. Du kan göra detta snabbast via en lämplig algoritm, men du kan bara se vilka uppsättningar av kolumner som funktionellt bestämmer varje kolumn men som inte innehåller en mindre sådan uppsättning, eftersom det är CK:erna. Kontrollera sedan de två villkoren i definitionen.

Om du vill normalisera till 3NF måste du följa en algoritm för nedbrytning till 3NF. Du förklarar inte vilken process du tycker att du ska följa. Men om du inte följer en beprövad algoritm, kan vilka komponenter du än väljer kanske eller kanske inte alltid förenas med originalet och kanske eller kanske inte var och en har någon speciell högre normal form. Observera att exempel på nedbrytningar du har sett inte är presentationer av nedbrytningsalgoritmer .

NF (normalform) definitionerna ger villkor som en relation måste uppfylla för att vara i den NF. De berättar inte för dig hur du kan bryta ner (bevara FDs när det är möjligt) till relationer i högre NF:er. Människor har arbetat fram algoritmer för att producera nedbrytningar till särskilda NF. (Och nedbrytning till ett givet NF innebär i allmänhet inte första nedbrytning till lägre NF. Att gå igenom lägre NF kan faktiskt förhindra att bra sönderdelningar med högre NF av originalet genereras när du kommer till sönderdelning per en högre NF.)

Du kanske inte heller inser att när vissa FD håller, måste vissa andra hålla. Det senare kan bestämmas via Armstrongs axiom från det förra. Så bara för att du bröts ner för att bli av med en viss FD vars närvaro bryter mot en viss NF betyder det inte att det inte fanns ett gäng andra som brutit mot det som du inte hanterade. De kan finnas i de nya komponenterna. Eller så kan de inte vara närvarande på problematiska sätt, så att du inte har "bevarat" dem när du kunde ha det, vilket leder till dålig design.

Lär dig om specifika NF-algoritmer, och för den delen NF:er och själva normaliseringen, i en lärobok/kurs/presentation på högskola/universitet. Många är online.




  1. Steg-för-steg-instruktioner för Oracle Virtual Box-installation

  2. MySQL uppdaterar Varchar-kolumnen med NULL

  3. SQL-funktion mycket långsam jämfört med fråga utan funktionsomslag

  4. FEL! Servern avslutades utan att uppdatera PID-filen (/usr/local/var/mysql/`användarnamn`.lan.pid)