/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL relations problemstilling
Fra : David Lebech


Dato : 20-09-04 23:35

Jeg har følgende problemstilling:
En hjemmeside skal vise holdlister for gymnastikhold fra de sidste 40 år.
Hvis en person optræder over flere årgange skal disse kun have én entry i
databasen, men personen skal selvfølgelig stå på samtlige holdlister
svarende til de år vedkommende har gået på holdet.

Mangel på bedre viden har fået mig til at ty til den simple men
problematiske metode: Jeg har oprettet en entry for hver enkelt person for
hver årgang de har gået på et hold. Altså hvis en person har gået på holdet
10 år er der 10 entries med samme oplysninger om personen bare med
forskellig årgang.

Heri ligger der et klokkeklart problem, hvis oplysningerne skal ændres for
en person, da man skal rette alle entries for vedkommende, og desuden har
jeg forstået, at det generelt er en uskik med redundants.

MEN: Jeg har INGEN anelse om, hvordan jeg kan løse problemet. Jeg har
undersøgt mulighederne for relationer mellem databaser, de forskellige joins
osv., men jeg er ikke blevet meget klogere. Jeg havde forestillet mig, at
man kunne have to tabeller, "navne" og "aargange" f.eks. Her kunne man så
relatere et navn til hver af de årgange, vedkommende har gået på holdet.

Her kommer spørgsmålet: Kan ovenstående overhovedet lade sig gøre? Kan
tabeller ikke kun relatere mellem to felter, og skal felterne ikke have
samme værdi, når man relaterer dem som f.eks. mellem navne.id og
aargange.id?

Jeg er stadig newbie inden for DB, så jeg håber, at der findes en
forholdsvis simpel løsning. Ellers må jeg fortsætte, som jeg gør.

Hvis du har læst så langt som hertil så på forhånd tak for hjælpen! :)

Mvh
David Lebech



 
 
Troels Arvin (21-09-2004)
Kommentar
Fra : Troels Arvin


Dato : 21-09-04 00:14

On Tue, 21 Sep 2004 00:34:31 +0200, David Lebech wrote:

> En hjemmeside skal vise holdlister for gymnastikhold fra de sidste 40 år.
> Hvis en person optræder over flere årgange skal disse kun have én entry
> i databasen, men personen skal selvfølgelig stå på samtlige holdlister
> svarende til de år vedkommende har gået på holdet.

Én løsning kunne fx være:

medlem (
medlemsnr INT NOT NULL PRIMARY KEY,
navn VARCHAR(60) NOT NULL,
foedt DATE
)

aar_medlem (
aar INT NOT NULL CHECK(aar>1950 AND aar<2200),
medlemsnr INT NOT NULL REFERENCES medlem,
PRIMARY KEY(aar,medlemsnr)
)

(MySQL understøtter ikke CHECK-constraints, så de skal fjernes fra
ovenstående; kun medtaget som eksempel på, hvad man kunne gøre, hvis
man ville sikre sig lidt mod slåfejl.)

Du kan da fx. forestille dig, at person indeholder:

medlemsnr navn foedt
--------- ---- -----
324 Ebba Nielsen 1945-03-14
7340 Mogens Jensen 1970-08-25
8490 Preben Mogensen 1967-05-01
... ... ...

Og aar_medlem kan indeholde:

aar medlemsnr
---- ---------
1970 324
2000 324
2000 8490
2000 7340
2001 8490
2001 7340

Alternativt kan du i aar_medlem gemme tidsperioder:

aar_medlem (
aar_start INT NOT NULL CHECK(aar>1950 AND aar<2200),
aar_slut INT NOT NULL CHECK(aar<2200 AND aar_slut>=aar_start),
medlemsnr INT NOT NULL REFERENCES person,
PRIMARY KEY(aar_start,aar_slut,medlemsnr)
)

(I start-slut modellen kunne det være rart med et DBMS, der understøtter
"assertions" for tabeller, men det er der p.t. ingen, der gør. Med en
passende tabel-assertion kunne man sikre sig imod overlappende
medlemsperioder for et givent medlem, hvis man ønskede dette.)

For at udtrække de ønskede informationer kunne du - med brug af første
udgave af aar_medlem udføre følgende, udføre følgende, eller en
variant over den:

SELECT * FROM
aar_medlem
JOIN
medlem
USING (medlemsnr)
ORDER BY aar;

--
Greetings from Troels Arvin, Copenhagen, Denmark


David Lebech (22-09-2004)
Kommentar
Fra : David Lebech


Dato : 22-09-04 11:37

Tak for svaret. Jeg har yderligere snakket med en kammerat, og jeg er ved at
have en ide om, hvad jeg skal gøre.

Mvh
David Lebech

"Troels Arvin" <troels@arvin.dk> skrev i en meddelelse
news:pan.2004.09.20.23.13.57.418279@arvin.dk...
> On Tue, 21 Sep 2004 00:34:31 +0200, David Lebech wrote:
>
>> En hjemmeside skal vise holdlister for gymnastikhold fra de sidste 40 år.
>> Hvis en person optræder over flere årgange skal disse kun have én entry
>> i databasen, men personen skal selvfølgelig stå på samtlige holdlister
>> svarende til de år vedkommende har gået på holdet.
>
> Én løsning kunne fx være:
>
> medlem (
> medlemsnr INT NOT NULL PRIMARY KEY,
> navn VARCHAR(60) NOT NULL,
> foedt DATE
> )
>
> aar_medlem (
> aar INT NOT NULL CHECK(aar>1950 AND aar<2200),
> medlemsnr INT NOT NULL REFERENCES medlem,
> PRIMARY KEY(aar,medlemsnr)
> )
>
> (MySQL understøtter ikke CHECK-constraints, så de skal fjernes fra
> ovenstående; kun medtaget som eksempel på, hvad man kunne gøre, hvis
> man ville sikre sig lidt mod slåfejl.)
>
> Du kan da fx. forestille dig, at person indeholder:
>
> medlemsnr navn foedt
> --------- ---- -----
> 324 Ebba Nielsen 1945-03-14
> 7340 Mogens Jensen 1970-08-25
> 8490 Preben Mogensen 1967-05-01
> ... ... ...
>
> Og aar_medlem kan indeholde:
>
> aar medlemsnr
> ---- ---------
> 1970 324
> 2000 324
> 2000 8490
> 2000 7340
> 2001 8490
> 2001 7340
>
> Alternativt kan du i aar_medlem gemme tidsperioder:
>
> aar_medlem (
> aar_start INT NOT NULL CHECK(aar>1950 AND aar<2200),
> aar_slut INT NOT NULL CHECK(aar<2200 AND aar_slut>=aar_start),
> medlemsnr INT NOT NULL REFERENCES person,
> PRIMARY KEY(aar_start,aar_slut,medlemsnr)
> )
>
> (I start-slut modellen kunne det være rart med et DBMS, der understøtter
> "assertions" for tabeller, men det er der p.t. ingen, der gør. Med en
> passende tabel-assertion kunne man sikre sig imod overlappende
> medlemsperioder for et givent medlem, hvis man ønskede dette.)
>
> For at udtrække de ønskede informationer kunne du - med brug af første
> udgave af aar_medlem udføre følgende, udføre følgende, eller en
> variant over den:
>
> SELECT * FROM
> aar_medlem
> JOIN
> medlem
> USING (medlemsnr)
> ORDER BY aar;
>
> --
> Greetings from Troels Arvin, Copenhagen, Denmark
>



Søg
Reklame
Statistik
Spørgsmål : 177514
Tips : 31968
Nyheder : 719565
Indlæg : 6408618
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste