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

Il modo corretto per impostare il database MySQL per le ricerche di tag correlati?

Separa le tue entità di dati in base a cosa sono e cosa significano. Per title , tags e file sembra che tu abbia due entità:

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

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

Cioè, il title e il file (nel tuo caso immagino che lo stai memorizzando come percorso del file sul file system, il che va bene) sono un'entità e un tags è la propria entità separata. Poiché ogni Picture può avere più tags se ogni tags può riguardare più Picture s, è una relazione molti-a-molti. Quindi si creerebbe generalmente una tabella di non entità di supporto per collegarli al database:

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

Con questo, puoi ottenere un Picture :

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

e i suoi tag:

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

(Puoi farlo anche in una singola query in un paio di modi, l'ho semplicemente diviso in due per semplicità. Due query non dovrebbero essere un grosso problema, ma se hai bisogno di ottimizzare notevolmente il sovraccarico di accesso al database o se voglio davvero che sia una singola query, quindi sono sicuro che si può fare qualcosa.)

Oppure puoi ottenere tutte le immagini per un tag specifico:

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

Ci sono altre modifiche che possono essere apportate a questo design e molti altri modi per visualizzare e segnalare i dati. Ma in tutto questo c'è un punto chiave:

Non utilizzare elenchi delimitati da virgole per archiviare i dati. Normalizza ogni entità di dati nella propria struttura e archiviala di conseguenza. I database relazionali sono ottimi per questo genere di cose. Ma ogni volta che memorizzi elementi di dati separati come una stringa delimitata, perdi quella separazione di quegli elementi. Questo rende più difficile riportare su quei dati, più difficile interagire con essi, molto molto più difficile aggiornarlo e meno intuitivo per chiunque altro abbia bisogno di supportarlo.

Ricorda solo che qualsiasi campo nel database dovrebbe memorizzare un'informazione e solo un'informazione. Se devi stipare più informazioni in un unico campo, non stai utilizzando correttamente il database relazionale.