Comment prévenir les requêtes récursives profondes avec des entités constituées des entités du même type? [Exemple frais à l'intérieur]

StackOverflow https://stackoverflow.com/questions/3516784

Question

Pas de soucis! Il semble plus complexe qu'il est en réalité! Il suffit de descendre les boissons!

TLDR version : Comment efficacement et mettre à jour les entités requête ayant des relations avec d'autres entités

Voici un scénario de modélisation des données intéressantes avec deux tables qui a été me laisse perplexe:

Entities { ID, Name, ScalarValue }

ComponentEntities { AggregateEntityID, ComponentEntityID, quantity }

AggregateEntityID et ComponentEntityID sont les clés étrangères à la table Entities.

Donnez-moi l'exemple sanglant déjà

Drinks { ID, Name, Alcohol% }

DrinkIngredients { CocktailID, IngredientID, amount }

Drinks { 1, "Vodka", 40% }
Drinks { 2, "Tomato juice", 0% }
Drinks { 3, "Tabasco", 0% }
Drinks { 4, "Bloody mary", - }

DrinkIngredients { 4, 1, 0.2 } // Bloody mary has 0.2*Vodka
DrinkIngredients { 4, 2, 0.7 } // Bloody mary has 0.7*Tomato juice
DrinkIngredients { 4, 3, 0.1 } // Bloody mary has 0.1*Tabasco

Si nous voulions obtenir sanglant teneur en alcool de Marie, nous SELECT * FROM DrinkIngredients WHERE CocktailID == 4.

assez standard; rien bizarre là-bas. Lisa aime à en faire un peu plus doux en ajoutant un peu de passion à lui:

Drinks { 6, "Passion", 13% }
Drinks { 7, "Bloody Mary Pink", - }

DrinkIngredients { 7, 4, 0.8 }  // Bloody Mary Pink has 0.8*Bloody Mary
DrinkIngredients { 7, 6, 0.2 }  // Bloody Mary Pink has 0.2*Passion

La maman de Lisa a été dégustation ce depuis si longtemps qu'elle croit qu'elle a trouvé le mélange ultime entre les deux:

Drinks { 8, "Bloody Milf", - }
DrinkIngredients { 8, 4, 0.45 } // Bloody Milf has 0.45*Bloody Mary
DrinkIngredients { 8, 7, 0.55 } // Bloody Milf has 0.55*Bloody Mary Pink

Ajoutez quelques plus de ces se compose de les niveaux et nous avons une récursion relationnelle profonde. La seule restriction est que l'entité ne peut consister en elle-même.

semblent former un graphe orienté acyclique .

SGBDR: Une façon de « cache » les données serait de calculer les données pertinentes et le stocker dans l'entité elle-même (ou peut-être dans une autre table). Dans l'exemple ci-dessus, la teneur en alcool pour Bloody Mary serait calculée une fois quand il est créé et stocké dans son champ Alcohol%. Dans ce cas, les mises à jour deviennent coûteux parce que nous devons mettre à jour toutes les boissons (ainsi que toute la hiérarchie de dépendance) consistant en une mise à jour.

Questions

SGBDR: Y at-il une meilleure façon d'obtenir les valeurs des feuilles (boissons qui ne sont pas des œuvres autres) que d'obtenir la boisson « mère » jusqu'à ce qu'une boisson feuille est atteinte

Les deux, SGBDR et NoSQL, ont un problème avec ceci:. D'une façon ou l'autre

Bas ligne: est-ce même pratique et faisable

Qu'est-ce que j'ai besoin est une contre-création

text alt

Était-ce utile?

La solution

« SGBDR: Y at-il une meilleure façon d'obtenir les valeurs des feuilles (boissons qui ne sont pas des œuvres autres) que d'obtenir la « »? Boire jusqu'à ce qu'une boisson feuille soit atteint » parent

Ne comprends pas. Les boissons qui ne sont pas des œuvres d'autres celles n'a rien à voir avec la récursivité. Il est un simple SAUF ou OU PAS EXISTE.

« obtenir les valeurs des feuilles » (données un parent) exigera inévitablement traverser l'arbre, quelle que soit la structure de données (relationnelle ou hiérarchique) utilisé pour modéliser, ne pensez-vous?

Les deux, SGBDR et NoSQL, ont un problème avec ceci:. D'une façon ou l'autre

SGBDR n'ont pas vraiment un problème avec cela. Le problème a déjà été identifié il y a quelques décennies (80 pour environ), et a été traitée en modifiant l'algèbre relationnelle avec une opération de fermeture transitive, et une version généralisée de celui-ci. SQL prend en charge ce grâce à des requêtes récursives, et que Frank a dit, au moins tous les grands chiens supportent tous les requêtes récursives d'une façon ou l'autre.

Bas ligne: est-ce même pratique et faisable "

L'écriture des requêtes récursives n'est pas exactement trivial si vous ne l'avez jamais fait auparavant. Est-ce que faire « peu pratique »? Je ne sais pas.

Autres conseils

Beaucoup RDMSs prennent en charge les requêtes récursives. Voir e. g. http://msdn.microsoft.com/en-us/library/ms186243. ASPX .

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