2011-01-12 4 views
0

Je construis une application avec une relation plusieurs à plusieurs; Un élément de l'image 'Image' peut être lié à n'importe quel nombre de Galeries ('Galerie'). Et bien sûr, une galerie peut contenir n'importe quel nombre de photos. Donc, suivant la suggestion de Google ici, j'utiliserai une liste à 'Image' qui contient les clés étrangères de 'Galerie'. C'est l'approche BigTable.Que préférer dans GQL; StringListProperty ou ListProperty?

(L'ancienne approche Relational DB serait d'avoir une table/entité entre « Image » et « Galerie ».)

Voici ma question: Lors du stockage de la clé, dois-je aller pour un " StringListProperty "on" Picture "ou un" ListProperty (db.Key) "fonctionnerait-il mieux?

Une raison que je vois pour un StringList serait, que je pourrais stocker également d'autres valeurs puis Keys, mais d'autre part ce serait sale style de toute façon. Mais je suis également assez sûr que Google a suggéré de ne pas utiliser plus d'une liste à une entité parce que l'indice (s) va exploser. Donc cela me gardera une porte dérobée.

Quant au ListProperty avec le type « Key » un point serait la vérification automatique, si la valeur est en fait une clé.

Comme il est très facile de convertir des chaînes en clés et vice versa, je ne vois aucune raison pour l'un des types de liste de préférer ici.

En ce qui concerne les problèmes de performances, je n'ai aucune idée de la façon dont je pourrais tester cela - mais il semble que ce sera le facteur principal dans cette décision.

Curieux de vos commentaires. Surtout si quelqu'un a testé la performance sur ce sujet ou serait si gentil et le faire.

Cheers, // Hannes

Répondre

0

Utilisez un db.ListProperty(db.Key) si vous avez l'intention de stocker des listes de clés. Ils seront stockés dans une représentation binaire, qui est plus compacte que la représentation de chaîne que vous utiliseriez dans une liste de chaînes.

Vous avez raison de mélanger les touches avec d'autres objets dans une liste. Avoir plusieurs listes dans une entité est très bien, tant que vous n'en indexez pas plus d'un dans le même index personnalisé - c'est ce qui provoque l'explosion des index.

+0

Merci, Nick! Va le faire. Cheers, // Hannes – Hannes

0

Utilisez db.ListProperty (db.Key), cela rendra la recherche de données plus facile que la chaîne .. si le modèle Gallery a une propriété dont pic_list est de type db.ListProperty (db.Key), qui contient la liste des clés de l'entité image .. Supposons que l'image est le nom de votre entité .. alors Picture.get (// GalleryObject //. pic_list) obtiendra toutes les entites d'image ..

+0

Merci pour la précieuse contribution Abdul. – Hannes

Questions connexes