sql >> Database >  >> RDS >> Mysql

Normalisatie in MYSQL

Ik probeer normalisatie hier in lekentermen uit te leggen. Ten eerste is het iets dat van toepassing is op relationele databases (Oracle, Access, MySQL), dus het is niet alleen voor MySQL.

Normalisatie gaat erom ervoor te zorgen dat elke tabel de enige minimale velden heeft en om afhankelijkheden te verwijderen. Stel je voor dat je een personeelsdossier hebt en elke medewerker hoort bij een afdeling. Als je de afdeling samen met de andere gegevens van de medewerker als een veld opslaat, heb je een probleem - wat gebeurt er als een afdeling wordt verwijderd? U moet alle afdelingsvelden bijwerken en er is een kans op fouten. En wat als sommige medewerkers geen afdeling hebben (nieuw toegewezen misschien?). Nu zullen er null-waarden zijn.

Dus de normalisatie, in het kort, is om te voorkomen dat er velden zijn die null zouden zijn, en ervoor te zorgen dat alle velden in de tabel slechts tot één domein van de gegevens behoren die worden beschreven. In de werknemerstabel kunnen de velden bijvoorbeeld id, naam, burgerservicenummer zijn, maar die drie velden hebben niets met de afdeling te maken. Alleen medewerker-ID beschrijft tot welke afdeling de medewerker behoort. Dit houdt dus in dat op welke afdeling een medewerker zich bevindt in een andere tabel moet staan.

Hier is een eenvoudig normalisatieproces.

EMPLOYEE ( < employee_id >, name, social_security, department_name)

Dit is niet genormaliseerd, zoals uitgelegd. Een genormaliseerd formulier zou eruit kunnen zien als

EMPLOYEE ( < employee_id >, name, social_security)

Hier is de tabel Werknemer slechts verantwoordelijk voor één set gegevens. Dus waar slaan we op tot welke afdeling de medewerker behoort? In een andere tabel

EMPLOYEE_DEPARTMENT ( < employee_id >, department_name )

Dit is niet optimaal. Wat als de afdelingsnaam verandert? (het gebeurt de hele tijd in de Amerikaanse regering). Daarom is het beter om dit te doen

EMPLOYEE_DEPARTMENT ( < employee_id >, department_id )
DEPARTMENT ( < department_id >, department_name )

Er zijn de eerste normaalvorm, de tweede normaalvorm en de derde normaalvorm. Maar tenzij je een DB-cursus studeert, ga ik meestal voor de meest genormaliseerde vorm die ik kon begrijpen.

Ik hoop dat dit helpt.



  1. Oracle SQL Where-clausule om datumrecords ouder dan 30 dagen te vinden

  2. Fix MySQL-waarschuwing 1287:'BINARY expr' is verouderd en zal in een toekomstige release worden verwijderd

  3. Krijg envelop.i.e overlappende tijdspannes

  4. Gegevens aggregeren met behulp van groepsfuncties (groeperen op orakel)