Dans Google App Engine, quel est le modèle de jointure plusieurs à plusieurs le plus efficace?

9

La conception de BigTable rejette de nombreuses philosophies des modèles relationnels standard, préférant explicitement la dénormalisation à un grand nombre de petites tables.

L'un des domaines les plus vastes où cela pose problème est la modélisation de plusieurs à plusieurs jointures.

Une façon de modéliser ces jointures consiste à violer la première forme normale et à placer toutes les données intéressantes dans une db.ListProperty (). Bien que cela puisse être recherché à partir d'une requête, je n'ai pas encore exploré les implications en termes de performances de la recherche dans une liste par rapport à l'extraction d'une autre table.

Comme les jointures ne sont pas possibles, il est possible de lier des tables via RelationshipProperties. Par conséquent, avec suffisamment d'effort, la table d'intersection standard (une table avec une clé primaire conjointe qui fait référence aux deux tables parentes) peut être créée. Quelqu'un a-t-il exploré les résultats de performance des différentes implémentations?

-Éditer-

Bien que la liste des clés suggérée dans la documentation soit en effet une façon de le faire, je suis intéressé par les performances et les taux d'anomalies de cela et d'autres implémentations. Est-il utile de créer des listes mutuelles de clés? L'effort impliqué dans les répétitions en vaut-il le prix? Y a-t-il une meilleure façon de le faire?

Brian Ballsun-Stanton
la source

Réponses:

3

Je travaille également avec le magasin de données GAE en ce moment, vous devriez vérifier cet article si vous ne l'avez pas déjà fait. Si vous avez trouvé quelque chose d'utile, veuillez mettre à jour votre question.

ÉDITER:

J'ai trouvé ce aujourd'hui, check it out.

eiefai
la source
0

D'après mon expérience sur GAE, vous devez utiliser les requêtes de table avec parcimonie. L'ajout d'une table "join" ralentirait encore plus les choses. Par exemple, si vous avez des tables A et B qui partagent une relation plusieurs-à-plusieurs et que vous créez une table J de "jointure" avec des champs RelationshipProperty à la fois A et B, vous devrez interroger J chaque fois que vous voulez trouver enregistrements associés (entités).

Il serait beaucoup plus rapide d'avoir la liste des clés en A ou B (ou les deux si nécessaire) car elles seront incluses lorsque vous récupérerez cet enregistrement / entité. Tant que vous n'avez pas trop de clés dans la liste (c'est-à-dire que l'entité n'est pas trop grande), c'est la voie à suivre.

J'ai commencé à utiliser ndb sur mes applications et il y a des avantages importants à utiliser des clés lors de la récupération d'entités. Si l'entité est déjà mise en cache, elle la retirera d'abord de la mémoire ou du cache mémoire. Donc, s'il y a un chevauchement important dans vos listes de clés, les récupérations seront beaucoup plus rapides pour les entités déjà récupérées.

Brent Washburne
la source