2012-08-04 104 views
0

我对NoSQL商店(如Dynamo或Mongo等)的理解是,您应该根据非规范化和创建基于您将执行的查询创建表的想法。这是在DynamoDB中创建表的正确方法吗?

我在如何设置我的桌子上挣扎。

我确定了我想运行的查询。

我翻译这将是一个普通的SQL查询到“纯英语”

例如,我想运行一个查询会转化为这样:

“获得date_x之间拍摄的所有照片和date_y当摄影师约翰下令由得票最多的”

既然不能做表连接,这就是我想出了:

photos 
{ 
    name, 
    url, 
    photographer, 
    date_created, 
    likes, 
    dislikes, 
    num_voters, 
    weighted_score 
} 

是个是正确的方法?

我喜欢,不喜欢,num_voters和weighted_score的原因是因为我相信,每当用户投票的照片,我需要更新“行”,并增加喜欢/不喜欢/ num_voters和重新计算weighted_score(使具有低多的选民高度评价的项目不会影响我的排行榜)

然而,

因为我申请“过滤器” - 我想一个键/值存储像迪纳摩不我想要的是?

另一方面的问题:比方说,我有一个摄影师表,我想删除一个摄影师。这是我的责任,然后通过照片和删除摄影师?再一次,因为它是非关系的,我假设没有级联类型的功能?

由于

回答

1

DynamoDB是一个索引键值数据库,目前仅允许定义一个主键以及为每个表的范围键。它可能不适合您的灵活查询示例,因为通过多个属性进行搜索最终会做出non-indexed table scans

MongoDB是一个面向文档的数据库,它允许你定义多个索引,并且更适合你的用例。

例如:“获取拍摄者在约翰大多数选票中所拍摄的所有在date_x和date_y之间拍摄的照片”。

db.photos.find({ 
    'photographer': 'john', 
    'created': { 
     $gte: ISODate("2012-07-01"), 
     $lte: ISODate("2012-07-05") 
    } 
}).sort({'votes': -1}); 

对于递增计数器如喜欢/不喜欢/票号码,请参阅Atomic Operations

对于非关系数据库,不支持(或相关)级联删除是正确的。您可以通过删除相关文档来在应用程序层支持此逻辑。一些MongoDB驱动程序确实支持Database References (DBRefs)的概念,这对于提取相关文档非常有用。使用DBRefs仍然会导致多个查询,但可以成为一个有用的帮手。

+0

非常感谢Stennie! – john 2012-08-05 06:39:06

相关问题