Partielle determineringer

Diskusjoner som omhandler databaser og SQL postes her.

Partielle determineringer

Innlegg solo » 03.05.2012 23:00

Hei,

Prøver å skjønne dette med andre normalform, og har fått med meg at relasjonen må være på første normalform, og ikke ha partielle determineringer.

Noen som kan forklare hva partielle determineringer er for noe? Har lest på wikipedia men skjønte ikke særlig mye av det...
Brukerens avatar
solo
Medlem
 
Innlegg: 989
Registrert: 15.10.2003 18:25
Bosted: Larvik

Re: Partielle determineringer

Innlegg DavidS » 03.05.2012 23:18

Kort fortalt er en partiell avhengighet en determinering fra en sammensatt primærnøkkel.
For at en tabell skal oppfylle kravet til 2NF, kan det altså ikke eksistere determineringer fra deler av primærnøkkelen.

Ta følgende tabell som eksempel:
Ansatt(PersonID, ArbeidsgiverID, PersonNavn, ArbeidsgiverNavn, Kontor)

Primærnøkkelen består av PersonID+ArbeidsgiverID. Vi ser at Kontor-feltet er avhengig av hele nøkkelen, mens PersonNavn kun er avhengig av PersonID og ArbeidsgiverNavn kun er avhengig av ArbeidsgiverID.
PersonID -> PersonNavn og ArbeidsgiverID -> ArbeidsgiverNavn er altså partielle avhengigheter.

Tabellen bryter med 2NF, og må dekomponeres til følgende tabeller:
  • Person(PersonID, PersonNavn)
  • Arbeidsgiver(ArbeidsgiverID, ArbeidsgiverNavn)
  • Ansatt(PersonID*, ArbeidsgiverID*, Kontor)

Definisjon:
Gitt tabellen T(A, B, C, D). Da er B->D en partiell avhengighet, gitt:
  • B er en ekte delmengde av en sammensatt primærnøkkel
  • D er ikke med i primærnøkkelen i T
DavidS
Seniormedlem
 
Innlegg: 3667
Registrert: 17.05.2006 17:08

Re: Partielle determineringer

Innlegg solo » 04.05.2012 0:06

Ok, så i grunn betyr det at hvis man har en samensatt primærnøkkel må man splitte tabellen opp i flere biter?

Noen som har peiling hva ordet partiell betyr? Betyr det samensatt?
Brukerens avatar
solo
Medlem
 
Innlegg: 989
Registrert: 15.10.2003 18:25
Bosted: Larvik

Re: Partielle determineringer

Innlegg Matsemann » 04.05.2012 8:59

solo skrev:Ok, så i grunn betyr det at hvis man har en samensatt primærnøkkel må man splitte tabellen opp i flere biter?

Nei. Kun om noe i tabellen som ikke er primærnøkkel ikke er avhengig av hele primærnøkkelen.
Se DavidS eksempel igjen. Primærnøkkelen i ansatt består av to attributter, mens man trenger kun én av de for å unikt kunne bestemme personnavn fordi en har avhengigheten personID -> personNavn.
Endret: Eksempel på en lovlig tabell i 2NF med flere primærnøkler:
Vinnere(konkurranse, år, vinnernavn)
der {konkurranse, år} -> {vinnernavn}


Partiell kan vel også sies som "delvis". Altså om et attributt bare er delvis avhengig av primærnøkkelen (og ikke fullstendig) er den ikke i 2NF.

Endret: Har eksamen i databaser om noen uker, yay!
Master i Datateknikk, NTNU
Brukerens avatar
Matsemann
Moderator
 
Innlegg: 2133
Registrert: 05.02.2005 19:13

Re: Partielle determineringer

Innlegg DavidS » 04.05.2012 9:44

solo: Det er ingenting i veien med å ha en primærnøkkel bestående av to eller flere attributter. Det er først når de andre attributtene i tabellen ikke er avhengige av nøkkelen, at ting ikke er som de skal.
Det er veldig logisk når en tenker seg over det:
Vi har en nøkkel A+B som unikt skal determinere (les: bestemme) alle de andre attributtene. Så har vi attributten D, som kun er avhengig av A. Hvorfor benytter vi oss av en sammensatt nøkkel da?
Løsningen blir ikke å bryte primærnøkkelen opp, men splitte attributten som er partiell avhengig ut.

Matsemann skrev:Har eksamen i databaser om noen uker, yay!


Ditto! :)
DavidS
Seniormedlem
 
