Avatar billede davidfossil Nybegynder
05. juni 2005 - 16:51 Der er 5 kommentarer og
1 løsning

Nedarvning mellem tabeller i PostgreSQL

Jeg sidder og leger med et databaseprojekt hvor jeg vil registrere nogle forskellige typer hardware. Disse har nogle attributes der er fælles, samt nogle specielle for de forskellige subtyper. Målet er at tabellen Hardware skal kender til samtlige enheder, mens andre tabeller såsom Harddrives og Printers skal holde de mere specifikke informationer.

Dette kan tilsyneladende løses på (mindst) to måder. Følgende er opskrevet som "semi-sql", for overskuelighedens skyld...

1) Tre tabeller med 1-1 relationer fra subtyper til base tabel:
"Hardware" (id, placering, ansvarlig, brand, model)
"Printer" (id REFERENCES "Hardware", farver, ppm)
"Harddrives" (id REFERENCES "Hardware", size, interface, rpm)

2) En base tabel, og to tabeller der benytter INHERITS funktionaliteten:
"Hardware" (id, placering, ansvarlig, brand, model)
"Printer" (farver, ppm) INHERITS "Hardware"
"Printer" (farver, ppm) INHERITS "Hardware"
"Harddrives" (size, interface, rpm) INHERITS "Hardware"

Jeg er interesseret i at vide hvilke problemer jeg vil kunne få med hhv. den ene og den anden løsning. Har testet en del selv og har gjort mig følgende observationer:

1 pro: Virker mest relationelt korrekt.
1 con: Besværligt at udføre SELECT, UPDATE og INSERT. Kan sandsynligvis løses ved at lave et view til hver subtype. En record i "Hardware" kan have flere subtyper, hvilket gør datakvaliteten sårbar.

2 pro: Nemt at udføre SELECT, UPDATE og INSERT.
2 con: Primary key contraint er ugyldigt på tværs af tabellerne. Flere records kan få samme id, hvilket ødelægger den relationelle model.

Nogen der har noget at tilføje til listen? Hvad har jeg overset?
Avatar billede arne_v Ekspert
05. juni 2005 - 19:05 #1
klassisk OO-R har 3 muligheder for en parent med 2 childs:

1) 3 tabeller

hardware
--------
id
placering
ansvarlig
brand
model

printer
-------
hardware
farver
ppm

harddrives
----------
hardware
size
interface
rpm

2) 2 tabeller

printer
-------
id
placering
ansvarlig
brand
model
farver
ppm

harddrives
----------
id
placering
ansvarlig
brand
model
size
interface
rpm

3) 1 tabel

hardware
--------
id
placering
ansvarlig
brand
model
farver
ppm
size
interface
rpm
Avatar billede arne_v Ekspert
05. juni 2005 - 19:07 #2
#3 bruger så en masse NULL

jeg troede at PostgreSQL INHERIT var en smart måde at lave #1 på

men desværre ser det ud til at det er en smar måde at lave #2 på
Avatar billede davidfossil Nybegynder
05. juni 2005 - 19:40 #3
Alt sammen korrekt.
Du kender ikke noget til INHERIT metoden?
Avatar billede arne_v Ekspert
05. juni 2005 - 20:15 #4
Jeg har aldrig brugt PostgreSQL tabel arv.

Udfra din beskrivelse af problemstillingen ville jeg aldrig vælge #2
og dermed heller aldrig  PostgreSQL tabel arv.
Avatar billede arne_v Ekspert
22. juni 2005 - 20:17 #5
david - tid at få lukket her ?
Avatar billede arne_v Ekspert
24. juli 2005 - 16:26 #6
skal jeg ligge et 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