J'implémente 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 des 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? Y a-t-il un meilleur moyen?
database
database-design
tags
tagging
Logan Serman
la source
la source
Réponses:
Un élément aura plusieurs balises. Et une balise appartiendra à de nombreux articles. Cela implique pour moi que vous aurez très probablement besoin d'une table intermédiaire pour surmonter l'obstacle plusieurs à plusieurs.
Quelque chose comme:
Il se peut que votre application Web soit incroyablement populaire et ait besoin d'être dénormalisée plus tard, mais il est inutile de brouiller les eaux trop tôt.
la source
Vous devriez lire les articles de blog de Philipp Keller sur le marquage des schémas de base de données. Il en essaie quelques-uns et rapporte ses résultats, à la fois en termes de facilité de construction de requêtes communes et en termes de performances . Le nombre d'étiquettes, le nombre d'articles étiquetés et le nombre d'étiquettes par article étaient tous des facteurs. Les messages datent de 2005; Je ne suis au courant d'aucune mise à jour depuis lors.
la source
En fait, je pense que la dénormalisation du tableau des balises pourrait être une meilleure façon d'avancer, en fonction de l'échelle.
De cette façon, la table des balises a simplement tagid, itemid, tagname.
Vous obtiendrez des noms de variables en double, mais cela rend l'ajout / la suppression / l'édition de balises pour des éléments spécifiques BEAUCOUP plus simple. Vous n'avez pas besoin de créer une nouvelle balise, de supprimer l'allocation de l'ancienne et d'en réattribuer une nouvelle, il vous suffit de modifier la variable.
Pour afficher une liste de balises, vous utilisez simplement DISTINCT ou GROUP BY, et bien sûr, vous pouvez également compter combien de fois une balise est utilisée facilement.
la source
Si cela ne vous dérange pas d'utiliser un peu de choses non standard, Postgres version 9.4 et plus a une option de stockage d'un enregistrement de type tableau de texte JSON.
Votre schéma serait:
Pour plus d'informations, consultez cet excellent article de Josh Berkus: http://www.databasesoup.com/2015/01/tag-all-things.html
Il existe plus d'options différentes comparées à fond pour les performances et celle suggérée ci-dessus est la meilleure dans l'ensemble.
la source
Je suggérerais d'utiliser une troisième table intermédiaire pour stocker les associations de balises <=> éléments, car nous avons des relations plusieurs-à-plusieurs entre les balises et les éléments, c'est-à-dire qu'un élément peut être associé à plusieurs balises et une balise peut être associée à plusieurs éléments. HTH, Valve.
la source
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 même trop vous soucier des performances à ce stade de développement. C'est ce qu'on appelle l' optimisation prématurée .
Cependant, je suggère que vous incluiez la colonne Tag_ID dans la table Tags. Il est généralement recommandé que chaque table ait une colonne ID.
la source
Si l'espace va être un problème, ayez une 3ème table Tags (Tag_Id, Title) pour stocker le texte de la balise, puis changez votre table Tags en (Tag_Id, Item_Id). Ces deux valeurs doivent également fournir une clé primaire composite unique.
la source
Les éléments doivent avoir un champ «ID» et les balises doivent avoir un champ «ID» (Clé primaire, en cluster).
Ensuite, créez une table intermédiaire de ItemID / TagID et mettez-y le " Perfect Index ".
la source