这是在DynamoDB中创建表的正确方法吗?

时间:2012-08-04 21:10:05

标签: mongodb amazon-dynamodb nosql

我对Dynamo或Mongo等NoSQL商店的理解是你应该考虑非规范化并根据你将要执行的查询创建表。

我正在努力设置我的桌子。

我已经确定了要运行的查询。

我已将普通的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 (因此选民人数较少的高评价项目不会影响我的排行榜)

然而,

因为我正在应用'过滤器' - 我假设像Dynamo这样的键/值存储不是我想要的?

还有一个问题:假设我有摄影师桌,我想删除摄影师。我有责任通过摄影师拍摄照片并删除吗?同样,由于它是非关系型的,我假设没有级联类型的特征?

由于

1 个答案:

答案 0 :(得分:1)

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

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

例如:“获取在date_x和date_y之间拍摄的所有照片,其中摄影师是John以大多数选票命令的。”

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仍然会导致多个查询,但可以是一个有用的帮助。