4 votes

Création d'une liste de parents d'entités à l'aide d'une requête/prédicatée de récupération de données de base

J'ai un modèle de données de base, utilisant le magasin de la base de données, qui contient des entités avec des relations classiques parent/enfant. Chaque parent a un certain nombre d'enfants, chaque enfant un seul parent, créant ainsi une hiérarchie à plusieurs niveaux.

Ce que je voudrais faire, c'est utiliser un prédicat dans une requête de recherche pour renvoyer une liste de toutes les entités situées entre une entité donnée et la racine.

Si je faisais cela en code, je remonterais la chaîne des "parents" jusqu'à l'entité racine, mais j'aimerais le faire dans un prédicat afin que la recherche reste "dans la base de données". Cela fera partie d'une recherche et doit donc être relativement rapide.

Est-ce possible ?

2voto

TechZen Points 52692

Les prédicats sont trop câblés pour traverser un nombre inconnu d'objets dans un graphe de relations. Vous devez lui dire concrètement quelles entités et relations traverser. On ne peut pas dire "traverse la relation untel jusqu'à ce que tu atteignes un zéro".

L'optimisation prématurée est la racine de tous les maux. Je ne m'inquiéterais pas de la vitesse de déplacement des relations dans les objets vivants. Core Data est beaucoup plus rapide que vous ne le pensez pour ce genre de choses. Pour optimiser dans ce cas, définissez la récupération en tant que défauts de sorte qu'aucune donnée ne soit chargée, seulement les relations, et je ne pense pas que vous aurez des problèmes de vitesse.

En passant, faites attention à votre nomenclature, les entités sont aux objets gérés ce que les classes sont aux instances. Les entités sont abstraites, les objets gérés sont concrets. Les entités ne sont que des attributs du modèle de données. Dans ce cas par exemple, vous pourriez n'avoir qu'une seule entité auto-référente dans le modèle de données qui pourrait être utilisée pour créer un graphe de millions d'objets gérés.

Vous pouvez trouver des entités parentes tout comme vous trouvez des super classes, mais ce n'est pas vraiment ce que vous demandiez.

0voto

Joshua Nozzi Points 38718

Je ne pense pas qu'il soit possible de faire cela en un seul aller-retour en utilisant une relation parent/enfant. Il existe cependant d'autres méthodes. Si vous êtes préoccupé par les performances (et que vous les avez mesurées pour vérifier qu'il s'agit bien d'un problème pour votre ensemble de données moyen), vous trouverez peut-être ceci utile : Stockage de données hiérarchiques dans une base de données

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X