2010-03-27 3 views
1

J'ai besoin d'un système de marquage simple dans GAE-J. Comme je le vois, l'entité qui est étiquetée devrait avoir une collection de clés se référant aux étiquettes auxquelles elle est associée.Conception pour le système de marquage dans GAE-J

Une entité de balise doit simplement contenir la chaîne de balises elle-même et un ensemble de clés pointant vers les entités associées à la balise. Lorsque la liste de variables d'une entité est modifiée, le système crée une nouvelle étiquette si la balise est inconnue, puis ajoute la clé de l'entité à la collection de clés de cette balise. Si le tag existe déjà, la clé de l'entité est simplement ajoutée à la collection de clés du tag.

Cela me semble relativement simple et sans controverse, mais j'aimerais avoir des commentaires sur cette conception, juste pour être sûr.

Répondre

3

Pourquoi stocker une table Tags? Cela semble très orienté sur la base de données relationnelle, et ne sera pas évolutif ou particulièrement utile au-dessus du magasin de données.

Au lieu de cela, il suffit de stocker une liste de chaînes pour chaque entité taggable.

@Persistent 
private List<String> tags; 

Obtenir sera une simple recherche (au lieu d'un appel à la datastore), trouver d'autres éléments avec cette balise sera un seul appel à la datastore balises de l'entité:

Query query = pm.newQuery("select from Entities " + 
          "where tagNameParam in tags" + 
          "parameters String tagNameParam"); 

Il sera faites aussi des écritures plus rapides, puisque vous n'avez pas à vérifier si une étiquette existe déjà, créez potentiellement une nouvelle ligne dans Tags, etc.

Ce qui ne sera pas aussi simple, cependant, est de trouver toutes les étiquettes uniques pour toutes les entités.

+0

C'est généralement la meilleure approche. Pour garder une trace de l'ensemble des étiquettes uniques (et des fréquences, etc.), vous pouvez en outre avoir un modèle de Tags que vous mettez à jour de manière synchrone, mais séparément. –

+0

Je suppose que la principale raison pour laquelle j'ai pensé à cette approche est que je pourrais avoir un grand nombre d'entités, 6 ou 7 chiffres, et elles ne seront pas dans le même groupe d'entités. Ainsi, j'ai pensé que la requête ci-dessus pouvait être extrêmement coûteuse. Avec les entités de balises, quel que soit le nombre de résultats de recherche que je possède, je ne récupérerais que le couple d'entités de balises. Ensuite, je pourrais récupérer les entites marquées par leurs clés, au lieu d'avoir à les rechercher. J'ai supposé que la récupération par clé serait beaucoup plus rapide, mais je dois admettre que ma compréhension de la banque de données laisse à désirer ... – tempy

0

Je suis en train d'enrouler mon cerveau autour de la banque de données (j'ai utilisé JPA plutôt que l'interface de bas niveau). Ma réaction immédiate est que l'entité ne peut pas posséder l'étiquette et que l'étiquette ne peut pas posséder l'entité. C'est un relationnel classique pour beaucoup. Dans mon expérience, les relations possédées devraient être utilisées autant que possible. Dans ce cas, vous ne pouvez pas les utiliser, vous devez donc être très prudent lorsque vous en gérez plusieurs.

En particulier, il n'y a aucun moyen d'utiliser des transactions pour garantir la cohérence. Vous devriez essayer de préparer votre code pour un magasin de données incohérent. En d'autres termes, les clés des deux entités peuvent ne pas se référer les unes aux autres et votre code ne doit pas s'effondrer/tomber en panne/exploser si c'est le cas.

Questions connexes