Avatar billede ehv Nybegynder
16. maj 2003 - 12:42 Der er 39 kommentarer og
1 løsning

MSQL: er der nogen der kan hjælpe med brugen af idx VS nøgler

jeg er ved at oprette en db men mangler en forståelse for brugen af idx.
Jeg har en rimelig forståelse for databaser generalt men da jeg fandt ud af at msql havde fjernet primærnøgler og erstattet dem med idx blev jeg forviret.
Hvis jeg kigger i manualen står der en rimmelig beskrivelse af idx som primærnøgle men intet om fremmednøgler.
Mit spørgsmål er:
jeg har en tabel1 hvor jeg har oprette et idx1 på et felt i tabelen,dette felts indhold,skal overføres til min tabel2 som "fremmednøgle".kan man det og eller er det måden at gøre det på?
Det ville være en stor hjælp hvis der var en det kunne forklare mig brugen af idx VS nøgler evt. et eksempel på en simpel sammensætning af minimum to tabeller.
evt. en god hjemmeside med tips og trix //ikke hughes egen side
Avatar billede arne_v Ekspert
16. maj 2003 - 13:39 #1
Grundliggende gar nøgler og index ikke meget med hinanden at gøre.

En primær-nøgle er et felt (eller flere felter) som giver en unik identifikation
af en række.

En fremmed-nøgle er et felt (eller flere felter) som peger på en række
i en anden tabel (via dens primær-nøgle).

Det har noget med data at gøre og hvordan man kan join etabeller.

Index har noget at gøre med performance.

Hvis database serveren skal finde en værdi i et felt som ikke
er indekseret er den nødt til at løbe samtlige rækker igennem.

Et index er en lille data struktur der gør at database serveren
kan slå værdier op uden at løbe alle rækker igennem.

Ligesom i en database bog hvor der bagerst kan være et index
som siger "3. normal form - side 127", så man slipper for
at læse 400 sider for at finde 3. normal form.

Der bliver normalt (altid ?) lavet et index for en primær-nøgle.

Det er næsten altid en god ide at lave et index på fremmed-nøgler, fordi
de værdier skal ofte slåe sop i.f.m. JOIN.

Det er også en god ide at have index på felter som man søger meget i.

Og husk at index gør søgning mange gange hurtigere men koster
en lilel smule i insert (og i database plads).
Avatar billede ehv Nybegynder
16. maj 2003 - 19:57 #2
vil det sige at jeg f.eks laver en tabel bruger med et idx1 og en tabel data med idx2.?
ideen jeg ville frem til var noget i stil med:
bruger tabel(
idx1 int  //primær
fornavn char[30]
efternavn char[30])

data tabel(
idx1 int  //fremmed
idx2 int  //primær
datating char [50])

er det måden at joine disse tabeller eller?????
PLEASE jeg kunne virkelig godt bruge et eksempel evt. ved hjælp af ovenstående tabeller.
Avatar billede arne_v Ekspert
16. maj 2003 - 20:06 #3
Ah. Så har jeg vist misforstået dig.

Der er ikke nogen "index" i traditionel forstand der.

Det er bare to felter i tabellen.

Primær og fremmed nøglerne er helt korrekte.

Ja du kan joine de 2 tabeleller med:

SELECT * FROM bruger,data WHERE bruger.idx1=data.idx1;
Avatar billede arne_v Ekspert
16. maj 2003 - 20:08 #4
Jeg vile nok vælge nogle andre felt navne og datatyper:

bruger
------

brugerID - int - primær nøgle
fornavn - varchar(30)
efternavn - varchar(30)

data
----

dataID - int - primær nøgle
brugerID - int - fremmed nøgle
datating - varchar(50)
Avatar billede arne_v Ekspert
16. maj 2003 - 20:09 #5
dataID og brugerID er langt nemmere at læse end idsx1 og idx2.

char(30) er altid 30 tegn lang.

varchar(30) er op til 30 tegn langt.
Avatar billede ehv Nybegynder
16. maj 2003 - 20:18 #6
ahhhhhhhh nu begynder det at give mening.
og ja du har evigt ret med hensyn til datatyperne//fandt bare hurtigt på noget for at komme igang.
et lille bi spørgsmål.
når brugerID er fremmednøgle i datatabellen vil den indsatte værdien fra brugerID i brugertabellen automatisk blive overført som værdi?????
Avatar billede ehv Nybegynder
16. maj 2003 - 20:24 #7
hey Arne_v jeg vil acceptere dit svar men tænkte at jeg lige kunne presse citronen lidt mere, eller koster det ekstra? =)
Avatar billede arne_v Ekspert
16. maj 2003 - 20:27 #8
Den forstår jeg ikke helt.

