我打算使用以下公式计算“趋势”帖子:
Trending Score = (p - 1) / (t + 2)^1.5
p =来自用户的投票(积分)。 t =自小时提交以来的时间。
我正在寻找有关如何构建数据库表的建议,以便我可以使用DynamoDB(来自亚马逊的nosql数据库服务)查询趋势帖子。
DynamoDB需要表中每个项目的主键。主键可以由两部分组成:哈希属性(字符串或数字)和范围属性(字符串或数字)。哈希属性对于每个项目必须是唯一的,并且是必需的。范围属性是可选的,但如果使用,DynamoDB将在范围属性上构建排序范围索引。
我想到的结构如下:
TableName:用户
HashAttribute: user_id
RangeAttribute: NONE
OtherFields: first_name, last_name
TableName:帖子
HashAttribute: post_id
RangeAttribute: NONE
OtherFields: user_id,title, content, points, categories[ ]
表名:类别
HashAttribute: category_name
RangeAttribute: post_id
OtherFields: title, content, points
TableName:计数器
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提供的能力吗?
答案 0 :(得分:1)
我从你的评论开始,时间戳与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"时髦的问题
并在"实时"更新它们当帖子被投票时 - 你得到列表,检查是否需要使用新投票的问题进行更新,并在需要时将其保存回数据库。