Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment configurer correctement la base de données MYSQL pour les recherches de balises associées ?

Séparez simplement vos entités de données par ce qu'elles sont et ce qu'elles signifient. Pour title , tags et file il semble que vous ayez deux entités :

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

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

Autrement dit, le title et le file (dans votre cas, je suppose que vous stockez cela comme chemin d'accès au fichier sur le système de fichiers, ce qui est bien) sont une entité et une balise tag est sa propre entité distincte. Depuis chaque Picture peut avoir plusieurs tag s et chaque tag peut concerner plusieurs Picture s, c'est une relation plusieurs à plusieurs. Ainsi, on créerait généralement une table de non-entité de support pour les lier dans la base de données :

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

Avec cela, vous pouvez obtenir une Picture :

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

et ses balises :

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

(Vous pouvez également le faire en une seule requête de plusieurs manières, je l'ai simplement divisée en deux pour plus de simplicité. Deux requêtes ne devraient pas être un gros problème, mais si vous avez besoin d'optimiser fortement votre surcharge d'accès à la base de données ou si vous Je veux vraiment qu'il s'agisse d'une seule requête, alors je suis sûr que quelque chose peut être fait.)

Ou vous pouvez obtenir toutes les images pour un tag spécifique :

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

Il existe d'autres ajustements qui peuvent être apportés à cette conception et de nombreuses autres façons d'afficher et de générer des rapports sur les données. Mais dans tout cela, il y a un point clé :

N'utilisez pas de listes délimitées par des virgules pour stocker des données. Normalisez chaque entité de données dans sa propre structure et stockez-la en conséquence. Les bases de données relationnelles sont idéales pour ce genre de choses. Mais chaque fois que vous stockez des éléments de données séparés sous forme de chaîne délimitée, vous perdez cette séparation de ces éléments. Cela rend plus difficile la création de rapports sur ces données, plus difficile d'interagir avec elles, beaucoup plus difficile à mettre à jour et moins intuitif pour quiconque a besoin de le prendre en charge.

N'oubliez pas que n'importe quel champ de la base de données doit stocker une seule information et seulement une seule information. Si vous devez regrouper plusieurs informations dans un seul champ, vous n'utilisez pas correctement la base de données relationnelle.