Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Maneira correta de configurar o banco de dados MYSQL para pesquisas de tags relacionadas?


Apenas separe suas entidades de dados pelo que são e pelo que significam. Para title , tags e file parece que você tem duas entidades:
Picture
----------
ID
Title
File

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

Ou seja, o title e o file (no seu caso, acho que você está armazenando isso como o caminho para o arquivo no sistema de arquivos, o que é bom) são uma entidade e uma tag é sua própria entidade separada. Como cada Picture pode ter várias tag se cada tag pode se relacionar a várias Picture s, é uma relação de muitos para muitos. Portanto, geralmente se cria uma tabela de não entidade de suporte para vinculá-los no banco de dados:
PictureTagRelationship
----------
PictureID
TagID

Com isso, você pode obter uma Picture :
SELECT Picture.Title, Picture.File FROM Picture WHERE Picture.ID = ?id

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

(Você também pode fazer isso em uma única consulta de duas maneiras, eu apenas a divido em duas para simplificar. Duas consultas não devem ser um grande problema, mas se você precisar otimizar muito a sobrecarga de acesso ao banco de dados ou se você realmente quer que seja uma única consulta, tenho certeza de que algo pode ser feito.)

Ou você pode obter todas as fotos para uma tag específica:
SELECT Picture.ID, Picture.Title, Picture.File FROM Picture
INNER JOIN PictureTagRelationship ON Picture.ID = PictureTagRelationship.PictureID
WHERE PictureTagRelationship.TagID = ?id

Existem outros ajustes que podem ser feitos neste design e muitas outras maneiras de visualizar e relatar os dados. Mas em tudo isso há um ponto-chave:

Não use listas delimitadas por vírgulas para armazenar dados. Normalize cada entidade de dados em sua própria estrutura e armazene-a de acordo. Bancos de dados relacionais são ótimos para esse tipo de coisa. Mas sempre que você armazena elementos de dados separados como uma string delimitada, você perde essa separação desses elementos. Isso torna mais difícil relatar esses dados, mais difícil interagir com eles, muito mais difícil de atualizá-lo e menos intuitivo para qualquer outra pessoa que precise apoiá-lo.

Apenas lembre-se de que qualquer campo no banco de dados deve armazenar uma informação e somente um pedaço de informação. Se você precisar amontoar várias informações em um único campo, não estará usando o banco de dados relacional corretamente.