2011-03-11 4 views
0

J'ai une colonne varchar (70) dans l'une de ma table où je stocke des tags séparés par des espaces:SQL colonne Recherche Question (SQL Server 2005)

Id Tags 
1 Baby Kids Learning Alphabets 
2 Kids Baby 
3 Comedy Movie Fun 
100 Kids Learning Alphabets 
500 Kids Baby 

J'effectuer une recherche sur la colonne: Obtenez tous ids où nous avons Bébé Enfants et Alphabets dans les balises

Je peux faire où Tags comme '% Baby%' ou des tags comme '% Kids%' ou des tags comme '% Alphabets%' Sélectionner une requête quand il y a # grand des rangées. Mais ajouter \ delete \ edit est toujours très rapide.

J'ai donc ajouté une autre table appelée Balises où je stocke les balises par ordre alphabétique comme:

Tag  Id 
    Alphabets 1 
    Alphabets 100 
    Baby  1 
    Baby  2 
    Baby  500 
    Comedy  3 
    Kids  1 

Cela rend la recherche plus rapide, vous pouvez acheter la mise à jour \ supprimer \ insert douloureux.

Mon design est-il bon pour la croissance future?

Comment devriez-vous concevoir cette colonne de tags?

Merci pour la lecture

EDIT: * Tout ce que je suis en train de tirer la liste des ids connexes. Fondamentalement, trouver tous les identifiants ayant les balises ou balises données. Comme sur cette question, vous voyez "Questions connexes" sur la droite. C'est ce que j'essaie d'obtenir. *

Répondre

1

Vous devrez vraiment analyser quels aspects de votre site vont évoluer et quels sont vos objectifs. Y aura-t-il des tonnes d'inserts? Y aura-t-il des tonnes de tags? Avez-vous besoin de répondre à la question "Combien de questions ont l'étiquette 'Alphabet'?" Je déteste «ça dépend» des réponses, mais cela dépend vraiment de vos objectifs et de vos attentes.

+0

J'ai des réponses pour tout qs. Il y aura des millions de tags. Considérez simplement qu'il s'agit d'un site de partage public. S'il y a 10 millions de lignes et que chacune a 5 balises, alors ce sont des balises de 50M. Donc, des tonnes de tags seront là. Je dois choisir me donner tous les ids où nous avons Alphabets et apprentissage – kheya

+1

Il semble qu'il est probable que les tags seront votre goulot d'étranglement alors ils devraient être rapides. Votre dernière approche me semble meilleure pour cette raison. Vous pouvez également envisager de conserver un nombre mis en cache dans la table des étiquettes au cas où vous auriez besoin de répondre à la question "Combien de fois cette étiquette est-elle utilisée?" Ce sera bien sûr une autre chose à faire lors de l'insertion/la mise à jour/la suppression, mais cela peut être payant à long terme si vous prévoyez d'afficher un nuage de tags sur chaque page vue. – skaz

1

Voici ce que je recommande:

Créez 2 nouvelles tables. Un simple stocke le nom de la balise

Tag  Id 
    Alphabets 1 
    Baby  2 
    Comedy  3 
    Kids  4 
    Learning 5 
    Alphabets 6 

Le second reliera l'étiquette à l'entrée dans la première table

main_id tag_id 
    1   2 
    1   4 
    1   5 
    1   6 
    100  4 
    100  5 
    100  6 

Ensuite, vous pouvez simplement rechercher une jointure entre les tables. Ce sera beaucoup plus rapide. Assurez-vous d'inclure les index appropriés.

+0

Je ne vois aucun avantage par rapport à mon design. Je sauve une jointure et j'insère facilement \ update \ delete. – kheya

+1

Depuis que vous avez demandé à propos de la conception future, ce serait la meilleure voie à suivre. Si vous décidez plus tard d'ajouter une sous-catégorie et de modifier l'un de vos noms de catégorie, cela vous simplifiera la vie. Prenez "bébé" par exemple.Si vous décidez à l'avenir de créer différentes catégories de "bébé" et de "tout-petit", et peut-être de transformer tous les bébés actuels en "bébés", vous devrez mettre à jour chaque rangée de votre dessin où il est écrit "bébé ". Avec le mien, il vous suffit de mettre à jour la table des catégories pour l'entrée 1 et vous avez terminé. – rayman86

+0

Il est également bon design voir http://www.sqlteam.com/article/database-design-and-modeling-fundamentals (recherche many-to-many) et aussi regarder http://en.wikipedia.org/ wiki/Normalisation de la base de données ou normalisation de la base de données de recherche google – rayman86