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
。
我有以下实体:
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
。