面向文档的数据库 - 如果文档定义的改变是什么?
-
27-09-2019 - |
题
据我了解,你可以输入任何非结构化信息转化为面向文档的数据库。让我们想象一下这样一个文件:
{
name: 'John Blank',
yearOfBirth: 1960
}
后来,在一个新的版本,该结构被重构到
{
firstname: 'John',
lastname: 'Blank',
yearOfBirth: 1960
}
如何与文档面向数据库做到这一点?你有准备合并的脚本,即改变数据库中的所有条目?还是有更好的方法可以处理结构的变化?
解决方案
重构这里意味着有一个从旧模式到新模式的确定性映射。因此,最有效的办法是做同样的事情,你会做一个SQL数据库和实际更新的文件。
文档导向的数据库给你做一个选择,虽然这取决于其DODB以及如何你使用它的前端。这种选择是简单地离开这个数据本身,并支持“老字号”定义你的应用程序作为一种向后兼容性选项。换句话说,你正在做的即时这些翻译,而不是永久的一次性更新。
这是不是真的有一个SQL数据库的选择,因为你必须保持过时的列上,并可能索引。随着DODB,你没有真正浪费任何数据或索引空间。你不得不权衡的缺点优点。
的主要缺点是,很明显,不一致,这可以随时间增长而导致的错误。另一个缺点是可能在即时,或者不能有效利用新的结构这样的计算费用(例如,您可能希望指数只是lastname
)。因此,大部分的时间,我想我会选择只运行一个大规模更新。
有一个明显的优点但保留旧文件;如果你不能确定你的重构是完美的 - 例如,如果你的name
列中的数据并没有遵循一致的约定,也许在某些情况下,它的lastname, firstname
而在其他情况下,它的firstname lastname
而在其他情况下,它的company name
- 那么做你的即时转换,而不做一个永久的更新允许您优化映射随着时间的推移,这样你就可以使用时所使用的firstname
和lastname
领域,但回落到name
猜谜游戏的遗留数据。
如前所述,我大概预留特殊情况下,我不相信,我就可以得到“重构”正确的每个记录/文档第二个选项。尽管如此,它是提供给您的是,你真的不与其他类型的数据库的选项。
除了这两个,我没有看到任何其他明确的选择。这是一种二元决策的;要么你永久更新现有的数据,也可以没有。