Amazon dynamodb 使用DynamoDB/Vogels的数据版本控制策略

Amazon dynamodb 使用DynamoDB/Vogels的数据版本控制策略,amazon-dynamodb,Amazon Dynamodb,我正在开始一个项目,它将使用DynamoDB作为数据存储,以及设计非常好的库来抽象出amazonsdk的一些粗糙边缘 随着应用程序的发展,组成数据模型的属性可能会发生预期的变化。通常会添加新属性,或者简单属性会嵌套(映射)或聚合(列表),有时属性类型会更改,或者属性会被完全删除。一些项目(如)提供了按需更新数据模型的框架 我知道,与典型的关系系统相比,DynamoDB为改进现有数据模型带来了不同的挑战和灵活性,因此,我想知道是否有任何最佳实践可用于支持数据模型版本控制,尤其是在使用Vogels时

我正在开始一个项目,它将使用DynamoDB作为数据存储,以及设计非常好的库来抽象出amazonsdk的一些粗糙边缘

随着应用程序的发展,组成数据模型的属性可能会发生预期的变化。通常会添加新属性,或者简单属性会嵌套(映射)或聚合(列表),有时属性类型会更改,或者属性会被完全删除。一些项目(如)提供了按需更新数据模型的框架


我知道,与典型的关系系统相比,DynamoDB为改进现有数据模型带来了不同的挑战和灵活性,因此,我想知道是否有任何最佳实践可用于支持数据模型版本控制,尤其是在使用Vogels时?

DynamoDB和变化如此剧烈的数据模型的最大挑战是,在一个属性上是否有任何现有索引,而该属性现在正在变为不同的数据类型

假设您有一个具有哈希键的现有表-userid(数字)

如果要将userid从数字切换为字符串,DynamoDB将拒绝写入表,因为数据类型不匹配。如果更改的属性是辅助索引的一部分,它还将拒绝写入

Vogels验证相当灵活,您可以将其配置为支持属性的多种数据类型:

var Account = vogels.define('Account', {
  hashKey : 'email',
  schema : {
    email : Joi.string().email(),
    phoneNumber : Joi.alternatives().try(Joi.string(), Joi.number())
  }
});
此处phoneNumber可以是字符串或数字。但是,如果您在phoneNumber上有索引,那么如果数据类型与索引配置不匹配,DynamoDB本身将拒绝该项

演化数据的最佳实践是永远不要尝试重命名或更改现有属性的数据类型。而是将数据写入新属性。在应用程序中,当读取数据时,检查新属性是否存在,如果不存在,则从旧属性中读取并转换并写入新属性。无论您使用何种数据存储,这都将允许您执行零停机部署,并允许您轻松回滚