2010-08-22 11 views
7

J'ai une base de données qui contient deux tables:Le meilleur moyen de stocker des tags dans une base de données?

  • entrées
  • balises

Le tableau des entrées contient les messages qui ont chacun une ou plusieurs balises. Le problème est, chaque poste peut avoir n'importe quel nombre de balises. En d'autres termes, je ne peux pas avoir une colonne 'tag1', 'tag2', etc. et faire un LEFT JOIN.

Comment est-ce que je devrais établir des entrées de sorte que chaque publication puisse avoir n'importe quel nombre d'étiquettes?

Répondre

11

Vous avez besoin d'une table de correspondance.

Créez une table appelée entries_tags qui contient deux colonnes: entry_id et tag_id, avec une touche multiple sur les deux entrées. Ceci est appelé une relation plusieurs-à-plusieurs .

+0

Oui, et assurez-vous qu'aucune entrée n'a une étiquette en double. La mise à jour de la balise sera un peu délicate car vous devez vous assurer que les balises existantes restent, que de nouvelles sont ajoutées, que les balises supprimées sont supprimées. Bien sûr, vous pouvez toujours supprimer tout et ensuite les ajouter à nouveau pour vous éviter la peine de comparer. Avantages et inconvénients, je dirais. –

+1

@ o.k.w: Vous pouvez gérer tous ces problèmes via des contraintes de clé étrangère et des mises à jour transactionnelles. – Borealid

+0

@ o.k.w: De plus, une clé primaire (préférable) ou une contrainte unique sur les deux colonnes assurerait l'unicité par combinaison. –

3

Vous pouvez aussi le faire le SO à sens unique, où en plus de ayant une jonction/cartographie/table d'intersection, vous avez une liste des balises sur l'entrée qui est tagable:

entries table: 
post_id: 3539744, .... tags: sql, database, database-design, tags, data-modeling 

Si vous ne peut pas prendre le coup de performance de l'utilisation d'une table de jonction en tirant les balises associées pour une entrée. Bien sûr, il faut faire très attention car il s'agit de données dénormalisées.