Quel est le moyen le plus efficace de stocker des balises dans une firebase database?

Je suis en train d’implémenter un système de marquage similaire à celui d’une stack stackflow sur mon site. Ma question est la suivante: quel est le moyen le plus efficace pour stocker les tags afin qu’ils puissent être recherchés et filtrés?

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 une meilleure façon?

Un élément va avoir beaucoup de balises. Et un tag appartiendra à plusieurs articles. Cela m’implique que vous aurez probablement besoin d’une table intermédiaire pour surmonter l’obstacle de plusieurs à plusieurs.

Quelque chose comme:

Tableau: Articles
Colonnes: Item_ID, Item_Title, Content

Tableau: Tags
Colonnes: Tag_ID, Tag_Title

Table: Items_Tags
Colonnes: Item_ID, Tag_ID

Il se peut que votre application Web soit extrêmement populaire et nécessite une dénormalisation à long terme, mais il est inutile de brouiller les eaux trop tôt.

Vous devriez lire les articles de Philipp Keller sur les schémas de bases de données de marquage. Il en essaye quelques unes et rapporte ses résultats, tant en termes de facilité de construction de requêtes communes qu’en termes de performances . Le nombre d’étiquettes, le nombre d’éléments étiquetés et le nombre d’étiquettes par article étaient tous des facteurs. Les publications datent de 2005; Je ne suis au courant d’aucune mise à jour depuis lors.

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

De cette façon, la table de balises contient simplement tagid, itemid, tagname.

Vous obtiendrez des noms de doublon, mais cela simplifiera l’ajout / suppression / édition de balises pour des éléments spécifiques. Vous n’avez pas besoin de créer une nouvelle balise, de supprimer l’allocation de l’ancienne et de réatsortingbuer une nouvelle, il vous suffit d’éditer la variable.

Pour afficher une liste de balises, il vous suffit d’utiliser DISTINCT ou GROUP BY et, bien entendu, vous pouvez également compter le nombre de fois où une balise est utilisée facilement.

Je suggère d’utiliser une troisième table intermédiaire pour stocker les balises <=> associations d’éléments, car nous avons plusieurs relations entre étiquettes et éléments, c’est-à-dire qu’un élément peut être associé à plusieurs balises et qu’une balise peut être associée à plusieurs éléments. HTH, Valve.

Si cela ne vous dérange pas d’utiliser un peu de choses non standard, Postgres version 9.4 et suivantes a la possibilité de stocker un enregistrement de type tableau JSON.

Votre schéma serait:

 Table: Items Columns: Item_ID:int, Title:text, Content:text Table: Tags Columns: Item_ID:int, Tag_Title:text[] 

Pour plus d’informations, voir cet excellent article de Josh Berkus: http://www.databasesoup.com/2015/01/tag-all-things.html

Il y a plus d’options différentes comparées soigneusement pour la performance et celle suggérée ci-dessus est la meilleure.

Vous ne pouvez pas vraiment parler de lenteur en fonction des données que vous avez fournies dans une question. Et je ne pense pas que vous devriez même vous soucier trop de la performance à ce stade de développement. C’est ce qu’on appelle l’ optimisation prématurée .

Cependant, je vous suggère d’inclure la colonne Tag_ID dans la table Tags. C’est généralement une bonne pratique que chaque table ait une colonne d’identification.

Si l’espace est un problème, ayez une troisième table Tags (Tag_Id, Title) pour stocker le texte de la balise, puis modifiez votre table de balises pour qu’elle apparaisse (Tag_Id, Item_Id). Ces deux valeurs doivent également fournir une clé primaire composite unique.

Les éléments doivent avoir un champ “ID” et les tags doivent avoir un champ “ID” (clé primaire, en cluster).

Ensuite, créez une table intermédiaire de ItemID / TagID et placez l’ index parfait .