Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Korrekte Methode zum Einrichten einer MYSQL-Datenbank für die Suche nach verwandten Tags?

Trennen Sie einfach Ihre Datenentitäten danach, was sie sind und was sie bedeuten. Für title , tags und file Es hört sich so an, als hätten Sie zwei Entitäten:

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

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

Das heißt, der title und die file (in Ihrem Fall speichern Sie das wohl als Pfad zur Datei im Dateisystem, was in Ordnung ist) sind eine Entität und ein tag ist eine eigene separate Einheit. Da jedes Picture kann mehrere tags haben s und jedes tag kann sich auf mehrere Picture beziehen s, es ist eine viele-zu-viele-Beziehung. Daher würde man im Allgemeinen eine unterstützende Nicht-Entitätstabelle erstellen, um sie in der Datenbank zu verknüpfen:

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

Damit können Sie ein Picture erhalten :

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

und seine Tags:

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

(Sie können das auch in einer einzigen Abfrage auf verschiedene Arten tun, ich habe sie der Einfachheit halber in zwei aufgeteilt. Zwei Abfragen sollten keine große Sache sein, aber wenn Sie Ihren Datenbankzugriffsaufwand stark optimieren müssen oder wenn Sie wirklich möchte, dass es eine einzige Abfrage ist, dann bin ich sicher, dass etwas getan werden kann.)

Oder Sie können alle Bilder für ein bestimmtes Tag abrufen:

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

Es gibt weitere Optimierungen, die an diesem Design vorgenommen werden können, und viele andere Möglichkeiten, die Daten anzuzeigen und zu melden. Aber bei all dem ist ein wichtiger Punkt:

Verwenden Sie keine durch Kommas getrennten Listen, um Daten zu speichern. Normalisieren Sie jede Datenentität in ihre eigene Struktur und speichern Sie sie entsprechend. Relationale Datenbanken eignen sich hervorragend für solche Dinge. Aber jedes Mal, wenn Sie separate Datenelemente als Zeichenfolge mit Trennzeichen speichern, verlieren Sie diese Trennung dieser Elemente. Das macht es schwieriger, Berichte über diese Daten zu erstellen, viel schwieriger damit zu interagieren, sehr schwieriger zu aktualisieren und weniger intuitiv für alle anderen, die es unterstützen müssen.

Denken Sie nur daran, dass jedes Feld in der Datenbank eine Information und nur speichern sollte eine Information. Wenn Sie mehrere Informationen in ein einziges Feld packen müssen, verwenden Sie die relationale Datenbank nicht richtig.