Hiérarchique de Données dans MySQL
J'ai une sorte d'arbre comme la chose se passe dans ma base de données MySQL.
J'ai une base de données qui comporte des catégories et chaque catégorie a un subcat. Je vais garder toutes les catégories dans un tableau, de sorte que les colonnes sont comme ceci:
*categories table*
id | name | parent_id
1 | Toys | 0
2 | Dolls | 1
3 | Bikes | 1
Chaque élément dans ma base de données est affecté à l'une de ces catégories:
*items table*
item | category_id
barbie | 2
schwinn| 3
Le problème est que si quelqu'un veut voir tous les JOUETS (la catégorie parente) quel est le meilleur moyen de récupérer les infos de la base de données des objets? La seule façon que je sais comment faire quelque chose comme
SELECT *
FROM items
WHERE category_id = 2
JOIN SELECT *
FROM items
WHERE category_id = 3
etc...
Mais si j'avais 10 catégories en vertu de Jouets, puis j'aurais à le faire adhérer de requête et de 10 fois.
Est-il une meilleure façon de gérer cela?
OriginalL'auteur | 2009-07-06
Vous devez vous connecter pour publier un commentaire.
Vous voulez être donné le parent ID:
Donc, supposons que vous vous êtes donné
Cela vous donnera les éléments que vous voulez - avec un grand défaut de conception: il ne gère pas plusieurs niveaux de catégories hiérarchiques.
Disons que vous avez eu cette table Catégories:
Et Articles:
La seule façon d'obtenir tous les Éléments pertinents est de faire une jointure réflexive:
Ce modèle n'est pas évolutif, puisque vous pouvez avoir PLUSIEURS niveaux de hiérarchie.
Une commune de la façon de traiter avec des hiérarchies est de construire un "aplatie" tableau: une ligne qui relie chaque nœud à TOUS ses descendants.
En plus d'une table Catégories, vous pouvez créer un deuxième tableau:
De sorte que vous pouvez écrire:
Et obtenir TOUTES les Catégories et Articles.
Voici un grand diaporama sur SQL anti-modèles et des solutions pour eux. (Hiérarchique de données dans SQL est un anti-modèle, mais ne vous découragez pas - nous tous de fonctionner dans celui-ci)
Fantastique Réponse! J'avais upvote vous plus si je le pouvais. Vraiment de bonnes choses à savoir. D'excellentes ressources trop, merci pour le partage.
OriginalL'auteur Jeff Meatball Yang
Oui, il y a un moyen de stockage de données appelée "ensembles imbriqués". C'est un peu plus difficile à insérer les données, mais simple pour sélectionner la totalité d'un multi-niveau de la branche à l'aide d'un seul
select
déclaration.Aussi, Celko a écrit un livre sur ce sujet, avec un chapitre sur les ensembles imbriqués et d'autres chapitres sur d'autres méthodes.
OriginalL'auteur ChrisW
Je suis en supposant que vous savez comment obtenir le numéro d'identification et qui n'est pas le point de la question. Aussi,
parent_id
devrait également être un FK référencementid
, et je voudrais utiliser la valeur NULL pour la couche supérieure, et non de 0.Si votre haut-la plupart des catégories ont au plus un niveau de sous-catégorie, vous pouvez utiliser cette requête pour obtenir tous les Jouets:
Si vos catégories peuvent avoir imbriquée des sous-catégories, vous aurez à utiliser une procédure stockée et de l'appeler de manière récursive. Pseudo:
OriginalL'auteur lc.
En supposant que vous connaissez l'id de la catégorie Jouets, et rien n'est dans le top-niveau de Jouets catégorie:
OriginalL'auteur Terry G Lorber
OriginalL'auteur aberrant80
Ce thread peut aider: http://forums.mysql.com/read.php?10,32818,32818#msg-32818
Ce que vous voulez vraiment est de COMMENCER AVEC et de se CONNECTER PAR la syntaxe, mais c'est uniquement pris en charge dans Oracle, pas de MySQL.
OriginalL'auteur
Je ne suis pas familier avec MySQL, mais ici, c'est la façon dont je voudrais le faire en TSQL (SQL SERVER), peut-être essayer de trouver un équivalent moyen de le faire dans MySQL?
1) parcourez toutes les catégories d'obtenir les enfants de l'élément spécifique, dans ce cas categorie id = 1
2) Filtrer les éléments pour que des enfants dans la Hiérarchie CTE(Common Table Expression).
OriginalL'auteur Joshscorp
Je voudrais partager mes idées avec vous.
Limitation de la Contiguïté Modèle:
Suivez les La gestion Hiérarchique des Données dans MySQL
Comme vous l'avez déjà décrit la contiguïté modèle a de limite que vous devez savoir au niveau de l'avant de récupérer le chemin d'accès.
Imbriquer modèle:
Mais si vous convertissez les données de la structure de votre structure de données à l'ensemble Imbriqué modèle, alors vous pouvez toujours utiliser l'auto inscrivez-vous pour obtenir l'arbre.
La conversion de modèle Hiérarchique Imbriquées modèle:
Maintenant nous avons besoin d'un arbre de voyage algorithme pour indexer le modèle imbriqué. Cela peut être mis en œuvre en fonction mysql (Désolé les besoins de conversion de certains implémentation de l'algorithme : Un arbre transversal de l'algorithme. Pas sûr que l'on est le mieux adapté).
Merci 🙂
OriginalL'auteur kta