amazon-web-services - AWS DynamoDB 分区键设计
问题描述
我读了这个答案,它澄清了很多事情,但我仍然对如何设计我的主键感到困惑。
首先,我想澄清 WCU 的概念。我知道 WCU 是每秒最大 1kb 的写入容量。这是否意味着如果写入一条数据需要 0.25 秒,我需要其中的 4 个来计费 1 个 WCU?或者每次我写东西都会消耗 1 个 WCU,但我也可以在 1 秒内写 X 次,仍然需要 1 个 WCU?
用法
我想创建一个表来存储一组健身房的表单数据(95% 将是豁免,其余将是事件报告)。大多数情况下,每个表单都将通过其唯一 ID 直接访问。我还想按日期、表单、userId 等查询表单。
我们可以假设每个健身房平均有 50k 表格
选项
第一个选项很简单:让 formId 成为分区键。我不喜欢这个选项的是扫描操作总是会过滤掉 90% 的数据(即来自其他体育馆的表格),这对 RCU 不利。
第二个选项是我将gymId设为分区键,并为日期、formId、userId添加一个排序键。要实现此选项,我需要更多地了解在一个分区键上拥有 50k 条记录的含义。
第三种选择是每个健身房有一张桌子,并将 formId 作为分区键。这似乎是目前最好的选择,但我不太喜欢让大量表在我的帐户中执行相同操作的想法。
还有其他选择吗?这三个哪个更好?
编辑:我假设另一个选项是SimpleDB?
解决方案
为您的PK设计。当用户要查找表单时,应用程序有哪些数据?它有 GymID、userID 和 formID 吗?如果是这样,也许为PK制作一个复合键?所以你的 PK 可能看起来像:
234455::53894302::245
其中 23445 是 GymID,53894302 是用户 ID,245 是表单 ID。您甚至可以将表单 ID 移动到排序键和日期,您可以有一个表单::245:: 的 SK。然后,您可以轻松获取该用户的所有表单类型项目,或该用户的所有表单 245。或该用户在 2020 年的所有表格 245,方法是在您的 QUERY 中使用 begin_with() 表达式。
这可能不完全是你应该做的,但玩它,看看你想出了什么选项。需要考虑的一件事是当用户移动健身房时会发生什么?也许在这种罕见的情况下,您使用新的gymID 重写他们在数据库中的所有项目。可能你PK中没有gymID。没有更多信息,很难说。希望这足以让您仔细研究,以便您提出解决方案。
推荐阅读
- c# - 获取模型绑定列表框的 SelectedItem 字符串表示
- javascript - 如何从 JavaScript 获取输入文件名到 python?
- audio - 在 PC 上如何处理 PCM 音频数据?
- regex - 当正则表达式将字符替换到行尾时,在行尾包含空格
- javascript - 如何在 Javascript/HTML 中将文件加载为 UTF-32
- python - 使用 5V 引脚为 Raspberry Pi 供电时,我的脚本没有运行
- python - 如何在烧瓶中显示生成的二维码
- mysql - docker run migrate 是否可能只使用一个特定的迁移文件?
- spring-boot - 如何使用 apache camel 将数据返回并写入文件?
- mongodb - 使用 --columnsHaveTypes 在 MongoImport 上重新格式化 Unix 时间戳?