Essentiellement, je veux que l'utilisateur puisse définir un modèle hiérarchique, mais je dois alors permettre à l'utilisateur de stocker des données dans leur modèle défini. Est-ce que ça a du sens? Ainsi, les utilisateurs pourront créer de nouveaux «types d'unités» à organiser de manière hiérarchique et décider comment les unités de ces types peuvent être organisées. Un exemple simple: dans mon interface hypothétique, un utilisateur crée trois types d'unités, tronc, branche et feuille. L'utilisateur définit ensuite les relations entre eux. Une feuille peut exister à n'importe quel point de la hiérarchie, une branche doit avoir un tronc en tant que parent. L'utilisateur peut alors créer des instances de ces types d'unités (en tant qu'unités) et les organiser selon les règles définies dans leur modèle ... y a-t-il un bon moyen de le faire dans la base de données?Quelle est la meilleure façon de modéliser les relations hiérarchiques définies par l'utilisateur dans une base de données?
Répondre
Ceci est une question extrêmement large, mais cela peut vous orienter dans la bonne direction. Notez que vous ne pourrez stocker que les règles de relation dans la base de données. Les appliquer sera à la hauteur de votre code client. Essayez ceci sur la taille ..
unit:
unit id,
name,
unit relationship:
unit id,
foreign unit id
Vous pouvez alors utiliser votre table de relation de l'unité de la façon suivante ..
unit id
se rapporte à l'unité, il est décrit. foreign unit id
doit être nullable.
Un unit
sans enregistrements de relation ne peut exister qu'à la racine de la hiérarchie. Un unit
avec null
foreign unit id
peut avoir un autre unit
comme parent. Sinon, un unit
doit avoir un autre unit
comme parent, et son type doit être l'un de ceux définis dans ses enregistrements de relation.
En ce qui concerne le stockage eux-mêmes instances, qui devrait être simple ..
instance:
instance id,
unit id,
parent instance_id
Je suis sûr qu'il y aurait d'autres champs que vous aurez besoin (nom, par exemple), mais je suppose que vous obtenez le dérive.
Vous devez mettre en œuvre trois concepts:
- les "types d'unités" et leurs associations a permis
- la hiérarchie
- les unités réelles
Ces concepts peuvent coexister plus ou moins indépendamment dans le modèle, mais travaillent ensemble.
create table unittype
(
id int;
name varchar(20);
)
create table unitrelationship
(
id int;
parent_id int;
)
Vous pouvez modéliser la hiérarchie comme tableau auto-référencement:
create table hierarchy
(
id int;
parent_id int;
unit_type_id int;
unit_id int;
)
Vous pouvez alors vos instances unitaires dans une ou plusieurs tables et faire avec eux ce que vous avez décrit.
create table unit
{
id int;
....
}
Les bonnes nouvelles sont que vous Contraindre uniquement les types de parents autorisés, qui peuvent être facilement appliquées dans une interface utilisateur, par exemple en choisissant le parent d'une liste de toutes les unités existantes du type permis.
Je travaille sur un problème similaire bien que je doive supporter plusieurs hiérarchies (un ensemble d'enfants, plusieurs vues hiérarchiques). J'ai trouvé les "Arbres et hiérarchies de SQL pour Smarties" de Joe Celko (ISBN: 1558609202) utiles. Je travaille toujours sur le problème mais il revient si souvent en discutant de ce sujet qu'il semblait approprié de mentionner.
Est-ce ce qu'on appelle une «liste d'adjacence»? – ninesided
Non, il s'agit d'une structure arborescente définie de bas en haut (en d'autres termes, vous définissez des enfants en indiquant un parent sur l'enfant, plutôt que d'indiquer une liste d'enfants sur le parent). Une liste d'adjacence permet des connexions cycliques, contrairement à un arbre. –
donc pour construire l'arbre n'aurais-je pas besoin d'une requête pour chaque nœud pour déterminer les parents? Ou cela dépendrait-il du SGBDR? Je pense que j'ai vu CONNECT_BY_PRIOR utilisé dans Oracle pour l'arbre-marche. – ninesided