amazon-dynamodb - DynamoDB - 它可以用于没有自然分区键的数据吗?
问题描述
我正在寻找 DynamoDB 来存储一些数据,因为它看起来可能是一种具有成本效益的解决方案,但经过一些研究,我认为它可能不适合我的用例,因为我无法找到分区和排序的相关唯一值键。
我的数据是各种植物种类的一系列自然事件记录,例如有人注意到山毛榉树叶出现的日期和地点。
{
"species": "Beech",
"event": "Budburst",
"year": 2015,
"season": "Spring",
"date": "12/04/2015",
"latitude": "0.00000",
"longitude": "40.000"
}
该应用程序的主要查询是获取某个物种在某一年的某一事件的所有数据:
端点:events/:species/:event-type/:year
这可能会返回几千个事件,然后可以在地图中显示这些事件。
如果这是 MongoDB,那么我可能会在species+eventType+year
. 它不会是唯一索引,但至少只会扫描几千个结果而不是整个表,所以它不会太糟糕。
不过,我不确定如何在 DynamoDB 中实现相同的目标,或者即使有可能,因为分区键或分区 + 排序键组合似乎必须是唯一的。
使这项工作的唯一方法是使分区键具有递增的唯一事件ID,然后将species+eventType+year
字符串作为排序键?
如果有任何其他模式,我会很感激听到它们。
谢谢阅读。
解决方案
听起来自然主键将作为哈希键的物种和作为排序键的 eventType+timeStamp。(使用 ISO-8601 作为时间戳,以便您可以使用KeyConditionExpressionbegins_with
中的函数进行查询。)
如果给定物种和事件类型可能同时存在多个事件,或者如果您只是缺少事件的精确时间戳,那么您可以使用 UUID 作为哈希键,并使用物种创建 GSI作为散列键和 eventType+year,甚至是 species+eventType+year 作为散列键,因为主键在 GSI 中不必是唯一的。
另外,这里有一个有用的相关问题,“如何按日期(范围键)查询 DynamoDB,没有明显的哈希键? ”
推荐阅读
- javascript - 将 Div 放在桌子的顶部/上方
- python - 如何在 django 表单中获取员工用户的用户名
- javascript - 在Angular 2+中单击按钮后如何从服务器打印pdf
- arrays - 我不明白为什么我的函数只能在结构中交换 2 个值时出现分段错误
- javascript - 在 window.open(url) 中发送的 URL,打开一个新窗口,但 ulr 已通过加密和 source=proxy 进行修改
- flutter - Flutter/Dart - 在我的构建中使用 FutureBuilder 和 Normal 非异步元素?
- html - SVG中的视图框重要吗?
- angular - Identity Server 4 在帐户/登录时向 Angular 客户端响应 403(禁止)
- flutter - video_player 依赖项不起作用 api 19
- mongodb-.net-driver - 如何使用 C# mongodb 驱动程序防止 SQL 注入?