04. februar 2007 - 17:27Der 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?
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.
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?
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.
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.
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.