Avatar billede dennism Nybegynder
04. februar 2007 - 17:27 Der er 14 kommentarer og
1 løsning

mySQL: databasestruktur

Jeg har en tabel ved navn "club" som indeholder informationer om nogle klubber. Samtidig har jeg en taben ved navn "news" som indeholder nyheder.
Hver af disse nyheder skal være tilknyttet til 0, 1 eller flere klubber.

Mit umiddelbare forslag, var at jeg lavede en kolonne i news med navnet "clubId", som f.eks. kunne indeholder "345,458".

Dermed er der angivet at nyheden tilhører klub med ID 345 og 458.
Dette vil dog give nogle problemer, hvis vi forestiller os, at vi har en nyhed med clubId="345,458", og vi nu vil finde de nyheder som tilhører klub med ID=45. Dette vil man nok gøre som følger:
SELECT * FROM news WHERE clubId LIKE "%45%"

Der vil vi jo få nyheder med clubId="345,458" som svar, selvom den kun tilhører 345.

Hvordan kunne man løse dette? Skal det laves på en anden måde?
Avatar billede pidgeot Nybegynder
04. februar 2007 - 17:29 #1
Da det er en mange-til mange relation, bør du lave en seperat relationstabel til dit clubId, og så have en række pr. nyhed/clubId-kombination. Det andet ville kræve en meget lang og træls SQL-sætning.
Avatar billede dennism Nybegynder
04. februar 2007 - 17:40 #2
Dvs. at jeg bør lave en tabel som f.eks. hedder newsClubRelations, som f.eks. har disse kolonner:

- id
- newsId
- clubId

Når jeg så ønsker at finde nyheder som tilhører klubben med ID=45, gør jeg istedet:
SELECT newsID FROM newsClubRelations WHERE clubId=45;

Håber det er korrekt forstået?
Avatar billede pidgeot Nybegynder
04. februar 2007 - 17:50 #3
Næsten - du skal ikke have en seperat id-kolonne med. I stedet skal du lade begge felter udgøre din primary key.
Avatar billede dennism Nybegynder
04. februar 2007 - 17:53 #4
Dvs.:

CREATE TABLE newsClubRelations (
    newsId INT(11) PRIMARY KEY,
        clubId INT(11) PRIMARY KEY);

Så betyder det, at man ikke kan have en række med samme newsId og clubId?
Avatar billede dennism Nybegynder
04. februar 2007 - 18:01 #5
Lige en ting mere: disse nyheder har både mange-til mange relation med tabellen clubs og regions.
Vil det være mest fornuftigt at lave en tabel til både newsClubRelations og newsRegionrelations, eller skal jeg bare lave newsRelations med både clubId og RegionId, hvor den der ikke bruges har værdien 0?
Avatar billede pidgeot Nybegynder
04. februar 2007 - 18:01 #6
Jo, sagtens - de udgør i fællesskab din primærnøgle, hvilket har den effekt at der kun kan være en række for hver kombination af newsId og clubId.

Den rigtige query er i øvrigt:
CREATE TABLE newsClubRelations (
  newsId int(11),
  clubId int(11),
  PRIMARY KEY  (newsId,clubId)
)
da man ikke kan bruge den der korte notation til angivelse af primary key når der er flere kolonner.

Da jeg kunne forestille mig du ofte laver en søgning med clubId som kriterie, bør du overveje at lave et seperat indeks for denne, da dette vil tillade MySQL at finde de nødvendige data hurtigere.
Avatar billede pidgeot Nybegynder
04. februar 2007 - 18:03 #7
Du skal lave to seperate tabeller til den relation du beskriver.
Avatar billede dennism Nybegynder
04. februar 2007 - 18:19 #8
Tusind tak for dit svar. Jeg kan i min CREATE TABLE-statement angive at der skal laves index over clubId?
Avatar billede pidgeot Nybegynder
04. februar 2007 - 18:21 #9
Sagtens:
CREATE TABLE newsClubRelations (
  newsId int(11),
  clubId int(11),
  PRIMARY KEY (newsId,clubId),
  KEY (clubId)
)
Avatar billede dennism Nybegynder
04. februar 2007 - 18:23 #10
Du mener:

CREATE TABLE newsClubRelations (
  newsId int(11),
  clubId int(11),
  PRIMARY KEY (newsId,clubId),
  INDEX (clubId)
)

ik?
Avatar billede pidgeot Nybegynder
04. februar 2007 - 18:25 #11
Det gør jeg også - INDEX og KEY har samme betydning i den situation (http://dev.mysql.com/doc/refman/5.0/en/create-table.html) ;)
Avatar billede dennism Nybegynder
04. februar 2007 - 19:27 #12
Jeg kan ikke helt gennemskue, hvorfor de har samme betydning? Bør jeg ikke bruge index istedet for key?
Avatar billede pidgeot Nybegynder
04. februar 2007 - 20:58 #13
Det har samme betydning fordi syntaksen angiver at man har frit valg for om man vil skrive KEY eller om man vil skrive INDEX. Det står alt sammen på den side jeg linkede til.
Avatar billede dennism Nybegynder
05. februar 2007 - 08:08 #14
Tak. Smider du lige et svar her?
Avatar billede dennism Nybegynder
05. februar 2007 - 10:41 #15
Hov, det havde du gjort ;)
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