2010-01-22 16 views
5

J'ai une table qui ressemble à ceci:Conception d'une table SQL avec hiérarchie/sous-catégories

ID | Mot-clé | Catégorie | Sous-catégorie | Sous-sous-catégorie | Sous-sous-sous-catégorie

Ai-je besoin de le diviser en deux tables (une table de mots-clés et une table de catégories avec ID parent) si un mot-clé ne peut appartenir à une catégorie, sous-catégorie ... etc. ce qui signifie qu'il n'y a pas de répétition. est-il toujours nécessaire de le diviser?

Répondre

5

Vous n'avez besoin que d'une table pour représenter un mappage 1-1. Pour représenter les mappages 1-many ou many-many, vous devez utiliser plusieurs tables.

Si un mot-clé ne peut correspondre qu'à une seule catégorie/sous-catégorie/sous-sous-catégorie, votre mise en page actuelle devrait fonctionner correctement. Une mise en garde: si vous voulez effectuer une recherche en fonction du mot-clé, il pourrait y avoir des gains de performance pour séparer les tables. Il est beaucoup plus rapide d'effectuer une recherche d'entier. La discussion sur le stockage des valeurs de mots-clés dans une autre table correspond grossièrement à this discussion des noms de pays de stockage (qui sont pour la plupart statiques) dans une autre table. Certains avantages clés de l'utilisation d'une autre table peuvent être des éléments tels que l'indépendance (orale) du langage, la recherche rapide et la facilité de mise à jour ultérieure.

1

J'utiliserais deux tableaux comme celui-ci.

Categories 
------------------- 
PK,FK1 | CategoryID 
     | Keyword 
     | Category 

    SubCategories 
-------------------- 
PK,FK1 | CategoryID 
PK,FK1 | SubCategoryID 
1

Il peut être judicieux de scinder en si vous vous attendez à renommer ou réorganiser vos catégories plus tard:

  • si vous le laissez tel qu'il est, vous devrez le faire renommage/réorganiser l'étape (en changeant les champs catégorie/sous-catégorie/sous-sous-catégorie/sous-sous-sous-catégorie) pour chaque ligne de cette table qui contient cette (sous (sous) sous) sous-catégorie. cela entraîne une requête plus complexe, et si vous avez beaucoup de lignes dans ce tableau de mots-clés, cela peut être un problème de performance (= prendre un peu de temps pour la base de données); d'un autre côté, les requêtes (lecture) seront aussi rapides que possible. Si vous le divisez, la mise à jour de la catégorie ((sub) sub) subira moins de lignes, mais la requête (read) prendra plus de temps car elle doit fonctionner avec deux tables (ou plus) .

Weigh les inconvénients et les avantages des deux et ensuite faire une decision.m

1

Pourquoi ne pas ajouter juste une colonne de ParentID et FK au PK?

6

que je le ferais dans deux tables avec chaque clé étrangère provenant de la table Catégories:

Keywords 
id (PK) 
keyword 
category_id (FK) 

Categories 
category_id (PK) 
category 
parent_category_id (FK) 

Les données de la table Catégories ressemblerait:

category_id category parent_category_id 
1    Food  null 
2    meat  1 
3    organic  1 
4    fruit  3 

et que les données en le tableau Mots-clés devrait ressembler à:

id  keyword category_id 
1  grapes  4 
2  chicken 2 
+0

C'est génial! Merci. basé sur l'autre réponse, je vais le diviser pour la performance et suivre votre conception. – chips