sql >> Base de Datos >  >> RDS >> Mysql

¿La forma correcta de configurar la base de datos MYSQL para búsquedas de etiquetas relacionadas?

Simplemente separe sus entidades de datos por lo que son y lo que significan. Para title , tags y file parece que tienes dos entidades:

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

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

Es decir, el title y el file (en su caso, supongo que está almacenando eso como la ruta al archivo en el sistema de archivos, lo cual está bien) son una entidad y una tag es su propia entidad separada. Dado que cada Picture puede tener múltiples tag s y cada tag puede relacionarse con múltiples Picture s, es una relación de muchos a muchos. Por lo tanto, generalmente se crearía una tabla de soporte que no sea de entidad para vincularlos en la base de datos:

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

Con esto, puedes obtener una Picture :

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

y sus etiquetas:

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

(También puede hacer eso en una sola consulta de varias maneras, solo lo dividí en dos para simplificar. Dos consultas no deberían ser un gran problema, pero si necesita optimizar mucho la sobrecarga de acceso a su base de datos o si realmente quiero que sea una sola consulta, entonces estoy seguro de que se puede hacer algo).

O puede obtener todas las imágenes para una etiqueta específica:

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

Hay otros ajustes que se pueden hacer a este diseño y muchas otras formas de ver e informar sobre los datos. Pero en todo esto hay un punto clave:

No utilice listas delimitadas por comas para almacenar datos. Normalice cada entidad de datos en su propia estructura y almacénela en consecuencia. Las bases de datos relacionales son excelentes para ese tipo de cosas. Pero cada vez que almacena elementos de datos separados como una cadena delimitada, pierde esa separación de esos elementos. Esto hace que sea más difícil informar sobre esos datos, más difícil interactuar con ellos, mucho más difícil actualizarlo y menos intuitivo para cualquier otra persona que necesite soporte.

Solo recuerde que cualquier campo en la base de datos debe almacenar una pieza de información y solo una pieza de información. Si tiene que incluir varias piezas de información en un solo campo, entonces no está utilizando la base de datos relacional correctamente.