【问题标题】:Is this the right approach to table creation in DynamoDB?这是在 DynamoDB 中创建表的正确方法吗?
【发布时间】:2012-08-04 21:10:04
【问题描述】:

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

我正在为如何设置我的桌子而苦恼。

我已确定要运行的查询。

我已经将普通的 SQL 查询翻译成“简单的英语”

例如,我想运行的查询会这样翻译:

“获取在 date_x 和 date_y 之间拍摄的所有照片,其中摄影师是 John,按最多票排序”

由于我不能进行表连接,所以我想出了这个:

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

这是正确的方法吗?

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

然而,

因为我正在应用“过滤器”——我认为像 Dynamo 这样的键/值存储不是我想要的?

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

谢谢

【问题讨论】:

    标签: mongodb amazon-dynamodb nosql


    【解决方案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 仍会导致多个查询,但可能是一个有用的助手。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 2012-06-24
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      相关资源
      最近更新 更多