nosql - 在无模式数据库中迁移数据格式的好方法是什么?

标签 nosql data-migration couchbase document-oriented-db schemaless

如果您使用无模式数据库(特别是面向文档的数据库,如 CouchDB、Couchbase、MongoDB)并且想要更改特定对象的数据表示格式,您可以保留旧格式的现有记录并以新格式创建新记录。它被宣布为无模式数据库的主要优势之一(我认为是因为您可以避免停机)。另一方面,处理同种数据的多种格式既不方便又低效。那么在无模式数据库中将数据从一种格式迁移到另一种格式的好方法/策略是什么?

最佳答案

像所有事情一样,有许多不同的方法来处理它。在无模式开发中,您通常知道要存储的数据。并不是缺少模式,所有数据都有一个隐式模式,所以我们真正要说的是数据库没有强制执行模式。如果我有一个包含 10 个实例变量的用户对象并存储在 json 中,那么那里就有一个模式!

情况 1:值可能有不同的可能性,单个值、数组或嵌套结构

情况 2:值需要从一种格式更改为另一种格式,例如。从单值到值数组

案例三:json key存在或不存在,这个很简单

对于案例 1:如果您期望 json 值的多样性,则需要将特定值的多样性写入您的应用程序代码逻辑中,如果它是一个字符串,则执行此操作,如果这是一个数组,这样做。

对于案例 2:一种方法是将其作为“按请求”或“按需”处理,以便将转换逻辑融入类方法中,从而转换数据从一种格式到另一种格式。这意味着您在检索数据时将数据从一种格式转换为另一种格式。您还可以标记它以表明您已经对其进行了转换。由于它是按需提供的,因此您可以在文档存储中拥有未“转换”的数据,但如果它确实被请求,它就会被转换。

案例 2 的替代方法:通过工作进程迭代和转换数据。因此,与其等待它被请求,您实际上创建了一个作业来更改数据,因为您希望它被更改,将转换逻辑烘焙到工作人员本身(可以在您的应用程序代码中使用相同的类定义)。在 Couchbase 中,您可以创建 View (二级索引)或使用 Elastic Search 遍历特定类型的文档。如果您创建一个工作流系统,您可以与许多工作人员并行完成很多工作。

>>>> 当我进行转换时,我通常以非破坏性的方式将一个 json k/v 转换为另一个 json k/v,这样如果我在我的过程中出错,我不会改变原始数据。然后,如果我觉得有必要,我可以在稍后阶段删除旧的 json k/v“On Demand”。对于此类操作,这是一种更安全的方法。

附加

案例 1 和 2:数据转换

原始 JSON 文档

user::101        
{ 
  "uid": 1234,
  "type": user,
  "my_comment": "the quick brown fox jumped over the lazy dog"
  "version": 1.00
}

现在假设我想以一种非破坏性的方式更改它,我可以轻松地添加一个具有转换后数据的新 json 键:

user::101        
{ 
  "uid": 1234,
  "type": user,
  "my_new_comment": ["the quick brown fox jumped over the lazy dog", "comment2"]
  "my_comment": "the quick brown fox jumped over the lazy dog",
  "version": 1.01

}

注意它是非破坏性的,旧的 json key 仍然存在,或者我可以这样做,将旧数据保存为新 key ,并将预期的 json key 更改为新格式(数组)而不是字符串:

user::101        
{ 
  "uid": 1234,
  "type": user,
  "my_comment": ["the quick brown fox jumped over the lazy dog", "comment2"],
  "my_comment_v1.00": "the quick brown fox jumped over the lazy dog",
  "version": 1.01
}

显然,您可以使用多种不同的方案,具体取决于您的喜好。

关于nosql - 在无模式数据库中迁移数据格式的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473123/

相关文章:

java - Cassandra - CQLSSTableWriter 是否支持在一个 JVM 实例中同时写入多个列族?

javascript - 处理 meteor 集合中可变的键值对(无模式困境)

sqlite - 如何从Sqlite迁移到Couchbase?

python - 数据迁移和 AppEngine

java - 使用 REST API 进行 Couch 基础配置

redis - 当您在特定数据库上运行 `KEYS` 命令时,Redis 会锁定所有可用数据库吗?

mongodb - 如何更快地执行此 mongoDB 查找聚合?

cqrs - 将关系数据迁移到事件存储

couchbase - Schedulers.io() 和 Schedulers.computation() 之间有什么区别

couchdb - 沙发床和可能吗?