rob*_*kuz 5 database schema document
在我开始之前,我想为我的问题的相当普遍的类型道歉 - 我确信整本书可以写在那个特定主题上.
让我们假设您有一个包含多个文档模式的大型文档数据库,以及每个模式的数百万个文档.在应用程序的生命周期中,需要经常更改已存储文档的模式(和内容).
这样的改变可能是
我我在这里我们使用了SQL数据库,我们在导致一些显著的离线时间(24/7产品)时的变化成为了激烈的SQL数据块通常会做一个表上的LOCK发生更改时一些非常相似的challanges最后一个项目.我想避免这种情况.
另一个相关问题是如何在使用的编程语言环境中处理模式更改.通常通过更改类定义来发生模式更改(我将使用Mongoid为MongoDB和Ruby使用OR-Mapper).如何处理不符合我最新类定义的旧版本文档.
这是一个非常好的问题.
作为MongoDB的面向文档的数据库的优点是来自同一集合的文档不需要具有相同的字段.具有不同的字段本身不会引发错误.它被称为灵活性.出于同样的原因,它也是一个不好的部分.
所以问题和解决方案都来自您的应用程序的逻辑.
假设我们有一个模型Person,我们想要添加一个字段.目前在数据库中我们已经节省了5.000.000人.问题是:我们如何添加该字段并减少停机时间?
可能的方法:
更改应用程序的逻辑,以便它可以处理具有该字段的人和没有该字段的人.
编写一个任务,将该字段添加到数据库中的每个人.
使用新逻辑更新生产部署.
运行脚本.
因此,唯一的停机时间是重新部署所需的几秒钟.尽管如此,我们需要花时间学习逻辑.
所以基本上我们需要选择哪个更有价值的正常运行时间或我们的时间.
现在假设我们要重新计算增值税等字段.我们不能像以前那样做,因为有一些产品含有增值税A而其他产品含有增值税B没有意义.
因此,一个可能的解决方案是:
更改应用程序的逻辑,以便显示VAT值正在更新并禁用可能使用它的操作,例如购买.
编写脚本以更新所有VAT值.
使用新代码重新部署.
运行脚本.完成后:
使用完整的操作代码重新部署.
所以没有绝对的停机时间,只是部分关闭部分细节.用户可以继续看到产品的描述并使用应用程序的其他部分.
现在让我们说,我们想放弃一个字段.这个过程与第一个过程几乎相同.
现在,将字段移动到嵌入文档中; 那是一个很好的!这个过程与第一个类似.但是,不是检查字段的存在,而是检查它是嵌入文档还是字段.
结论是,使用面向文档的数据库,您可以获得很大的灵活性.因此,您可以拥有优雅的选择.您是否使用它取决于您是否更重视开发时间或客户的时间.
| 归档时间: |
|
| 查看次数: |
1074 次 |
| 最近记录: |