Je construis une application dans Google App Moteur (Java), où les utilisateurs peuvent créer des messages et que je pense à ajouter des balises à ces messages, donc j'aurai quelque chose comme ceci:
Entity Post: < / p> dans l'étiquette d'entité: p> Il serait facile d'interroger, par exemple, tous les messages avec une certaine balise, Mais comment pourrais-je obtenir tous les messages qui a une liste de tags?
Je pourrais faire une requête pour chaque étiquette, puis faire une intersection des résultats, mais peut-être qu'il y a une meilleure façon ... parce que cela serait lent avec beaucoup de poteaux. P> Une autre chose qui pourrait être Plus difficile est d'avoir un post, obtenez les messages qui ont des tags communs commandés par le nombre de balises communes, afin que je puisse obtenir des postes "similaires" à celui-ci, d'une manière ou d'une autre. p> Eh bien, avec des jointures Ce serait beaucoup plus facile, mais je commence avec App Moteur et je ne peux pas vraiment penser à un bon moyen de remplacer les jointures. P> Merci! P> P>
3 Réponses :
Avec cette conception, je crains que votre entité de tag ne puisse être un goulot d'étranglement, surtout si vous vous attendez à ce que des tags soient très courants. Trois questions spécifiques à laquelle je peux penser sont l'efficacité de vos gets et met, écrivent des indices de contention et d'explosion. Regardons sur Stackoverflow pour un exemple - il y a 14 000 messages marqués "Java" en ce moment.
lecture supplémentaire: p>
ceci POST touche quelques-uns des problèmes avec les grandes listes p> li>
Exploding Indexes P > li> ul>
La bonne nouvelle est que certaines de vos exigences seraient facilement manipulées par une seule entité postale.
Par exemple, vous pouvez facilement trouver tous les messages qui ont tous em> d'une liste de balises avec un filtre de requête comme celui-ci: p> pour tous les messages Avec em> Java ou appengine Tags, vous devez faire une requête pour chaque tag, puis combiner les résultats vous-même. Le magasin de données ne manipule pas ou / / dans les opérations de type en ce moment. P> trouver des messages apparentés semble délicat. Je penserai à cela après un peu de café. P> p>
Je ne savais pas que lorsque j'ai récupéré une entité avec une propriété de liste, toutes les entités de cette liste ont également été récupérées ... Est-ce de cette façon? Je vais donc supprimer les messages de liste. Je n'ai pas non plus su que je pouvais interroger ce moyen sur une propriété de liste: q.setfilter ("Tags" == 'Java' && "Tags ==" appengine "); C'est vraiment une bonne nouvelle :) merci Peter.
Les entités complètes dans les listes pourraient ou non être récupérées en fonction de la manière dont vous implémentez vos entités et que vous utilisiez JDO ou JPA (lisez à propos des groupes de récupération dans JDO par exemple), mais même si vous chargez simplement les clés, un Quelques milliers de clés commenceront à s'ajouter si vous les déplacez constamment.
Vous voudrez peut-être consulter cette vidéo de Google Io . Les entités d'index de la relation sont ce dont vous avez besoin et vous permet de supprimer list
(code> entité. Ainsi que
list
POST code> entité. P>
Voir @ Topchef's Blog Post sur ceci: mot clé efficace Recherchez avec des entités d'index de relation et objectivez-vous pour Google Datastore . Il parle de mise en œuvre de la recherche avec les propriétés de la liste à l'aide d'entités d'index de relation et d'objectivation. P>
C'était sa réponse à ma question, Stackoverflow.com/Questions/5778606/...