2012-02-18 36 views
5

我打算用下面的公式来计算“趋势”的帖子:从用户如何构建DynamoDB数据库以允许查询趋势帖子?

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

P =票(点)。 t =以小时为单位提交的时间。

我正在寻找关于如何构建数据库表的建议,以便我可以使用DynamoDB(来自Amazon的nosql数据库服务)查询趋势帖子。

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

我脑子里想的结构去如下:

表名:用户

HashAttribute: user_id 
RangeAttribute: NONE 
OtherFields: first_name, last_name 

表名:帖子

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

表名:分类

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

表名:计数器

HashAttribute: counter_name 
RangeAttribute: NONE 
OtherFields: counter_value 

因此,这里的类型的请求的示例我想使用下面的表设置(例如: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'] 

查询(3):

插入以下到类别表:

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

查询(4):

将以下成类别表:

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



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

1.查询的趋势职位

2.查询职位在某一类

3.查询与最高点的帖子值

没有任何人有任何想法我怎么能组织我的表这样我可以对趋势帖子进行查询?或者,这是我通过切换到DynamoDB而实现的功能吗?

+1

最好是具体说明您正在使用的数据库。各种“NoSQL”数据库有很大的不同。 – 2012-02-18 05:13:08

+0

你多久会重新计算热门帖子?你在哪里存储上面的时间戳?你愿意在哪个时间段内将帖子老化从而有资格获得趋势? – Nick 2012-02-18 10:44:54

+0

@Layble我打算使用post_id作为增量计数器(所以按降序排序post_id将显示最新的帖子)。我在考虑使用post_id与时间戳的原因是,我可以避免在类别表中重复范围属性的可能性(例如:如果2个不同的用户在同一时间发表关于足球的帖子)。我想我会至少每分钟都要重新计算趋势的帖子。 – 2012-02-18 21:47:22

回答

1

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

现在让我们回到你的趋势检查:
我相信你的情况是滥用DynamoDB。
比方说,您有一个HOT类别的帖子最多。 基本上,你将不得不扫描整个帖子(因为数据传播不好),并且每次开始查看点并在服务器上进行比较。这将不起作用或将是非常昂贵的,因为每次你可能会使用所有保留的读取单位容量。

对于那些类型的趋势检查的DynamoDB的方法是使用MapReduce的
这里了解如何实现这些:http://aws.typepad.com/aws/2012/01/aws-howto-using-amazon-elastic-mapreduce-with-dynamodb.html

我不能指定一个时间,但我相信你会发现这种方法可扩展性 - 虽然你将无法经常使用它。

在另一个说明 - 你可以保留“前10/100”时尚问题列表 ,你可以在帖子被投票时“实时”更新它们 - 你会得到清单,检查它是否需要用最新提出的问题进行更新,并在需要时将其保存回数据库。

+0

http://engineering.twitter.com/2010/06/announcing-snowflake.html无法访问。转到https://blog.twitter.com/2010/announcing-snowflake – Kibria 2015-12-24 09:06:12