Når du joiner med bruger.brugerID=data.brugerID så kobler du
bare de rækker der hører sammen i en forespørgsel - du indsætter
ikke noget.

Hvis du er klærer data.brugerID til at være en fremmed nøgle
som peger på bruger brugerID, så vil databasen forhindre dig
i at indsætte brugerID i data tabellen som ikke er i bruger
tabellen.
Avatar billede arne_v Ekspert
16. maj 2003 - 20:28 #9
Man kan godt forvente en hel del hjælp for 100 point.

Og så er jeg ikke typen der stopper med at hjælpe fordi point
er givet.
Avatar billede ehv Nybegynder
16. maj 2003 - 20:39 #10
/*RESPECT der skulle være flere som dig*/
ok jeg er også blevet lidt forvirret, fordi jeg bruger msql og i denne såkalte database har de erstattet brugen af primærnøgler med idx og i manuallen skriver de lidt om brugen af disse men intet om "fremmed idx" giver det mening?
Avatar billede arne_v Ekspert
16. maj 2003 - 20:44 #11
Jeg kender ikke MSQL.

Er det ikke bare felt navnet der er idxn ? Og kan man ikke vælge et andet ?
Avatar billede ehv Nybegynder
16. maj 2003 - 21:03 #12
øh jo comandoen for at oprette et idx er som følger:

bruger
------

brugerID - int - wannabe primær nøgle - bruger_idx
fornavn - varchar(30)
efternavn - varchar(30)

data
----

dataID - int - wannabe primær nøgle - data_idx
brugerID - int - fremmed nøgle -??????????????????
datating - varchar(50)

CREATE UNIQUE INDEX bruger_idx ON bruger (brugerID)
CREATE UNIQUE INDEX data_idx ON bruger (dataID)

skal jeg evt. droppe "fremmed_idx" og joine de to primær_idx....er det måden.?
det skulle gerne munde ud i at hver bruger skal kunne havde et vilkårligt antal
rækker i datatabelen.
Avatar billede arne_v Ekspert
16. maj 2003 - 21:12 #13
Tabellerne oprettes med CREATE TABLE.

De 2 CREATE UNIQUE INDEX laver index i den betydning jeg startede
med at tale.

De er kun nødvendige for performance.

Og burde ikke skulle laves for felter der er erklæret som primær nøgle i
CREATE TABLE.
Avatar billede ehv Nybegynder
16. maj 2003 - 21:21 #14
MSQL har igen nøgler
Avatar billede arne_v Ekspert
16. maj 2003 - 21:23 #15
MSQL har ingen nøgler ?
Avatar billede arne_v Ekspert
16. maj 2003 - 21:24 #16
Så er det næstbedste jo nok at lave et UNIQUE INDEX fordi det
også sikrer uniqueness ligesom en primær nøgle.
Avatar billede arne_v Ekspert
16. maj 2003 - 21:25 #17
Så har vi vist været hele vejen rundt.
Avatar billede ehv Nybegynder
16. maj 2003 - 21:25 #18
hvis jeg igen nøgler har og ikke "skal" bruge idx
hva så.
jeg fatter igen ting.........hvordan kan jeg få to tabeler til at hænge sammen uden brug af noget?
Avatar billede ehv Nybegynder
16. maj 2003 - 21:28 #19
50 point ekstra for et eksempel på to tabeller der hænger sammen ved hjælp af idx
Avatar billede arne_v Ekspert
16. maj 2003 - 21:29 #20
Det gør du bare med din WHERE betingelse.

SELECT * FROM bruger,data WHERE bruger.brugerID=data.brugerID;

virker uanset om der er nøgler eller index.

Så forespørgsler er ikke et problem.

Ved indsæt skal du holde tungen lig i munden fordi databasen ikke
sikrer din referentielle integritet. Men det må du bare slev sørge for så
i din applikation.
Avatar billede arne_v Ekspert
16. maj 2003 - 21:30 #21
Tabeller hænger ikke sammen med index.

Tabeller hænger sammen med felter hvis værdier matcher.

Index gør bare at man kan finde de rigtige værdier hurtigt.
Avatar billede arne_v Ekspert
16. maj 2003 - 21:33 #22
Hvis jeg skal lave et lille eksmepel.

