¿Cómo estructurar una base de datos DynamodB para permitir consultas para publicaciones de tendencia?

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy planeando usar la siguiente fórmula para calcular las publicaciones de "tendencia":

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

P = votos (puntos) de los usuarios. t = tiempo desde el envío en horas.

Estoy buscando consejos sobre cómo estructurar mis tablas de base de datos para poder consultar para publicaciones de tendencia con DynamodB (un servicio de base de datos NoSQL de Amazon).

DynamodB requiere una clave principal para cada elemento en una tabla. La clave principal puede consistir en 2 partes: el atributo hash (cadena o número) y el atributo de rango (cadena o número). El atributo hash debe ser único para cada elemento y es necesario. El atributo de rango es opcional, pero si se usa DynamodB construirá un índice de rango ordenado en el atributo de rango.

La estructura que tenía en mente es lo siguiente:

Tablename: usuarios

HashAttribute:  user_id
RangeAttribute: NONE
OtherFields: first_name, last_name

Tablename: Publicaciones

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

Tablename: categorías

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

Tablename: contadores

HashAttribute:  counter_name
RangeAttribute: NONE
OtherFields: counter_value

Así que aquí hay un ejemplo de los tipos de solicitudes que haría con la siguiente configuración de la tabla (ejemplo: user_id = 100):

Acción del usuario 1:

El usuario crea una nueva publicación y etiqueta la publicación para 2 categorías (béisbol, fútbol)

Consulta (1):

Verifique el valor actual para el contador_name = 'post_id' y incremento+1 y use el nuevo post_id

Consulta (2): Inserte lo siguiente en la tabla de publicaciones:

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

Consulta (3):

Inserte lo siguiente en la tabla Categorías:

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

Consulta (4):

Inserte lo siguiente en la tabla Categorías:

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



El objetivo final es poder realizar los siguientes tipos de consultas:

1. Consulta para publicaciones de tendencia

2. Consulta para publicaciones en una determinada categoría

3. Consulta para publicaciones con los valores de puntos más altos

¿Alguien tiene alguna idea de cómo podría estructurar mis tablas para poder hacer una consulta por publicaciones de tendencia? ¿O es algo que le doy la capacidad de hacer al cambiar a DynamodB?

¿Fue útil?

Solución

Estoy comenzando con una nota en su comentario con la marca de tiempo vs post_id.
Dado que usará DynamodB como su generador Post_ID, hay un problema de escalabilidad allí mismo. Esos números son inherentemente indescriptables y es mejor que use un objeto de fecha. Si necesita crear publicaciones en un tiempo de velocidad loco, puede comenzar a leer sobre cómo Twitter lo está haciendohttp://blog.twitter.com/2010/announcing-snowflake

Ahora volvamos a su verificación de tendencias:
Creo que tu escenario está mal uso de DynamodB.
Supongamos que tiene una categoría caliente que tiene la mayoría de las publicaciones. Básicamente, tendrá que escanear las publicaciones completas (ya que los datos no se extienden bien) y para cada comienzo a mirar los puntos y hacer las comparaciones en su servidor. Esto simplemente no funcionará o será muy costoso, ya que cada vez que probablemente use toda su capacidad de unidades de lectura reservada.

El enfoque DynamodB para ese tipo de verificación de tendencias es usar MapReduce
Lea aquí cómo implementarlos: http://aws.typepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb.html

No puedo especificar un momento, pero creo que encontrará este enfoque escalable, aunque no podrá usarlo a menudo.

En otra nota: puede mantener una lista de las preguntas de moda "Top 10/100" y las actualiza en "tiempo real" cuando se votó una publicación: obtiene la lista, verifique si debe actualizarse con el recién actualizado Pregunta votada y guárdela a la base de datos si es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top