Avatar billede atke Nybegynder
18. december 2004 - 16:14 Der er 3 kommentarer og
1 løsning

Mappe arv uden mulighed for inkonsistens

Eksempel med dyr som hund og kat arver fra.

Det er flere gange anbefalet at implementere således:

DYR
id  PK

HUND
dyrid PK/FK(DYR.id)

KAT
dyrid PK/FK(DYR.id)

Med den viste mapning kan en tuppel hund- og kat tabellen have samme dyrid.

Hvordan forhindrer man, i databasen, at der kan oprettes et dyr der både er en hund og en kat ???
Avatar billede arne_v Ekspert
18. december 2004 - 17:27 #1
Der er 3 måder at lave arv på i relationelle databaser. Ingen af dem er
perfekte. Du har valgt en af dem.

Du kunne skifte til en objekt orienteret database som understøtter
arv.

I praksis vælger de fleste bare at lade deres applikation checke for
de ting som databasen ikke kan checke for.

Hvis din database understøtter triggers kunne du lave noget der.
Avatar billede atke Nybegynder
18. december 2004 - 23:01 #2
Tak arne_v

Så er der ingen grund til at jeg leder videre efter den perfekte løsning...

Jeg har set en lidt anden løsning, der linker den anden vej. Men den forudsætter at base-tabellen kender alle sub-tabellerne:

DYR
id    PK
hundid FK
katid  FK

HUND
id    PK

KAT
id    PK

Det er for så vidt bare at vende 1 til 1 relationen, men her er det rimelig nemt at sætte en constraint på der sikrer at "en og kun en" af DYR.hundid og DYR.katid er NULL, og derfor er den anden sat.

Problemet med denne model er, at så kan to tupler i DYR pege på en og samme tuple i kat.

Jeg har set at postgreSQL har noget arv til tabeller, men jeg er tvunget på MS-SQL. Jeg tror egentlig at nogle triggere ville være en god løsning.

>arne_v - hvis du smider et svar, får du point for at pointere at den perfekte løsning ikke findes.
Avatar billede arne_v Ekspert
18. december 2004 - 23:06 #3
Se den løsning har jeg ikke set før.

De 3 traditionelle er:

parent tabel med fælles data
child A tabel med specifikke data for A
child B tabel med specifikke data for B

tabel A med fælles data + specifikke data for A
tabel B med fælles data + specifikke data for B

common tabel med fælles data + specifikke data for A + specifikke data for B (NULL hvor ikke relevant)
Avatar billede arne_v Ekspert
18. december 2004 - 23:06 #4
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester