MirusMentis Skrevet 29. september 2007 Del Skrevet 29. september 2007 (endret) 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 29. september 2007 av rwd-drifter Lenke til kommentar
Frank2004 Skrevet 29. september 2007 Del Skrevet 29. september 2007 [...] 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
MirusMentis Skrevet 29. september 2007 Forfatter Del Skrevet 29. september 2007 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
Lurifaksen Skrevet 29. september 2007 Del Skrevet 29. september 2007 Når du jobber mot to tabeller er det lurt å bruke tabellnavn.feltnavn - ikke bare feltnavn. Dersom f.eks. du har et felt i brukertabellen som heter "NavnID" og et felt med samme navn i shoutbox tabellen blir det jo kluss. For å skille bruker du altså: shoutbox.NavnID og brukere.NavnID. Lenke til kommentar
blackbrrd Skrevet 30. september 2007 Del Skrevet 30. september 2007 (endret) 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 30. september 2007 av blackbrrd Lenke til kommentar
Frank2004 Skrevet 30. september 2007 Del Skrevet 30. september 2007 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
blackbrrd Skrevet 30. september 2007 Del Skrevet 30. september 2007 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå