150 votes

Quel est le moyen le plus efficace de stocker des étiquettes dans une base de données ?

Je suis en train de mettre en place un système de balisage sur mon site web similaire à celui utilisé par stackoverflow. Ma question est la suivante : quel est le moyen le plus efficace de stocker les balises afin qu'elles puissent être recherchées et filtrées ?

Mon idée est la suivante :

Table: Items
Columns: Item_ID, Title, Content

Table: Tags
Columns: Title, Item_ID

Est-ce trop lent ? Existe-t-il un meilleur moyen ?

3 votes

Question précédente : stackoverflow.com/questions/20856/

2 votes

À partir de 2016, utilisez Solr ou Elasticsearch.

208voto

Simon Scarfe Points 2831

Un article peut avoir plusieurs étiquettes. Et une étiquette appartiendra à plusieurs articles. Cela implique que vous aurez probablement besoin d'une table intermédiaire pour surmonter l'obstacle many-to-many.

Quelque chose comme :

La table : Articles
Colonnes : Item_ID, Item_Title, Content

Table : Tags
Colonnes : Tag_ID, Tag_Title

La table : Items_Tags
Colonnes : Item_ID, Tag_ID

Il se peut que votre application web soit très très populaire et qu'il faille la dé-normaliser un jour, mais il est inutile de brouiller les pistes trop tôt.

1 votes

0 votes

S'il y a quelque chose comme tagGroup comment le gérer, par exemple les tags sont regroupés en catégories, par exemple : Langages de programmation : c#, vb, pearl. Système d'exploitation : windows7, dos, linux, etc.

4 votes

@Thunder : en supposant qu'une étiquette ne peut appartenir qu'à une seule catégorie, je créerais une table TagCategory composée de category_id et category_name. À partir de là, j'ajouterais un champ category_id à la table Tags et j'effectuerais une jointure sur cette table.

108voto

Rob Kennedy Points 107381

Vous devriez lire les articles du blog de Philipp Keller sur le balisage des schémas de base de données. Il en essaie quelques-uns et présente ses résultats, à la fois dans en termes de facilité de construction de requêtes communes y en termes de performance . Le nombre de tags, le nombre d'articles tagués et le nombre de tags par article sont autant de facteurs. Les articles datent de 2005 ; je n'ai pas connaissance de mises à jour depuis.

15voto

Neil Barnwell Points 20731

En fait, je pense que la dé-normalisation de la table des tags pourrait être une meilleure solution, en fonction de l'échelle.

De cette façon, la table des tags contient simplement tagid, itemid, tagname.

Vous obtiendrez des noms de domaine en double, mais cela permet d'ajouter/supprimer/modifier des étiquettes pour des éléments spécifiques de manière BEAUCOUP plus simple. Il n'est pas nécessaire de créer un nouveau tag, de supprimer l'allocation de l'ancien et d'en réallouer un nouveau, il suffit de modifier le tagname.

Pour afficher une liste de balises, il suffit d'utiliser DISTINCT ou GROUP BY, et bien sûr, vous pouvez aussi facilement compter le nombre de fois qu'une balise est utilisée.

2voto

Mr. Brownstone Points 3692

Vous ne pouvez pas vraiment parler de lenteur sur la base des données que vous avez fournies dans une question. Et je ne pense pas que vous devriez trop vous soucier des performances à ce stade du développement. Cela s'appelle optimisation prématurée .

Cependant, je vous suggère d'inclure la colonne Tag_ID dans la table des étiquettes. C'est généralement une bonne pratique que chaque table ait une colonne ID.

2voto

Valentin Vasilyev Points 6370

Je suggère d'utiliser une troisième table intermédiaire pour stocker les associations tags<=>items, puisque nous avons des relations many-to-many entre les tags et les items, c'est-à-dire qu'un item peut être associé à plusieurs tags et un tag peut être associé à plusieurs items. HTH, Valve.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X