Question

Je fais un site de vidéos où les catégories seront imbriquées:

par exemple. Témoin de programmation> C Langue -> Vidéos MIT -> Vidéo 1      Programmation -> C Langue -> Stanford Vidéo -> Vidéo 1      Programmation -> Python -> Vidéo 1

Ces catégories et sous-catégories seront créées par les utilisateurs à la volée. Je vais devoir leur montrer que les gens les créer sous la forme d'un menu navigable, afin que les gens peuvent parcourir la collection facilement.

Quelqu'un pourrait-il me aider s'il vous plaît comment je peux aller sur la création d'une telle base de données?

Était-ce utile?

La solution

Quassnoi dit:

  

Vous devez utiliser des ensembles imbriqués ou modèles parent-enfant.

Je l'habitude de mettre en œuvre les deux. Ce que je pourrais dire est:

Utilisez l'architecture ensemble imbriqué si votre table catégories ne change pas souvent, parce que sur une clause select, il est rapide et avec une seule demande, vous pouvez obtenir toute la branche de la hiérarchie pour une entrée donnée. Mais une clause d'insertion ou mise à jour, il prend plus de temps qu'un modèle parent-enfant de mettre à jour les champs gauche et à droite (ou inférieur et supérieur dans l'exemple ci-dessous).

Un autre point, je assez trivial doit admettre, mais:
Il est très difficile de changer la hiérarchie à la main directement dans la base de données (il pourrait se produire au cours du développement). Donc, assurez-vous de mettre en œuvre une interface première à jouer avec le jeu imbriqué (changement de nœud parent, déplacer un nœud de branche, la suppression d'un nœud ou toute la branche etc.)

Voici deux articles sur le sujet:

La dernière chose, je n'y suis pas allé, mais je lu quelque part que vous pouvez avoir plus d'un arbre dans une table de jeu imbriqué, je veux dire plusieurs racines.

Autres conseils

Faire une table catégories avec les champs suivants:

  • CategoryID - Entier
  • CategoryName - Chaîne / Varchar / Quelle que soit
  • ParentID - Entier

Votre ParentID sera de retour alors référence à la CategoryID de son parent.

Exemple:

CategoryID CategoryName ParentID
---------------------------------
1          Dog          NULL
2          Cat          NULL
3          Poodle       1
4          Dachsund     1
5          Persian      2
6          Toy Poodle   3

Dans l'exemple dans votre question, il semble que vous voudriez qu'il soit possible pour une catégorie donnée d'avoir plusieurs parents (par exemple, « Vidéos MIT -> Vidéo 1 programmation », ainsi que « Vidéo -> Vidéo 1 Programmation « ), auquel cas le simple ajout d'une colonne de ParentID ne serait pas suffisante.

Je recommande la création de deux tables: une simple table Catégories avec des colonnes CategoryID et CategoryName, et une table de CategoryRelationships séparée avec des colonnes ParentCategoryID et ChildCategoryID. De cette façon, vous pouvez spécifier autant de relations parent-enfant que vous voulez pour une catégorie particulière. Il serait même possible en utilisant ce modèle pour avoir une relation double où deux catégories sont l'autre parent et de l'enfant en même temps. (Du haut de ma tête, je ne peux pas penser à une grande utilité pour ce scénario, mais il illustre au moins la flexibilité du modèle.)

Vous devez utiliser soit nested sets ou modèles parent-child.

Parent-child:

typeid parent name

1      0      Buyers
2      0      Sellers
3      0      Referee
4      1      Electrical
5      1      Mechanic
SELECT  *
FROM    mytable
WHERE   group IN
        (
        SELECT  typeid
        FROM    group_types
        START WITH
                typeid = 1
        CONNECT BY
                parent = PRIOR typeid
        )

sélectionnera tous les acheteurs dans Oracle.

Nested sets:

typeid lower  upper  Name
1      1      2      Buyers
2      3      3      Sellers
3      4      4      Referee
4      1      1      Electrical
5      2      2      Mechanic
SELECT  *
FROM    group_types
JOIN    mytable
ON      group BETWEEN lower AND upper
WHERE   typeid = 1

sélectionnera tous les acheteurs dans une base de données.

Voir cette réponse pour plus de détails.

Nested sets est plus facile à interroger, mais il est plus difficile de mettre à jour et plus difficile à construire une structure arborescente.

Qu'est-ce que vous avez besoin est une relation parent-enfant de base:

Category (ID: int, ParentID: nullable int, Name: nvarchar(1000))

Une meilleure façon de stocker le parent_id de la table est d'avoir imbriqué dans l'ID par exemple

100000 Programmation 110000 C Langue 111000 Vidéo 1 Programmation 111100 C Langue 111110 Video Stanford

etc..so tout ce que vous avez besoin d'un script pour traiter l'ID de telle sorte que le premier chiffre représente la catégorie de niveau supérieur et ainsi de suite que vous aller plus loin dans la hiérarchie

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top