10
votes

App Engine DataSore: Comment implémenter des messages et des tags sans jointures?

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> xxx

dans l'étiquette d'entité: xxx

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.

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.

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.

Merci!


0 commentaires

3 Réponses :


5
votes

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.

  1. Cela signifie que chaque fois que vous devez extraire votre entité de tag Java, vous retirez 14K de données de clé de 14K à partir du magasin de données. Ensuite, vous l'envoyez tous en arrière lorsque vous faites un put. qui pourrait ajouter beaucoup d'octets.
  2. En plus des octets qui vont aller et retour, chaque mise au courant des index devra être mise à jour. Chaque entrée de la liste ListProperty Maps à une entrée d'index distincte. Alors maintenant, vous faites beaucoup de mises à jour d'index. qui nous conduit au numéro 3 ...
  3. Exploring index. Chaque entité a une limite sur le nombre d'entrées d'index qu'il peut avoir. Je pense que la limite est de 5000 par entité. Donc, c'est en fait une limite difficile sur le nombre de postes pourraient avoir la même balise.

    lecture supplémentaire:

    • ceci POST touche quelques-uns des problèmes avec les grandes listes

    • Exploding Indexes

      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 d'une liste de balises avec un filtre de requête comme celui-ci: xxx

      pour tous les messages Avec 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.

      trouver des messages apparentés semble délicat. Je penserai à cela après un peu de café.


2 commentaires

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.



1
votes

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 message sur la balise (code> entité. Ainsi que list tags sur le POST entité.


0 commentaires

1
votes

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.


1 commentaires

C'était sa réponse à ma question, Stackoverflow.com/Questions/5778606/...