我对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这样的键/值存储不是我想要的?
还有一个问题:假设我有摄影师桌,我想删除摄影师。我有责任通过摄影师拍摄照片并删除吗?同样,由于它是非关系型的,我假设没有级联类型的特征?
由于
答案 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仍然会导致多个查询,但可以是一个有用的帮助。