我正在开始一个项目,它将使用DynamoDB作为数据存储,以及设计良好的Vogels库来抽象出亚马逊SDK的一些粗糙边缘。
随着应用程序的发展,构成数据模型的属性可能会发生预期的变化。通常会添加新属性,或者简单属性变为嵌套(映射)或聚合(列表),有时属性类型将更改或属性将被完全删除。诸如Vers之类的一些项目为按需更新数据模型提供了框架。
我知道DynamoDB对于改进现有数据模型提出了与典型关系系统不同的挑战和灵活性,因此我想知道人们使用什么样的最佳实践来支持数据模型版本控制,尤其是在使用Vogels时?
答案 0 :(得分:4)
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本身将拒绝该项。
遵循不断发展的数据的最佳做法是永远不要尝试重命名或更改现有属性的数据类型。而是将数据写入新属性。在您的应用程序中读取数据时检查新属性是否存在,如果不存在,则从旧属性读取并转换&写入新属性。无论您使用何种数据存储,都可以实现零停机部署,并允许您轻松回滚。