Gå til innhold
Trenger du skole- eller leksehjelp? Still spørsmål her ×

IT Databaser


Anbefalte innlegg

Vet noen hvordan man kan koble 2 tabeller som ser slik ut?

Land(Navn,Flateinnhold,Hovedstad*)

Byer(Navn,flateinnhold,Land*)

 

CREATE TABLE Land

(

Navn CHAR(40) ,

Flateinnhold CHAR(10)

Hovedstad* CHAR(30)

CONSTRANT LandPK PRIMARY KEY(Navn)

);

 

 

CREATE TABLE Byer

(

Navn CHAR(40) ,

Flateinnhold CHAR(10)

Land* CHAR(40)

CONSTRAINT ByerPK PRIMARY KEY(Navn)

);

Vet ikke hvordan det går ann ettersom begge har fremmednøkler i seg så referanseintegriteten gir ikke mening,hadde vært fint å få et svar :D

Lenke til kommentar
Videoannonse
Annonse

Først og fremst, gi begge tabeller en id-kolonne.

CREATE TABLE land (
    id INT UNSIGNED NOT NULL AUTO INCREMENT,
    flateinnhold INT UNSIGNED, #bruker her INT siden det er en tallverdi
    PRIMARY KEY(id)
);

CREATE TABLE by (
    id INT UNSIGNED NOT NULL AUTO INCREMENT,
    flateinnhold INT UNSIGNED,
    land_id INT UNSIGNED NOT NULL,
    PRIMARY KEY(id),
    FOREIGN KEY (land_id) REFERENCES land(id)
);

Huskeregel #1: Alltid, alltid ha en ID-kolonne i alle tabeller.

 

Hovedstad-feltet i land-tabellen burde egentlig droppes. Hvis du har to tabeller med fremmednøkler som refererer til hverandre, så vil du få problemer med sletting og skaping av ny data. Les om "orphaned rows", eller spør her hvis du lurer på noe mer om det.

 

Det jeg heller foreslår, er at du lager en link-tabell for hovedsteder, som ser slik ut:

CREATE TABLE capitol(
    id INT UNSIGNED NOT NULL AUTO INCREMENT,
    land_id INT UNSIGNED,
    by_id INT UNSIGNED,
    FOREIGN KEY (land_id) REFERENCES land(id),
    FOREIGN KEY (by_id) REFERENCES by(id)
);

Da har du en liste over alle land-hovedstad forhold, og kan enkelt hente ut denne dataen.

 

Det chri-ot nevner om joins er ikke relevant for skaping av tabeller, men joins vil brukes når vi henter ut data, så det vil bli relevant etter hvert.

 

Spør gjerne om det er mer du lurer på!

Lenke til kommentar

Gitt Følgene Database:

Land(Navn,Flateinnhold,Hovedstad*)

Byer(Navn,Flateinnhold,Land*)

Innbyggertall(Navn*,Årstall,Antall)

Grense(Land1*,Land2*)

 

Land.Hovedstad er fremmednøkkel mot byer.Byer.Land ,

mot tabellen land,Flateinnhold er oppgitt i hele KM2.

Anta att tabellen for innbyggertall innholder data for

samtlige land hvert år fra 1970 til idag.

Merk at tabellen grense er symetrisk.De vil si både("sverige norge") og

("Norge sverige") er rader i tabellen.

Endret av Workman94
Lenke til kommentar

Et par poenger:

 

Å bruke strenger som primary key er i utgangspunktet ikke et problem (selv om det i de fleste tilfeller er unødvendig risiko). I dette tilfellet er det helt uhørt. Et land kan endre navn. Det har skjedd før, og det kan skje igjen. Da må man i databasen sin her, endre verdien på en primary key, som skaper problemer for andre tabeller som har foreign keys som peker til en endret verdi.

 

Derfor bruker vi alltid en ID-kolonne, som ikke holder noen data, den bare knytter det sammen, slik at vi kan peke til land #5 uavhengig av om det het Burma og har byttet navn til Myanmar. Alle innslag i byer-tabellen som peker dit, peker bare til land #5, så de trenger ikke å endres selv om landet har byttet navn.

 

I tillegg er det åpent for at en skrivefeil skaper søppeldata.

 

Siden oppgaven er lagt opp på denne måten er det begrenset hvor mye jeg kan hjelpe deg, men det ser ut som du er på riktig spor med det du har skrevet lengre opp. Derimot, hvis det er åpent for å lage sin egen løsning, så anbefaler jeg at du ser på måten jeg skapte tabellene. Jeg ser at boka legger opp til at normalisering skal læres, og jeg skrev det normalisert.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...