sql >> Database >  >> RDS >> Mysql

Bestaan ​​er praktijken/richtlijnen voor het maken van niet-genormaliseerde tabellen tijdens het normalisatieproces?

TL;DR Je moet een gepubliceerd algoritme volgen om te ontleden tot een bepaalde normaalvorm.

PS Je hebt Artist niet van de originele CD gekregen via normalisatie, omdat je een nieuwe kolom hebt geïntroduceerd. Maar neem aan dat tabel Artist de voor de hand liggende betekenis heeft. Waarom denk je dat het "weer niet in de derde normaalvorm is voor zover ik het begrijp"? Als artiest -> jaar in de originele cd, dan doet het dat ook in artiest. Maar dan is {artist} met {artist_id} een CK (kandidaatsleutel) van Artist, en Artist zit in 3NF (en 5NF).

Van de originele versie van je vraag plus de huidige, heb je een voorgestelde basistabel-cd met kolommen cd_id, titel, groep en jaar, met tuples waar cd cd_id getiteld titel is gemaakt door groep groep die gevormd werd in jaar jaar . Kolom cd_id is uniek, vandaar een CK. FD {groep} -> jaar geldt ook.

Normalisatie introduceert geen nieuwe kolomnamen. Het vervangt een voorgestelde basistabel door andere, elk met een kleinere subset van de kolommen, die altijd aansluiten bij wat de waarde ervan zou zijn geweest. Normalisatie tot BCNF is gebaseerd op FD's (functionele afhankelijkheden), die ook de CK's van een basistabel bepalen. Uw vraag bevat dus geen decompositie. Een mogelijke decompositie die doet denken aan uw vraag, die al dan niet bepaalde eigenschappen heeft, zou zijn naar tabellen met kolommensets {cd_id, title, group} en {group, year}.

Andere FD's houden het origineel vast. Sommige houden vast vanwege wat de kolommen zijn; sommigen houden vast vanwege de CK; sommige houden vast omdat {groep} -> jaar houdt; in het algemeen zijn bepaalde geldig omdat ze dat alle drie doen. En misschien houden anderen vast vanwege wat tuples geacht worden in de relatie te gaan en welke situaties zich kunnen voordoen. U moet beslissen voor elke mogelijke FD of het geldig is.

Natuurlijk is het je misschien verteld dat de enigen die standhouden degenen zijn die onder die omstandigheden stand moeten houden. Maar u niet is verteld dat de enige FD die van toepassing is {groep} -> jaar is, omdat er zijn triviale FD's en elke superset van een CK bepaalt functioneel elke reeks kolommen .

Een definitie van 3NF is dat een relatie in 2NF is en dat geen enkele niet-prime-kolom transitief functioneel afhankelijk is van een CK. (Merk op dat elke voorwaarde andere definities omvat.) Als u dit wilt gebruiken om erachter te komen of uw relatie in 3NF is, moet u vervolgens uitvinden wat alle de CK's zijn. Je kunt dit het snelst doen via een geschikt algoritme, maar je kunt gewoon zien welke sets kolommen functioneel elke kolom bepalen, maar geen kleinere set bevatten, aangezien dat de CK's zijn. Controleer vervolgens de twee voorwaarden in de definitie.

Als u wilt normaliseren naar 3NF, moet u een algoritme volgen om te ontbinden naar 3NF. Je legt niet uit welk proces je denkt te moeten volgen. Maar als u geen beproefd algoritme volgt, dan kunnen de componenten die u kiest wel of niet altijd aansluiten bij het origineel en al dan niet in een bepaalde hogere normaalvorm zijn. Merk op dat voorbeelden van decomposities je hebt gezien zijn geen presentaties van ontledingsalgoritmen .

De NF (normaalvorm) definities geven voorwaarden waaraan een relatie moet voldoen om in die NF te zijn. Ze vertellen je niet hoe je non-loss kunt ontleden (waar mogelijk FD's behouden) naar relaties in hogere NF's. Mensen hebben algoritmen ontwikkeld voor het produceren van decomposities naar bepaalde NF's. (En ontbinden tot een bepaald NF houdt in het algemeen niet in dat het eerst wordt afgebroken tot lagere NF's. Door lagere NF's gaan, kan zelfs voorkomen dat goede hogere NF-decomposities van het origineel worden gegenereerd wanneer u gaat ontbinden per een hogere NF.)

U realiseert zich misschien ook niet dat wanneer sommige FD's vasthouden, bepaalde andere moeten vasthouden. Dit laatste kan worden bepaald via Armstrongs axioma's uit het eerste. Dus alleen omdat je ontleedde om van een bepaalde FD af te komen waarvan de aanwezigheid een bepaalde NF schendt, wil nog niet zeggen dat er niet een heleboel andere waren die het schenden waar je niet mee te maken hebt gehad. Ze kunnen aanwezig zijn in de nieuwe componenten. Of ze kunnen niet op problematische manieren aanwezig zijn, zodat u ze niet hebt "geconserveerd" wanneer u dat had kunnen doen, wat leidt tot slechte ontwerpen.

Leer over specifieke NF-algoritmen, en wat dat betreft NF's en normalisatie zelf, in een leerboek/cursus/presentatie van een hogeschool/universiteit. Velen zijn online.




  1. SqlConnection.Close() binnen met behulp van instructie

  2. CONTROLEER BEPERKING op meerdere kolommen

  3. Hoe te controleren of er een trigger bestaat in PostgreSQL?

  4. Toestemming geweigerd voor relatie