sql >> Database >  >> RDS >> Mysql

Correcte manier om MYSQL-database in te stellen voor zoekopdrachten op gerelateerde tags?

Scheid uw gegevensentiteiten gewoon van elkaar door wat ze zijn en wat ze betekenen. Voor title , tags en file het klinkt alsof je twee entiteiten hebt:

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

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

Dat wil zeggen, de title en het file (in jouw geval denk ik dat je dat opslaat als het pad naar het bestand op het bestandssysteem, wat prima is) één entiteit zijn en een tag is zijn eigen afzonderlijke entiteit. Sinds elke Picture kan meerdere tag hebben s en elke tag kan betrekking hebben op meerdere Picture s, het is een veel-op-veel-relatie. Over het algemeen zou men dus een ondersteunende niet-entiteitstabel maken om ze in de database te koppelen:

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

Hiermee kun je een Picture . krijgen :

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

en zijn tags:

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

(Je kunt dat ook op een aantal manieren in een enkele query doen, ik heb het voor de eenvoud in tweeën gesplitst. Twee query's zouden geen probleem moeten zijn, maar als je de overhead van je databasetoegang sterk moet optimaliseren of als je als je echt wilt dat het een enkele vraag is, dan weet ik zeker dat er iets aan gedaan kan worden.)

Of je kunt alle foto's voor een specifieke tag krijgen:

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

Er zijn nog andere aanpassingen aan dit ontwerp en tal van andere manieren om de gegevens te bekijken en erover te rapporteren. Maar bij dit alles is één belangrijk punt:

Gebruik geen door komma's gescheiden lijsten om gegevens op te slaan. Normaliseer elke gegevensentiteit in zijn eigen structuur en sla deze dienovereenkomstig op. Relationele databases zijn geweldig voor dat soort dingen. Maar elke keer dat u afzonderlijke gegevenselementen opslaat als een begrensde tekenreeks, verliest u die scheiding van die elementen. Dit maakt het moeilijker om over die gegevens te rapporteren, moeilijker om ermee te communiceren, een veel moeilijker om het bij te werken en minder intuïtief voor iemand anders die het moet ondersteunen.

Onthoud dat elk veld in de database één stukje informatie zou moeten bevatten en alleen een stukje informatie. Als u meerdere stukjes informatie in een enkel veld moet proppen, gebruikt u de relationele database niet goed.




  1. Functie maken via MySQLdb

  2. Evolutie van fouttolerantie in PostgreSQL:tijdreizen

  3. Is het in MySQL mogelijk om meer dan 1024 tekens terug te krijgen van GROUP_CONCAT

  4. Een Microsoft Access-rapport naar PDF converteren (3 manieren)