2010-12-13 32 views
2

Possible en double:
How do you recommend implementing tags or taggingmeilleure façon de mettre en œuvre Tags (similaires à StackOverflow)

J'ai un site Web avec une base de données qui contient un certain nombre d'articles. J'aimerais implémenter des balises similaires aux tags sur stackoverflow.

je peux penser à deux façons de les mettre en œuvre:

  1. Créer une table séparée Tags avec un à plusieurs avec ma table Articles.

  2. Ajouter un champ de texte Tags à ma table Articles.

La première approche semble la meilleure mais nécessiterait deux tables supplémentaires qui deviendraient assez grandes. Il semble qu'il y aurait aussi des frais généraux considérables pour la mise à jour et le maintien de ces données.

La deuxième approche serait beaucoup plus facile à implémenter et à maintenir, et utiliserait moins de ressources. Mais la recherche serait moins efficace. J'utiliserais probablement LIKE ou peut-être même la recherche en texte intégral.

Je suis intéressé par l'approche que les autres pensent être la meilleure. Ou peut-être y a-t-il une autre approche?

+0

aussi [Comment implémenter le système de balises] (http://stackoverflow.com/questions/1810356/how-to-implement-tag-system) –

+0

Merci, j'ai regardé mais je ne dois pas utiliser les bons termes de recherche . J'ai imprimé tous ces fils. –

Répondre

7

Je voudrais personnellement aller avec l'option 1, vous mentionnez deux tables supplémentaires plus tard, donc je suppose que vous pensez.

Table -Tag 
Fields - TagID, TagName 

Table -TagArticle 
Fields - ArticleID, TagID 

Table - Article 
Fields - ArticleID, blah, blah, blah 

Cela ne devrait pas nécessiter beaucoup plus de stockage que de déverser dans un champ de l'article. De plus, il est normalisé, ce qui vous sera toujours très utile pour le futur et laissera votre base de données beaucoup mieux capable de rechercher des articles par étiquette. Quant à la mise à jour, il y a de fortes chances que vous n'effectuiez qu'une mise à jour occasionnelle par rapport au nombre de fois que vous lisez. L'impact devrait donc être négligeable et je ne peux pas penser à des tâches de maintenance. avoir à faire sur d'autres tables de toute façon et devrait être automatisé.

Les avantages sociaux vous permettent de créer rapidement des éléments tels qu'une liste de balises ou un nuage de balises.

+0

Eh bien, je m'attendrais à ce qu'il nécessite plus de stockage pour les tables et les relations supplémentaires, mais peut-être serait-il suffisamment compensé pour ne pas avoir à répéter les mots-étiquettes eux-mêmes.Mon cas réel peut même être un peu plus complexe. Par exemple, je peux avoir différents types de balises, de plateformes de liens, de langues, de bibliothèques, etc. Je ne suis pas sûr, mais cette approche devrait fonctionner correctement pour cela aussi. Merci. –

+0

@Jonathan Wood - Je ne suis pas certain sur les overheads pour une table mais si vous utilisez un int pour les ID de 4 octets par int alors tagarticle contient 8 octets par ligne, varchars sont 1 octet par caractère + 2 bytes overhead. En prenant les 3 balises sur votre question, ma table nécessite 24 octets, les stocker dans un champ de texte (en supposant que vous utilisez un délimiteur de 1 caractère) nécessite 30 octets, 2 indices sur les colonnes de l'article de balise champ d'étiquette. – Robb

+0

Eh bien, en plus de la table elle-même, vous auriez aussi les index. Mais je suis en fait plus préoccupé par les frais généraux nécessaires pour maintenir les données. Dans un champ de texte, il vous suffit d'enregistrer les données que l'utilisateur a saisies. En utilisant plusieurs tables, vous devez effectuer plusieurs contrôles sur la base de données: est-ce que cette balise est déjà définie - créer sinon, cet article est-il déjà associé à cette balise - créer sinon. Et des étapes similaires pour retirer une étiquette. Pour une base de données connectée au Web, cela représente certainement une charge de travail supplémentaire. Cela dit, je suis toujours penché vers l'approche que vous avez suggérée. Je me demandais juste au sujet des effets. –

2

La première option est clairement la meilleure des deux. Cela fonctionne avec le modèle relationnel et laisse vos données normalisées. La deuxième option fonctionne contre le modèle relationnel et rompt la normalisation. Comment allez-vous exécuter des requêtes telles que "Donnez-moi les 10 meilleurs tags les plus populaires"? Ou "combien de fois le tag 'x' a-t-il été utilisé?" Ces requêtes deviennent triviales avec l'option 1, d'autant plus que (en supposant que le schéma de Robb) vous pouvez garder une colonne Count contre chaque tag.

L'option 2 vous apporte une légère simplification pour une grande perte de fonctionnalité (et à long terme, je soutiens, l'efficacité aussi). Le modèle relationnel est essayé, testé et fonctionne! Utilise le!

+0

Merci, tous les points valides. –