0

我对 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 这样的键/值存储不是我想要的?

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

谢谢

4

1 回答 1

1

DynamoDB 是一个索引键值数据库,目前只允许您为每个表定义一个主键以及一个范围键。它可能不太适合您的灵活查询示例,因为按多个属性搜索最终会执行非索引表扫描

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});

有关递增计数器,例如喜欢/不喜欢/投票的数量,请参阅原子操作

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

于 2012-08-05T00:32:58.627 回答