Comment structurer une base de données DynamoDB pour permettre des requêtes de messages tendance?

StackOverflow https://stackoverflow.com/questions/9338746

  •  27-10-2019
  •  | 
  •  

Question

Je prévois d'utiliser la formule suivante pour calculer « tendance » messages:

Trending Score = (p - 1) / (t + 2)^1.5

p = votes (points) des utilisateurs. t = temps depuis la présentation en heures.

Je cherche des conseils sur la façon de structurer mes tables de base de données afin que je puisse interroger pour les messages avec DynamoDB tendance (un service de base de données NoSQL d'Amazon).

DynamoDB nécessite une clé primaire pour chaque élément dans une table. La clé primaire peut consister en 2 parties: l'attribut Hash (chaîne ou nombre) et l'attribut Range (chaîne ou nombre). L'attribut Hash doit être unique pour chaque élément et est nécessaire. L'attribut Range est facultative, mais si DynamoDB utilisé construira un indice de gamme Trie par l'attribut Range.

La structure que j'avais à l'esprit est la suivante:

TableName: Utilisateurs

HashAttribute:  user_id
RangeAttribute: NONE
OtherFields: first_name, last_name

TableName: Messages

HashAttribute:  post_id
RangeAttribute: NONE
OtherFields: user_id,title, content, points, categories[ ]

TableName: Catégories

HashAttribute:  category_name
RangeAttribute: post_id
OtherFields: title, content, points

TableName: Compteurs

HashAttribute:  counter_name
RangeAttribute: NONE
OtherFields: counter_value

Voici donc un exemple des types de demandes, je conclurai avec la configuration de tableau suivant (exemple: user_id = 100):

Action utilisateur 1:

L'utilisateur crée un nouveau poste et balises poste pour 2 catégories (base-ball, football)

Requête (1):

Vérifier la valeur actuelle du counter_name = 'post_id' et incrément + 1 et utiliser la nouvelle post_id

Requête (2): Insérer ce qui suit dans le tableau Messages:

post_id=value_from_query_1, user_id=100, title=user_generated, content=user_generated, points=0, categories=['baseball','soccer']

Requête (3):

Insérez le suivant dans la table Catégories:

category_name='baseball', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0

Requête (4):

Insérez le suivant dans la table Catégories:

category_name='soccer', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0


L'objectif final est d'être en mesure d'effectuer les types de requêtes suivantes:
1. Interrogez pour les messages de la
tendance 2. Interrogez des postes dans une certaine catégorie
3. Interrogation des postes avec les valeurs les plus élevées de points

Est-ce que quelqu'un a une idée comment je pourrais structurer mes tables pour que je puisse faire une requête pour les messages tendance? Ou est-ce quelque chose que je donne la la possibilité de le faire par le passage à DynamoDB?

Était-ce utile?

La solution

Je commence avec une note sur votre commentaire avec l'horodatage vs post_id.
Puisque vous allez utiliser DynamoDB comme générateur post_id, il y a un problème d'évolutivité là. Ces chiffres sont par nature infranchissable et vous feriez mieux d'utiliser un objet date. Si vous avez besoin de créer des postes dans un temps de vitesse folle, vous pouvez commencer à lire sur la façon dont twitter le font http://blog.twitter.com/2010/announcing-snowflake

Maintenant, nous allons revenir à votre chèque de tendance:
Je crois que votre scénario utilise à mauvais escient DynamoDB.
Disons que vous avez une catégorie HOT qui a la plupart des postes en elle. Fondamentalement, vous devrez analyser l'ensemble des postes (puisque les données ne se transmet pas bien) et pour chaque commencer à regarder des points et faire les comparaisons dans votre serveur. Cela ne fonctionnera tout simplement pas ou sera très coûteuse, car chaque fois que vous utiliserez probablement toutes vos capacités unités de lecture réservé.

L'approche DynamoDB pour ces types de tendances de contrôle utilise MapReduce
Lisez ici comment implémenter ceux-ci: http://aws.typepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb.html

Je ne peux pas spécifier un temps, mais je crois que vous trouverez cette approche évolutive -. Si vous ne pourrez pas l'utiliser souvent

Sur une autre note - vous pouvez garder une liste des « top » des questions 10/100 à la mode et vous les mettre à jour en « temps réel » lorsqu'un poste est upvoted -. vous obtenez la liste, vérifiez si elle a besoin d'être mis à jour avec la nouvelle question upvoted et enregistrez-le revenir à la db si nécessaire

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top