node.js - 为 DynamoDB 项目创建唯一 ID
问题描述
我对DynamoDB有疑问,或者更确切地说是如何为表建模。
问题描述:
目标:用户可以保存产品的价格提醒。
例如:当产品 x 的价格低于目标价格时,用户想要保存警报。
我要特别坚持的是:product, userId, targetPrice, operator。
运算符可以等于、小于或大于(我会在持久化之前的一个步骤中验证这些值)。
用户可以为同一产品添加多个警报,其中 targetPrice 和/或运营商可能不同。如果所有这些属性都相同,则不应在数据库中创建重复项。
当然,每个用户的警报应该完全分开。
我的主要“阅读”案例是获取产品的所有警报。
我目前的解决方案是将产品作为主键(每当我提到产品时,我都在谈论产品的唯一标识符)和一个 alertId 作为排序键。
alertId 是所有属性的组合键:product:userId:targetPrice:operator
。
例如:greatBook12:1234:34:lesser
.
这是节点中用于持久化警报的一些示例代码:
const params = {
TableName: TABLE_NAME,
Item: {
userId,
alertId: `${product}:${userId}:${targetPrice}:${operator}`,
product,
targetPrice,
operator
},
ReturnValues: 'ALL_OLD'
};
docClient.put(params) // ...
我的问题:
像这样滥用排序键感觉有点不对。虽然它确实满足了我的所有要求(没有重复,阅读很容易并且应该相对较快),但我想知道是否有更好的方法来做到这一点。也许有索引之类的?
我有点喜欢平面数据结构(只是表中的项目),但也许还有另一种方法可以为不同的 targetPrices/operators/products/users 创建独特的警报而不创建重复项?
所以我想我的问题是:在满足我正在处理的要求的同时,有没有更好的方法来做到这一点?
非常感谢您!
解决方案
非常有趣的问题。从使用分区键的一方面,product
您可以查询简单性,但您的数据分布也不均匀。如果一款产品取得巨大成功并承担所有负载的 50%(此处详述“热分区”问题https://cloudonaut.io/dynamodb-pitfall-limited-throughput-due-to-hot-partitions/)怎么办?在这种情况下,您可能会遇到读取或写入限制。DynamoDB 建议使用一些随机性(例如随机值 (1, 1000))来避免这种不均匀分布。您可以在此处了解有关这些策略的更多信息:https ://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html#bp-partition-key-sharding-random
但这取决于您如何确定热分区风险。如果您确定没有它们(警报比其他产品多得多的产品),也许现在最好保持模式简单?
推荐阅读
- ffmpeg - tee muxer 失败并出现错误:输出文件 #0 不包含任何流
- javascript - 为 Nextjs 中的每个身份验证用户创建一个 firestore 文档(仅使用使用 Google 登录)
- javascript - 使用 MediaElementPlayer 在 Safari 上构建播放列表时出错
- python - 制作两列的分布直方图
- java - 如何在springboot服务器中托管角度构建文件?
- sql - 如何格式化 SQL 字符串以进行排序
- python - Nuitka 无法打开 .py 文件进行编译
- android - 操作系统更新后,Flutter 应用程序在 VIVO 设备上停留在 ********************* 上的 Observatory Listening
- java - 使用 Nexus 配置 Maven 代理
- php - 如何将多个值推入数组?