如何构建DynamoDB数据库以允许查询趋势帖子?

Jas*_*ski 6 nosql amazon-dynamodb

我打算使用以下公式计算"趋势"帖子:

Trending Score = (p - 1) / (t + 2)^1.5
Run Code Online (Sandbox Code Playgroud)

p =来自用户的投票(积分).t =自小时提交以来的时间.

我正在寻找有关如何构建数据库表的建议,以便我可以使用DynamoDB(亚马逊的nosql数据库服务)查询趋势帖子.

DynamoDB需要表中每个项目的主键.主键可以由两部分组成:哈希属性(字符串或数字)和范围属性(字符串或数字).哈希属性对于每个项目必须是唯一的,并且是必需的.范围属性是可选的,但如果使用,DynamoDB将在范围属性上构建排序范围索引.

我想到的结构如下:

TableName:用户

HashAttribute:  user_id
RangeAttribute: NONE
OtherFields: first_name, last_name
Run Code Online (Sandbox Code Playgroud)

TableName:帖子

HashAttribute:  post_id
RangeAttribute: NONE
OtherFields: user_id,title, content, points, categories[ ]
Run Code Online (Sandbox Code Playgroud)

TableName:类别

HashAttribute:  category_name
RangeAttribute: post_id
OtherFields: title, content, points
Run Code Online (Sandbox Code Playgroud)

TableName:计数器

HashAttribute:  counter_name
RangeAttribute: NONE
OtherFields: counter_value
Run Code Online (Sandbox Code Playgroud)

所以这是我将使用下面的表设置进行的请求类型的示例(例如:user_id = 100):

用户操作1:

用户创建一个新帖子并标记2个类别(棒球,足球)的帖子

查询(1):

检查counter_name ='post_id'的当前值并增加+ 1并使用新的post_id

查询(2):将以下内容插入帖子表中:

post_id=value_from_query_1, user_id=100, title=user_generated, content=user_generated, points=0, categories=['baseball','soccer']
Run Code Online (Sandbox Code Playgroud)

查询(3):

将以下内容插入Categories表:

category_name='baseball', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0
Run Code Online (Sandbox Code Playgroud)

查询(4):

将以下内容插入Categories表:

category_name='soccer', post_id=value_from_query_1, title=user_generated, content=user_generated, points=0
Run Code Online (Sandbox Code Playgroud)



最终目标是能够执行以下类型的查询:

1.查询趋势帖子

2.查询特定类别

中的帖子3.查询具有最高分值的帖子

有没有人知道如何构建我的表格,以便我可以查询趋势帖子?或者这是我通过切换到DynamoDB提供的能力吗?

Che*_*rel 2

我首先对您的评论进行注释,其中包含时间戳与 post_id。
由于您将使用 DynamoDB 作为 post_id 生成器,因此存在可扩展性问题。这些数字本质上是不可缩放的,您最好使用日期对象。如果您需要以疯狂的速度创建帖子,您可以开始阅读 Twitter 的做法 http://blog.twitter.com/2010/announcing-snowflake

现在让我们回到您的趋势检查:
我相信您的场景正在滥用 DynamoDB。
假设您有一个热门类别,其中包含最多的帖子。基本上,您必须扫描整个帖子(因为数据传播得不好),并且每次开始查看要点并在服务器中进行比较。这将不起作用或者会非常昂贵,因为每次您可能会使用所有保留的读取单元容量。

用于此类趋势检查的 DynamoDB 方法是使用 MapReduce
在此处阅读如何实现这些方法:http://aws.typepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb .html

我无法指定时间,但我相信您会发现这种方法具有可扩展性 - 尽管您无法经常使用它。

另一方面,您可以保留“前 10/100”个热门问题的列表,并在帖子被投票时“实时”更新它们 - 您获取列表,检查是否需要使用新问题进行更新已投票的问题并在需要时将其保存回数据库。