这是设计这个 DynamoDB table 的合理方法吗?备择方案?
Is this a reasonable way to design this DynamoDB table? Alternatives?
我们的团队已经开始使用 AWS,我们的一个项目需要将各种建议的批准状态存储在 table。
有多种东西可以识别单个推荐,假设它们是:State, ApplicationDate, LocationID, and Phase
。然后就是推荐对应的一堆属性(title, volume等等)
用例通常需要抓取给定 State
和 ApplicationDate
的所有条目(然后我们将查看与其对应的所有 LocationId 和 Phase 项目)以供审查UI。对于给定的 Station, ApplicationDate, LocationId, Phase
,项目会一次添加到 table,并经常更新。
一位拥有更多 AWS 经验的开发人员提到我们可能应该使用 State+ApplicationDate
作为分区键,并使用 LocationId+Phase
作为排序键。这两部分结合起来将成为主键。我大体上理解这一点,但如果我们开始获得针对同一主键的多个建议,那将如何工作?我认为我们要么只覆盖以前存在的内容就可以,要么我们必须添加一些其他属性,以便我们可以多次为 State+ApplicationDate/LocationId+Phase
编写建议并在需要时获取所有以前的值......但是那需要向主键添加一些东西吗?这是否就像向排序键添加某种唯一值一样?或者比如我们需要做status,想在不同的status记录不同的值,是不是只需要在sort key中加上status就可以了?
这听起来像是一种合理的方法,还是我应该探索不同的 NAWS 产品来存储这些数据?
使用基于时间的 ID 属性,例如 ULID 或 KSID。这将提供随机性以避免覆盖数据,但在用作排序键的一部分时也会提供基于时间的数据排序
因为 id 值是随机的,您需要将它添加到您执行列表操作的 table 或索引的排序键中,并为可以准确指定的已知值保留 pk .
听起来 'State' 是一个可以更改的值。您无法在 table 上更新项目的键属性,因此如果需要列出数据,则更常见的是在 GSI 的键中使用这些属性。
鉴于上述情况,另一种设计是使用LocationId作为pk,随机id值作为sk,GSI以'State'的GSI作为pk,随机id作为sk。或者,如果您想按状态 -> 阶段 -> 日期列出项目,则 GSI sk 可以是阶段和 ID 属性 的串联。上面的模式为您提供了另一种列表机制,它使用 LocationId + 推荐创建时间的时间戳。
我们的团队已经开始使用 AWS,我们的一个项目需要将各种建议的批准状态存储在 table。
有多种东西可以识别单个推荐,假设它们是:State, ApplicationDate, LocationID, and Phase
。然后就是推荐对应的一堆属性(title, volume等等)
用例通常需要抓取给定 State
和 ApplicationDate
的所有条目(然后我们将查看与其对应的所有 LocationId 和 Phase 项目)以供审查UI。对于给定的 Station, ApplicationDate, LocationId, Phase
,项目会一次添加到 table,并经常更新。
一位拥有更多 AWS 经验的开发人员提到我们可能应该使用 State+ApplicationDate
作为分区键,并使用 LocationId+Phase
作为排序键。这两部分结合起来将成为主键。我大体上理解这一点,但如果我们开始获得针对同一主键的多个建议,那将如何工作?我认为我们要么只覆盖以前存在的内容就可以,要么我们必须添加一些其他属性,以便我们可以多次为 State+ApplicationDate/LocationId+Phase
编写建议并在需要时获取所有以前的值......但是那需要向主键添加一些东西吗?这是否就像向排序键添加某种唯一值一样?或者比如我们需要做status,想在不同的status记录不同的值,是不是只需要在sort key中加上status就可以了?
这听起来像是一种合理的方法,还是我应该探索不同的 NAWS 产品来存储这些数据?
使用基于时间的 ID 属性,例如 ULID 或 KSID。这将提供随机性以避免覆盖数据,但在用作排序键的一部分时也会提供基于时间的数据排序
因为 id 值是随机的,您需要将它添加到您执行列表操作的 table 或索引的排序键中,并为可以准确指定的已知值保留 pk .
听起来 'State' 是一个可以更改的值。您无法在 table 上更新项目的键属性,因此如果需要列出数据,则更常见的是在 GSI 的键中使用这些属性。
鉴于上述情况,另一种设计是使用LocationId作为pk,随机id值作为sk,GSI以'State'的GSI作为pk,随机id作为sk。或者,如果您想按状态 -> 阶段 -> 日期列出项目,则 GSI sk 可以是阶段和 ID 属性 的串联。上面的模式为您提供了另一种列表机制,它使用 LocationId + 推荐创建时间的时间戳。