2009-11-17 6 views
2

J'ai une question des données sur la façon de modéliser un grand nombre à plusieurs dans App Engine:moteur App plusieurs à plusieurs modèles

Un BlogEntry peut avoir plusieurs balises, une étiquette peut appliquer à plusieurs entrées de blog .

Je vois deux scénarios:

  1. Utilisez un ensemble de chaînes comme un attribut sur l'entrée de blog.

    • Cela me permet d'interroger facilement une entrée en utilisant une balise
    • Cela ne me permet pas de récupérer toutes les étiquettes et leurs poids (le nombre d'entrées qu'ils appliquent à)
  2. Utilisez un relation entre unowned une entrée et une classe de Tag (Jeu de clés pour les balises dans la classe d'entrée et vice versa)

    • Cela me permet de récupérer toutes les étiquettes et leurs poids
    • Ceci est beaucoup plus complique à maintenir
    • Est-ce que les attributs Set sont chargés par la méthode, ou est-ce que je récupérerais le graphique entier de l'objet à chaque fois? (Fetch une entrée, qui va chercher un certain nombre de mots clés, chacun à son tour aller chercher un certain nombre d'entrées)
  3. utilisation 1. mais conserver les données sur les étiquettes et leurs poids séparement

    • Ce a des problèmes de synchronisation entre les données de la balise et les balises dans les entrées

Toute entrée et pointeurs seraient appréciés. Je pense que c'est un scénario assez courant mais je n'ai pas encore trouvé de bonnes solutions.

Répondre

1

Comme beaucoup d'autres systèmes de gestion de base de données, les relations plusieurs-à-plusieurs ne sont pas supportées nativement dans le magasin de données App Engine, mais pourraient être résolues via une «table de jonction». Cependant, étant donné que le langage de requête d'App Engine ne prend pas en charge les jointures, il sera très difficile à utiliser dans votre application. En fait, l'architecture BigTable de Google décourage cela, car les jointures distribuées ne sont pas efficaces. Donc, je suggère d'aller avec la règle "keep it simple stupid"; utiliser la chose la plus simple qui fonctionne. Une liste de chaînes dans un objet "Blogentry" semble assez robuste. Même s'il est sujet à des conditions de concurrence (les personnes effectuant des mises à jour en parallèle, écrasant les modifications mutuelles), mais combien de personnes modifiez-vous le même article de blog?

+0

Salut, merci de répondre. Vous avez raison, et c'est ce que je fais maintenant (option 1). Malheureusement, cela ne me permet pas d'obtenir facilement une liste de toutes les balises et de leurs poids (Cette liste est nécessaire parce que je voudrais avoir un tagcloud, et je voudrais autocomplete sur l'ajout de balises aux nouvelles entrées). Il semble contre-intuitif, pour ne pas dire non scalable, de calculer cette liste en mémoire, mais c'est peut-être ce qui doit être fait. – Wilken

0

J'ai décidé d'aller avec l'option 3., pour maintenir une liste séparée d'étiquettes avec leurs poids.

Cela semble fonctionner, même si le code d'insertion/mise à jour est un peu encombré.