Innlegg: 3667
Registrert: 17.05.2006 17:08

Re: Partielle determineringer

Innlegg solo » 04.05.2012 11:33

Bra det ikke bare er jeg som skal opp i databasefaget, så jeg får litt hjelp - hehe.. Skal opp i midten av neste måned, så har enda litt tid på å forstå dette :lol:

Har prøvd å laget et eksempel nå, hvordan vil dere få det over til 2NF?

Unormal form av tabell prosjektdeltager
Prosjektdeltager(
prosjektnr,
prosjektnavn,
ansattnr,
deltagers_fulle_navn,
deltagers_adresse,
deltagers_tlf
)

unf.gif
UNF
unf.gif (13.2 KiB) Vist 5954 ganger


Første normalform av tabell prosjektdeltager
Prosjektdeltager(
prosjektnr,
prosjektnavn,
ansattnr,
deltagers_fulle_navn,
deltagers_adresse,
deltagers_tlf
)

1nf.gif
1NF
1nf.gif (16.21 KiB) Vist 5954 ganger
Brukerens avatar
solo
Medlem
 
Innlegg: 989
Registrert: 15.10.2003 18:25
Bosted: Larvik

Re: Partielle determineringer

Innlegg Matsemann » 04.05.2012 13:42

Her vil nok {prosjektnr, ansattnr} være primærnøkkel.
Men så har vi avhengighetene {prosjektnr} -> {prosjektnavn}
og {ansattnr} -> {deltagers_fulle_navn, deltagers_adresse, deltagers_tlf}
Så for å få dette over i 2NF ville jeg splittet ut:

Prosjekt(nr, prosjektnavn)
Ansatt(ansattnr, fullt_navn, adresse, tlf)
ProsjektDeltagere(prosjektnr, ansattnr)

Denne oppfyller dessuten 3NF om jeg ikke tar feil.
Master i Datateknikk, NTNU
Brukerens avatar
Matsemann
Moderator
 
Innlegg: 2133
Registrert: 05.02.2005 19:13

Re: Partielle determineringer

Innlegg DavidS » 05.05.2012 23:51

Navn og adresse oppfyller jo ikke 1NF engang, om jeg kan pirke :-) Førstnevnte kan jo være diskutabelt, men Postnr og poststed er det ingen nåde over! Adresse bør med andre ord splittes..
DavidS
Seniormedlem
 
Innlegg: 3667
Registrert: 17.05.2006 17:08

Re: Partielle determineringer

Innlegg Matsemann » 06.05.2012 9:46

Det er så klart riktig, jeg surfet uten bilder når jeg skrev mitt forrige innlegg fra telefonen, så at adressen ikke var atomisk fikk jeg ikke med meg.
Navn kan, som du sier, være diskutabelt. Avhengig av brukstilfelle osv.
Master i Datateknikk, NTNU
Brukerens avatar
Matsemann
Moderator
 
Innlegg: 2133
Registrert: 05.02.2005 19:13

Re: Partielle determineringer

Innlegg solo » 06.05.2012 12:09

Jeg har ingen unnskyldninger.. :roll:
Så, hvordan gjør vi denne til 2NF?

Første normalform av tabell prosjektdeltager
Prosjektdeltager(
prosjektnr,
prosjektnavn,
ansattnr,
deltagers_fornavn,
deltagers_etternavn,
deltagers_adresse,
deltagers_postnr,
deltagers_sted,
deltagers_tlf
)

1nf.gif
1 Normalform
1nf.gif (18.1 KiB) Vist 5901 ganger
Brukerens avatar
solo
Medlem
 
Innlegg: 989
Registrert: 15.10.2003 18:25
Bosted: Larvik

Re: Partielle determineringer

Innlegg Matsemann » 06.05.2012 14:06

Et hint på veien: Finn alle funksjonelle avhengigheter.
Du ser prosjektnr -> prosjektnavn
ansattnr -> resten

Hva er primærnøkkelen her? Jeg antar det er {prosjektnr, ansattnr}. Da ser du at prosjektnavn er jo kun avhengig av prosjektnr, men ikke ansattnr. Samme for etternavnet, har ingenting med prosjektnr å gjøre som er en del av primærnøkkelen.
Master i Datateknikk, NTNU
Brukerens avatar
Matsemann
Moderator
 
Innlegg: 2133
Registrert: 05.02.2005 19:13


Gå til SQL og databaser

Hvem er i forumet

Brukere som leser i dette forumet: Ingen registrerte brukere og 5 gjester