Je fais beaucoup de recherche, mais je n'ai pas pu trouver de nombreuses ressources sur le sujet. Mon objectif est de stocker des données de planification comme si vous trouverez dans un diagramme de Gantt. Donc, un exemple de stockage des données peut être: qui aurait une tâche C attendre à la fois la tâche A et la tâche B de terminer. P> Donc, ma question est la suivante: est la meilleure façon de stocker ce type de données et de les interroger efficacement? Des bonnes ressources pour ce genre de chose? Il y a une tonne d'informations sur les structures d'arbres, mais une fois que vous avez ajouté plusieurs parents, il devient difficile de trouver des informations. Au fait, je travaille avec SQL Server et .NET pour cette tâche. P> P>
3 Réponses :
Utiliser le modèle de liste des adjacents: et cette requête pour trouver tous les prédécesseurs de la tâche donnée: p> pour obtenir la durée du parent le plus long pour chaque tâche: p>
Peut-être que je devrais être plus précis. J'ai examiné le modèle de la liste des adjacents, mais je n'ai pas trouvé de bonnes façons de faire des choses comme à rouler la durée de toutes mes tâches. Il serait facile de ne pas avoir plusieurs parents, mais comment puis-je expliquer efficacement le fait que je ne veux pas la somme des deux parents, mais la plus longue durée de leur part?
@Bpotocki: Veuillez poster quelques échantillons de données et les ResultatsSet que vous souhaitez obtenir.
Votre problème est lié au concept de cardinalité de la relation. Toutes les relations ont une cardinalité, ce qui exprime le nombre potentiel d'instances de chaque côté de la relation qui en sont membres ou peut participer à une seule instance de la relation. À titre d'exemple, pour les personnes, (pour la plupart des êtres vivants, je suppose, avec des rares exceptions près), la relation parent-enfant a une cardinalité de dans la conception de la base de données, généralement, tout ce qui a un (un), (ou un zéro ou un), d'un côté peut être facilement représenté avec seulement deux tables, une pour chaque entité, (parfois une seule table est nécessaire, reportez-vous à la note **) et une colonne de clé étrangère dans la table représentant le "nombreux" que Pointe à l'autre table tenant l'entité sur le côté "One". p> Dans votre cas, vous avez un lors de la mise en place, pour éviter les données de comptage à double comptage Les colonnes dans les tables parent lorsqu'il y a plusieurs jointures, il suffit de baser la requête sur la table des parents ... Par exemple, de trouver la durée du parent le plus long,
En supposant que votre table d'association est nommée Tastepreditor P> 2 à zéro ou plusieurs code>, ce qui signifie qu'il faut deux parents sur le côté parent, et il peut y avoir zéro ou de nombreux enfants (peut-être qu'il devrait être 2 à 1 ou plusieurs code>) beaucoup à de nombreuses relations code>. (Une tâche peut avoir plusieurs prédécesseurs, et chaque prédécesseur peut certainement être le prédécesseur de plusieurs tâches) dans ce cas une troisième table est nécessaire, où chaque ligne représente efficacement une association entre 2 tâches, ce qui représente que l'un est le prédécesseur de la autre. Généralement, cette table est conçue pour ne contenir que toutes les colonnes des touches primaires des deux tables parent et sa propre clé primaire est un composite de toutes les colonnes des clés principales parent. Dans votre cas, il suffit simplement de deux colonnes, du TaskID et du prédécessortakide, et cette paire d'identifiants doit être unique dans la table de manière à ce qu'elles forment ensemble le composite pk. P> Select TaskId, Max(P.Duration)
From Task T Join Task P
On P.TaskId In (Select PredecessorId
From TaskPredecessor
Where TaskId = T.TaskId)
Vérifiez le modèle "Total pondéré hiérarchique" dans le livre "SQL Design Patterns", ou "Livraison de matériaux" dans "Arbres et hiérarchies de SQL".
Dans un mot, les graphiques présentent une double agrégation. Vous faites un type d'agrégation le long des nœuds de chaque chemin et une autre sur des chemins alternatifs. Par exemple, trouvez une distance minimale entre les deux nœuds est minimale sur la sommation. La requête totale pondérée hiérarchique (une lettre de matériaux AKA) est la multiplication des quantités le long de chaque trajet et de chaque sommation suivant chaque chemin alternatif: p>
Pouvez-vous s'il vous plaît fournir un auteur pour le livre que vous avez mentionné?
Cela fait longtemps que j'ai une exigence similaire dans MSSQL 2019, toutes les réponses? Tentative de modéliser des graphiques acycliques dirigés. Essentiellement un nœud avec plusieurs parents, enfant ne peut pas être propre parent !!