bruger indeholder
1 Lars Larsen
2 Niels Nielsen
3 Jens Jensen

data indeholder:
1 1 a
2 2 b
3 3 c
4 3 d

så vil:

SELECT fornavn,efternavn,data FROM bruger,data WHERE bruger.brugerID=data.brugerID;

returnere:

1 Lars Larsen a
2 Nield Nielsen b
3 Jens Jensen c
3 Jens Jensen d
Avatar billede ehv Nybegynder
16. maj 2003 - 21:49 #23
hey Arne check lige spørgsmål 353498
Avatar billede ehv Nybegynder
17. maj 2003 - 10:43 #24
hej Arne =)
dine eksempler gav mig god inspiration, er det sådan at du også lige har et eksempel på hvordan man indsætter (se kl.21:29:41) jeg er ikke så god til at holde tungen lige i munden.
det jeg har problemmer med er at få brugerID ind i data.
Avatar billede arne_v Ekspert
17. maj 2003 - 11:23 #25
INSERT INTO bruger VALUES (4, 'Ole olsen');
INSERT INTO data VALUES (5, 4, 'e');
Avatar billede arne_v Ekspert
17. maj 2003 - 11:26 #26
Det vigtige er at din applikation skal sørge for at brugerID matcher i de
to INSERT (begge er 4 i mit eksempel).
Avatar billede arne_v Ekspert
17. maj 2003 - 11:27 #27
Hov skal iøvrigt være:

INSERT INTO bruger VALUES (4, 'Ole', 'Olsen');
INSERT INTO data VALUES (5, 4, 'e');

(navn er 2 felter)
Avatar billede ehv Nybegynder
19. maj 2003 - 21:07 #28
kan du hjælpe med noget.? skal indsætte fra mit api.
Avatar billede arne_v Ekspert
19. maj 2003 - 21:31 #29
Du hentyder til http://www.eksperten.dk/spm/354605 ikke ?

Jeg har set det men havde ikke lige umiddelbart nogle gode ideer.
Avatar billede arne_v Ekspert
19. maj 2003 - 21:32 #30
Matcher datatyperne ?  Der skal kun '' omkring varchar felter
ikke omkring integer felter.
Avatar billede ehv Nybegynder
19. maj 2003 - 21:37 #31
den der hedder sequence er en int, hvordan for jeg den ud?
Avatar billede arne_v Ekspert
19. maj 2003 - 21:41 #32
Der skal bare ikke '' omkring den.

Du koder i C ?
Avatar billede ehv Nybegynder
19. maj 2003 - 21:43 #33
jeps
Avatar billede ehv Nybegynder
19. maj 2003 - 21:44 #34
det er ikke '  ' du mener omkring værdierne
Avatar billede arne_v Ekspert
19. maj 2003 - 21:44 #35
result=msqlQuery(sockdb,"insert into indbakke values (123,'frombuff','tobuff','subjectbuff','datebuff','bodybyff')");

skulle nok virke.
Avatar billede arne_v Ekspert
19. maj 2003 - 21:47 #36
Men det du i virkeligheden søger er nok:

int sequence;
char frombuff[100];
char tobuff[100];
char subjectbuff[100];
char datebuff[100];
char bodybuff[1000];
char sql[1000];

/* giv disse værdier */

sprintf(sql,"insert into indbakke values (%d,'%s','%s','%s','%s','%s')",
        sequence,frombuff,tobuff,subjectbuff,datebuff,bodybuff);
result=msqlQuery(sockdb,sql);
Avatar billede ehv Nybegynder
19. maj 2003 - 21:47 #37
det gør den også, problemmet er bare at mit sequence indeholder en dynamisk værdi (en tæller på alle nye insert)
Avatar billede ehv Nybegynder
19. maj 2003 - 21:48 #38
jeg tester lige =)
Avatar billede ehv Nybegynder
20. maj 2003 - 07:54 #39
der se ud til at virke men aligevel ikke. Hvis jeg køre en strace på mit api, kan jeg se at jeg for en forkert størrelse af 'emne', jeg har prøvet at gøre mit felt i databesen unødvendigt stort men for stadig fejlen.
Hvis problemmet bliver løst, gå til spørgsmål 354605 der ligger 100 point.
Avatar billede arne_v Ekspert
20. maj 2003 - 08:49 #40
To spørgsmål:

1)  Er emne blevet erklæret CHAR(n) istedetfor VARCHAR(n) ?

2)  Indeholder emne noget suspekt ?
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