2009-01-16 8 views
1

de ce poste What is the most efficient way to store tags in a database?Expliquer la méthode de stockage tag db

Il a été recommandé aux tables d'étiquette de magasin comme celui-ci.

Table: Item 
Columns: ItemID, Title, Content 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 

Et un autre post SO dit la même chose. Quelqu'un peut-il expliquer pourquoi les balises doivent être stockées comme ça? Je devine ItemID est un val interne, le titre est le nom de tag (C++, sql, noob, etc) contenu est tout ce que les données que je veux stocker avec mon article. pourquoi ne pas quelque chose comme

Table: Item 
Columns: ItemID, Title, <more data i want> 

Table: TagList 
Columns: ItemID, Title 

titre au point d'être "nom de l'élément" et le titre de l'étiquette étant "C++" "sql" "Noob" "etc"

Répondre

6

Il n'y a rien de mal avec le deuxième dessin que vous montrez, celui avec la table TagList, sauf qu'il prend plus de place. Autrement dit, si vous étiez étiqueté 10 000 éléments avec la balise "design de base de données", alors dans la conception à deux tables, vous devez stocker cette chaîne 10 000 fois. Si l'efficacité de l'espace est plus importante, vous pouvez utiliser la conception à trois tables, qui ne stockerait que l'identifiant de l'entier de 4 octets pour "base de données" 10 000 fois. Une économie de 10 * 10 000 octets. Une autre différence est que dans la conception à trois tables, vous pouvez avoir plus d'une ligne dans la table Tag avec la même chaîne, même si elles ont des valeurs d'ID entier différentes. Donc, dans le tableau ItemTag, ils sembleraient être des étiquettes différentes, et vous ne sauriez jamais qu'ils sont marqués de manière similaire. Alors que dans la conception à deux tables, les étiquettes avec la même orthographe deviennent regroupées implicitement.

Un autre point: si vous avez besoin de changer l'orthographe des balises, alors dans la conception à deux tables, vous devez mettre à jour plusieurs lignes. Dans la conception à trois tableaux, vous n'avez besoin de mettre à jour qu'une seule ligne. Enfin, si vous avez généralement besoin d'une liste de balises uniques, il est plus rapide d'interroger la table Tags dans la conception à trois tables, au lieu d'avoir besoin d'un SELECT DISTINCT tag FROM TagList chaque fois que vous avez besoin de la liste unique. Et ce dernier vous donne seulement une liste de tags en cours d'utilisation, pas une liste de tous les tags éligibles.

+0

Cette réponse est en or pur: D –

+0

Merci! Je suppose que la note serait, les deux moyens sont légitimes, chacun a ses propres avantages. Choisissez la conception en fonction des pièces dont vous avez besoin pour être plus efficace. C'est à dire. Cela dépend de la manière dont votre application particulière doit utiliser les données. –

1

Pourquoi? C'est normalisé. ItemID sera la clé primaire (peut-être un substitut ou une identité), TagID sera presque certainement un substitut/identité et pour les contraintes/performance vous aurez une contrainte et/ou index unique (peut-être même en cluster sur tag.title). Dans votre exemple, TagList n'aura pas de clé primaire (sauf peut-être les deux colonnes seront la clé primaire), et il ne peut pas être normalisé pour supprimer la redondance du titre d'étiquette (deux éléments avec le même tag auront des entrées séparées). De plus, comme les balises ne sont pas des entités à part entière dans le second modèle, elles ne peuvent pas être liées à un type d'entité différent avec une autre table ItemTag.

Questions connexes