DynamoDB,强制字段组合的唯一性

DynamoDB, force combination of fields uniqueness

我有以下实体:

class Terms {
     //hash key
     private String code;

     private String region;
     private String market;
     private String brand;
     private String productType
}

持久保存到 Dynamo DB table。我需要实施一个约束来限制创建具有相同 region, market, brand and productType 的 Terms 的可能性,以便此字段组合是唯一的。我是 DynamoDB 的新手,我首先想到的是在应用程序级别实施此限制,例如实现一个服务层函数,检查 Term 和给定的字段值组合 region = X, market = Y, brand = U, productType = Z 是否已经存在,如果存在则抛出异常。 但是,我想知道是否有办法在 DynamoDB 层上实施此限制 - 是否有办法使这种字段组合在 table 定义级别上唯一? 任何帮助表示赞赏, 谢谢, 干杯

DynamoDB 不支持此类功能。此外,实现这样的功能在 DynamoDB 中将无法扩展。

如果您需要根据 table 中的所有其他项目验证新的(或更新的)项目,您将需要在每次保存项目时对整个 table 执行扫描.这意味着您的性能和成本将与您的 table 尺寸成非线性关系。

您可以考虑一种选择。 DynamoDB 中的每个项目都必须有一个唯一的主键。主键必须有一个分区键,并且可以选择有一个排序键。如果您使用您的字段创建了一个复合键,并将它们合并到分区键和排序键的某种组合中,那将有效地加强唯一性。例如,如果您的分区键是代码,而您的排序键是 region+market+brand+producttype。您还需要某种版本控制来防止新请求意外覆盖现有项目。

DynamoDB只保证主键的唯一性。我写了一篇 article 如何自己实现唯一索引。希望对您有所帮助

简而言之,您需要为每个用户创建 2 条记录。一个将包括术语值,第二个将包括唯一索引值。此外,每次插入新记录或更新记录时,都需要检查条件表达式。

这里是单条记录的例子

{
  pk: 'some-user-id',
  record_type: 'record', // you need it to find record with you user props
  region: 'some-region',
  brand: 'some-brand',
  market: 'some-market',
}
{
  pk: 'unique-index#some-region#some-brand#some-market',
  record_type: 'unique-index'
}

每次将新术语插入数据库时​​,您都需要使用 DynamoDB 写入事务插入两条记录,并检查是否没有任何其他记录具有相同的 pk