sql - 如何在生产中修改数据库模式
问题描述
当我开始一个敏捷过程的项目时,我的数据库没有完整的 DER,我如何对生产中已有数据的表进行更改。例如:
有表客户产品和销售,在开始销售表中只有列 id、costumerId、productId 和数量。但是将来我们需要更改此表,例如添加一个新列employeeId 以及浮点整数的数量。我可以在生产数据库上进行此更改还是需要创建一个中间表以不接触真实数据?
我举了一个简单的例子,但想想更大的事情,通过一些冲刺,没有人看到依赖......在这种情况下如何行动?
问候!
解决方案
这是一个常见的问题。有几种方法,其中一些取决于所使用的 DBMS。
关键提示:
- 不要对数据库中的元数据进行向后不兼容的更改。这意味着您可以向表中添加字段,但不能删除它并且(取决于)您不能重命名它。
- 如果你改变了字段的类型,那么,实际上,你添加一个新的字段,必须解决数据迁移的问题。这种解决方案的可能性及其实施方式取决于数据量。在数百万条记录中,这不是问题。特别是如果您的系统没有 SLA 99999。
- 第 1 段的后果。如果您在元数据中添加了一些内容,那么您不应该在提交工作负载后回滚这些更改。
- 您必须了解并使用数据库的功能。例如,Oracle 能够在具有不同结构的方案版本之间切换。您还可以使用视图在多个表上创建外观。它甚至可能支持 DML。
- 尝试制定一个提升您的 DB 和 APP 版本的计划。在常见情况下,您拥有数据库和一些与该数据库一起使用的应用程序。它们关系中更新 DB 和 APP 的顺序高度依赖于您的系统架构和 SLA。如果你可以有一个停机时间,那就容易多了,如果没有,那就是个问题。您可能希望独立于您的数据库来更新和回滚您的应用程序。在这种情况下,您必须在升级数据库版本时提供向后兼容性。新数据库更改“可以等待”新应用程序。
推荐阅读
- python-3.8 - Python 3.8 使用 PIP 下载包/模块错误
- c++ - 处理配置数据并发共享的最佳方式是什么
- mongodb - Mongodb索引,partialfilters是否也应该包含在索引中?
- python-3.x - 旋转图像以匹配第二张图像
- reactjs - React.js:父组件中的状态未更新
- traefik - tcp 子域的 Kubernetes tls
- javascript - 什么时候应该创建一个类,什么时候应该在 NodeJs 中创建一个函数?
- http - ASP.NET Core 自定义中间件重定向到操作不起作用
- appium - 如何在 Python 中正确关闭 Appium 驱动程序?
- java - 具有可选转换的 Java 流如何工作