2009-08-25 9 views
9

J'ai une application Web existante et je souhaite ajouter une fonctionnalité d'étiquette afin que les utilisateurs puissent marquer des objets existants. La question est est-ce que je devrais ajouter une étiquette à chaque objet? ou devrais-je le normaliser et utiliser une table d'étiquettes où chaque objet aura une collection d'étiquettes? Je penche pour ce dernier car il se sent plus propre, plus facile à rapporter et plus facile à créer un nuage de tags. Mais depuis que je sais que cela a été résolu 1000 fois, je voulais demander et voir si quelque chose me manque?Comment modéliser des tags dans la base de données?

Répondre

6

Prévoyez-vous que les utilisateurs doivent associer plus d'un tag à un objet?

Si pas, ajoutez le TAG_ID fk à la table OBJECT. Sinon, vous auriez besoin de trois tables au total pour modéliser correctement plusieurs-à-plusieurs:

OBJET

  • OBJECT_ID (pk)

OBJECT_TAG_XREF

  • OBJECT_ID (pk, fk à OBJECT)
  • TAG_ID (pk, fk à TAG)

TAG

  • tag_id (pk)
+0

Comment serait ce changement pour attacher des balises aux utilisateurs? Est-ce que OBJECT_ID deviendrait USER_ID? –

+1

@JuniperAsh: Vous devez ajouter une colonne 'user_id' à' OBJECT_TAG_XREF' - identique aux deux autres colonnes, clé primaire et clé étrangère de la table des utilisateurs. –

+0

Donne beaucoup plus de sens! Je vous remercie! –

4

Oui, vous devriez le normaliser. La 'colonne d'étiquette' va soit ne supporter qu'une seule étiquette par enregistrement, soit va avoir des performances de recherche hideuses.

2

Definitivement normaliser. Une table pour les tags, une table pour vos objets existants et une table de liens entre eux.