sql >> Database teknologi >  >> RDS >> Mysql

Korrekt måde at opsætte MYSQL-database til relaterede tagsøgninger?

Bare adskil dine dataenheder efter, hvad de er, og hvad de betyder. For title , tags og file det lyder som om du har to entiteter:

Picture
----------
ID
Title
File

Tag
----------
ID
Name

Det vil sige title og file (i dit tilfælde gætter jeg på, at du gemmer det som stien til filen på filsystemet, hvilket er fint) er én enhed og et tag er sin egen separate enhed. Siden hvert Picture kan have flere tag s og hvert tag kan relatere til flere Picture s, det er et mange-til-mange forhold. Så man ville generelt oprette en understøttende ikke-entitetstabel for at forbinde dem i databasen:

PictureTagRelationship
----------
PictureID
TagID

Med dette kan du få et Picture :

SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id

og dens tags:

SELECT Tag.ID, Tag.Name FROM Tag
INNER JOIN PictureTagRelationship ON Tag.ID = PictureTagRelationship.TagID
WHERE PictureTagRelationship.PictureID = ?id

(Du kan også gøre det i en enkelt forespørgsel på et par måder, jeg deler det bare i to for nemheds skyld. To forespørgsler burde ikke være en stor sag, men hvis du har brug for at optimere din databaseadgang overhead, eller hvis du virkelig ønsker, at det skal være en enkelt forespørgsel, så er jeg sikker på, at noget kan gøres.)

Eller du kan få alle billederne til et bestemt tag:

SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id

Der er andre tweaks, der kan laves til dette design og masser af andre måder at se og rapportere om dataene på. Men i alt dette er et nøglepunkt:

Brug ikke kommaseparerede lister til at gemme data. Normaliser hver dataentitet til sin egen struktur og gem den i overensstemmelse hermed. Relationelle databaser er gode til den slags. Men hver gang du gemmer separate dataelementer som en afgrænset streng, mister du denne adskillelse af disse elementer. Dette gør det sværere at rapportere om disse data, sværere at interagere med dem, masse vanskeligere at opdatere det, og mindre intuitivt for alle andre, der har brug for at støtte det.

Bare husk, at et hvilket som helst felt i databasen skal gemme én enkelt information og kun én oplysning. Hvis du skal proppe flere stykker information ind i et enkelt felt, bruger du ikke relationsdatabasen korrekt.




  1. Sådan importeres en Heroku PG-dump til lokal maskine

  2. MySQL-fejl:SELECT-listen er ikke i GROUP BY-sætning

  3. Jeg droppede general_log-tabellen, hvordan opretter jeg den igen?

  4. Hvordan kopierer jeg SQL Azure-databasen til min lokale udviklingsserver?