Gå til innhold

Anbefalte innlegg

Ser at det skrives en del om relasjoner og hvor bra og lurt det er mtp dynamikk å ha flere tabeller som linkes sammen i stedet for en tabell som har alt for mange felter.

 

Jeg klarer ikke å finne en eneste artikkel om hvordan man lager en slik relasjonsbase.

 

Hvor definerer man at et felt i en tabell skal linkes mot et felt i en annen tabell?

Gjør man det når man lager tabellen? Eller skjer dette i hver spørring?

 

Min case er slik, jeg har nå en tabell som heter brukere, den har felt, id, fornavn, etternavn, brukernavn og acclevel (tilgangs nivå)

 

Så har jeg en shoutbox tabell som jeg har følgende felt i: id, navn, text, date, ip

 

Når jeg legger inn inlegg i shoutbox så tar den automatisk fornavn fra $_SESSION['fornavn'] (som jeg setter ved innlogging)

Når jeg kjører spørring mot shoutbox for å hente ut innlegg så henter den navnet.

Jeg kunne tenkt meg å gjøre dette mer dynamisk, og bytte ut feltet navn i shoutbox tabellen, med id, som tilsvarer id i brukere tabellen.

Dette er ikke noe problem, da jeg kun endrer formen til å bruke $_SESSION['userid'] som jeg setter ved innlogging, men hvordan kan jeg linke denne id`n til navnet når jeg lister ut innlegg?

Endret av rwd-drifter
Lenke til kommentar
Videoannonse
Annonse
[...] lurt [...] å ha flere tabeller som linkes sammen i stedet for en tabell som har alt for mange felter.

 

Jeg klarer ikke å finne en eneste artikkel om hvordan man lager en slik relasjonsbase.

Prøv å søke på 'normalisering'.

 

Hvor definerer man at et felt i en tabell skal linkes mot et felt i en annen tabell?

Gjør man det når man lager tabellen? Eller skjer dette i hver spørring?

Dette kalles en fremmednøkkel (foreign key), og de henger sammen med tabellene. Kan defineres samtidig med tabellen, eller i etterkant.

 

En fremmednøkkel er ikke nødvendig for å koble sammen rader, men vil sørge for at alle koblinger du definerer virkelig peker på en rad som eksisterer.

Vær oppmerksom på at enkelte populære 'databaser' (les: mysql) driter i FK constraints som standard. Som vanlig for mysql gir den ingen feilmelding, men ignorerer bare det den ikke skjønner.

 

Min case er slik, jeg har nå en tabell som heter brukere, den har felt, id, fornavn, etternavn, brukernavn og acclevel (tilgangs nivå)

 

Så har jeg en shoutbox tabell som jeg har følgende felt i: id, navn, text, date, ip

 

Når jeg legger inn inlegg i shoutbox så tar den automatisk fornavn fra $_SESSION['fornavn'] (som jeg setter ved innlogging)

Når jeg kjører spørring mot shoutbox for å hente ut innlegg så henter den navnet.

Jeg kunne tenkt meg å gjøre dette mer dynamisk, og bytte ut feltet navn i shoutbox tabellen, med id, som tilsvarer id i brukere tabellen.

Dette er ikke noe problem, da jeg kun endrer formen til å bruke $_SESSION['userid'] som jeg setter ved innlogging, men hvordan kan jeg linke denne id`n til navnet når jeg lister ut innlegg?

9600343[/snapback]

Å hente ut data kalles å gjøre en spørring (query), og gjøres med SELECT kommandoen.

 

Du vil ha data fra shoutbox-tabellen, samt brukerens navn? I så fall kan du prøve noe slikt:

 

SELECT s.id, s.data_du_vil_hente_ut, b.fornavn, b.etternavn
FROM shoutbox s
 INNER JOIN brukere b ON (s.bruker_id = b.id)
WHERE ...
ORDER BY ....

 

 

PS: "Relasjon", som i relasjonsdatabase, betyr rett og slett tabell. En relasjonsdatabase er altså 'bygget på tabeller' -- uttrykket har ingenting med koblingene mellom disse å gjøre.

Lenke til kommentar
Du vil ha data fra shoutbox-tabellen, samt brukerens navn? I så fall kan du prøve noe slikt:

 

SELECT s.id, s.data_du_vil_hente_ut, b.fornavn, b.etternavn
FROM shoutbox s
 INNER JOIN brukere b ON (s.bruker_id = b.id)
WHERE ...
ORDER BY ....

 

 

PS: "Relasjon", som i relasjonsdatabase, betyr rett og slett tabell. En relasjonsdatabase er altså 'bygget på tabeller' -- uttrykket har ingenting med koblingene mellom disse å gjøre.

9600925[/snapback]

 

Den spøringen der, hva betyr at du har "s" etterfulgt av et punktum før feltnavnet? og "s" etter tabell navnet (FROM shoutbox s)

Lenke til kommentar

la oss si at du har to tabeller ordre og kunder, en ordre hører til en kunde, da kan du skrive det slik:

 

CREATE TABLE kunder (

kundeid integer primary key,

kundenavn text

);

 

CREATE TABLE ordre (

ordreid integer primary key,

id_kunde integer references kunder

);

 

du kunne også ha lagt på referanse etter at du har laget feltet, da legger du på en foreign key constraint:

 

ALTER TABLE ordre ADD FOREIGN KEY (id_kunde) REFERENCES kunder;

 

Da vil du ikke kunne legge inn en integer inn i id_kunde feltet uten at den samme integer verdien finnes i kundeid i kunder tabellen. Du vil heller ikke kunne slette en kunde hvis den blir referert til i ordretabellen.

Endret av blackbrrd
Lenke til kommentar
Du vil ha data fra shoutbox-tabellen, samt brukerens navn? I så fall kan du prøve noe slikt:

 

SELECT s.id, s.data_du_vil_hente_ut, b.fornavn, b.etternavn
FROM shoutbox s
 INNER JOIN brukere b ON (s.bruker_id = b.id)
WHERE ...
ORDER BY ....

 

Den spøringen der, hva betyr at du har "s" etterfulgt av et punktum før feltnavnet? og "s" etter tabell navnet (FROM shoutbox s)

9602076[/snapback]

Jeg lager meg aliaser av tabellnavnene. Kan også skrives som

FROM shoutbox AS s
 INNER JOIN brukere AS b ON (s.bruker_id = b.id)

 

Akkurat her gjør jeg det bare for å få et kortere/enklere tabellnavn ettersom jeg bruker disse en del ganger, slik lurifaks nevner over.

 

Grunnen til at SQL støtter dette tipper jeg er for å gjøre det mulig å koble en tabell mot seg selv; da må du nesten gi hver referanse til tabellen et eget navn.

Lenke til kommentar

Typisk bruk ville vært hvis du har en kunde tabell hvor kundene de kan ha kunder. F.eks ett firma som igjen har kunder...

 

CREATE TABLE kunde (

kundeid integer primary key,

id_kunde integer references kunde,

kundenavn text

);

 

 

SELECT *

FROM kunde as firma

INNER JOIN kunde as firmakunde ON firmakunde.id_kunde = firma.kundeid

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...