我有一个 DynamoDB 表,其中包含多个帖子,我希望可以按以下方式排序:
PK | SK | 类型 | PK1 | SK1 | PK2 | SK2 | PK3 | SK3 |
---|---|---|---|---|---|---|---|---|
发布#1234# | 发布#信息# | 发帖 | 排序#帖子#视图# | 312 | 排序#发布#喜欢# | 005 | 排序#帖子#评论 | 132 |
发布#3112# | 发布#信息# | 发帖 | 排序#帖子#视图# | 153 | 排序#发布#喜欢# | 426 | 排序#帖子#评论 | 065 |
发布#6526# | 发布#信息# | 发帖 | 排序#帖子#视图# | 525 | 排序#发布#喜欢# | 233 | 排序#帖子#评论 | 121 |
用户#bob1# | 用户#信息# | 用户 | 排序#用户#好友# | 012 | 排序#用户#上传# | 012 | ||
发布#6526# | 发布#详情# | 帖子详情 |
我有 3 个 GSI(我喜欢使用通用键名,这样我就可以以不同的方式将它们重用于其他文档)。
但是 PK1、PK2 和 PK3 永远不会改变,只是因为典型约定而被使用。重用该类型与 GSI-PK 一样对我有利(而且实际上更易于人类阅读)。
我知道我仍然需要 3 个 GSI,但我想知道这样做除了简化之外是否还有其他好处。它会以某种方式节省索引吗?是否有更好的(更多“单表设计”?)方法对按类型过滤的相同文档进行排序?
不,您不会节省任何成本 - 将每个 GSI 条目视为单独的自动写入。无论关键结构是什么,成本都是一样的。
您可能不想想要使用
type
作为PK,因为这会将您的数据集中到少量分区(您拥有的类型数量)。良好的 PK 具有很多价值,理想情况下分布良好 - 这就是 DynamoDB 能够扩展的原因。不幸的是,这使得 DynamoDB 对于“按视图对所有帖子进行排序”之类的事情来说是一个糟糕的选择,因为要回答这个问题,您实际上do希望所有帖子都处于同一 PK 下(这样您就可以查询它们)。因此,您不会从 DynamoDB 中获得很大的好处,并且您可能需要考虑不同的数据存储。如果您确实想使用 DynamoDB 并且拥有大量数据,您可能需要采取一些巧妙的措施,例如选择 floor(views / 100)
等分区键,将帖子存储到多个分区中。