sql >> Databasteknik >  >> RDS >> Mysql

Korrekt sätt att ställa in MYSQL-databas för relaterade taggsökningar?

Separera bara dina dataenheter efter vad de är och vad de betyder. För title , tags och file det låter som att du har två enheter:

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

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

Det vill säga title och file (i ditt fall antar jag att du lagrar det som sökvägen till filen i filsystemet, vilket är bra) är en enhet och en tag är sin egen separata enhet. Sedan varje Picture kan ha flera tags s och varje tag kan relatera till flera Picture s, det är ett många-till-många-förhållande. Så man skulle i allmänhet skapa en stödjande icke-entitetstabell för att länka dem i databasen:

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

Med detta kan du få en Picture :

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

och dess taggar:

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

(Du kan göra det i en enda fråga på ett par sätt också, jag delar bara upp det i två för enkelhetens skull. Två frågor borde inte vara en stor sak, men om du behöver optimera din databasåtkomst overhead eller om du vill verkligen att det ska vara en enda fråga så är jag säker på att något kan göras.)

Eller så kan du få alla bilder för en specifik tagg:

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

Det finns andra justeringar som kan göras för denna design och många andra sätt att visa och rapportera om data. Men i allt detta är en viktig punkt:

Använd inte kommaavgränsade listor för att lagra data. Normalisera varje dataenhet till sin egen struktur och lagra den därefter. Relationsdatabaser är bra för sånt. Men varje gång du lagrar separata dataelement som en avgränsad sträng, förlorar du separationen av dessa element. Detta gör det svårare att rapportera om den datan, svårare att interagera med den, mycket svårare att uppdatera det och mindre intuitivt för alla andra som behöver stödja det.

Kom bara ihåg att vilket fält som helst i databasen bör lagra en del information och endast en bit information. Om du måste klämma in flera bitar av information i ett enda fält använder du inte relationsdatabasen på rätt sätt.




  1. Fulltextsökning på mysql med ett ord på tre bokstäver

  2. När ska man använda MongoDB

  3. Hur undkommer jag % i Knex where like-fråga?

  4. Tabellen är "skrivskyddad"