声明式模式管理
声明式模式管理概念解释
许多数据库模式(schema)管理工具都创建了命令式(imperative)接口,要求开发人员了解模式的当前状态,以及将当前模式(和相关数据)迁移到新的、需要的模式的最佳命令。本文将介绍这个模型比较困难的几个原因。本文提出了一个声明式(declarative)接口来取代传统的命令式接口,并解释了这种更改带来的好处和挑战。
使用声明式管理数据库模式有很多好处,包括:
- 能够坚持变更管理流程
- 可重复部署到新环境
- 与意外的和新的运行时的兼容性
只定义当前状态
在声明式模型中,只定义模式的当前状态。声明式模式管理应用程序负责生成将模式从任何先前状态迁移到所需状态所需的命令。仅存储当前状态的好处是,在创建新环境或实例时不需要使用先前使用的数据库扩展、表和功能。
不需要学习 DDL
传统的数据库引擎通过一个称为 DDL(数据定义语言)的 SQL 语句子集来接收模式更改。开发人员不需要了解他们所针对的每个数据库引擎的 DDL 的细微差别。根据数据库的功能和状态,从统一的声明式模型转换到适当的 DDL 命令可以通过编程的方式进行处理。
策略和最佳实践
如果数据库模式管理采用了声明式,就可以在应用之前根据一组策略验证模式。对于只存储迁移脚本的命令式工具来说,这是不容易实现的。有了所需的完整状态,就可以根据一组规则评估数据库模式,以确保执行策略和最佳实践。
数据迁移
比较数据迁移和模式迁移
有两种类型的迁移需要管理和部署:
- 模式迁移
- 数据迁移
模式迁移
模式迁移可以用 SQL 语法表示,并改变数据库的结构。这些通常是新表、更改列、更改索引数据等等。这些通常是编写的,并且总是可以用幂等(idempotent)语法表示。不同的数据库引擎对如何应用这些规则执行不同的规则。例如,MySQL 不允许在事务中执行模式迁移,而 Postgres 可以。模式管理通常是数据库特有的。SchemaHero[1]专注于处理模式迁移。
数据迁移
在较少的情况下,开发人员必须将一些数据迁移到数据库中的新格式。这可能涉及计算新列并编写它,或者在代码中创建新值并插入它们。许多传统的数据库管理工具将模式迁移和数据迁移的任务混合到一个工具中。
SchemaHero 目前专注于模式迁移,并计划在未来支持数据迁移。
当考虑向项目中添加数据迁移时,通常有一种方法可以通过不同的更新实现相同的结果。
SchemaHero 路线图
SchemaHero 是一个早期项目,有很多工作要做。我们的路线图旨在增加与现有基础设施和系统的兼容性,以便创建额外的用例,并在各种环境中获得反馈并采用 SchemaHero。
详细的 SchemaHero 路线图通过 SchemaHero GitHub 仓库的路线图项目[2]维护。
短期路线图
短期路线图(6-12 个月)的重点是提高 SchemaHero 与各种生产环境之间的兼容性。这段时间的目标是看到 SchemaHero 在更多的环境中被采用,并发现阻止使用 SchemaHero 管理数据库模式的问题。
- 额外的数据库引擎支持
- 额外的机密和凭据管理支持
- 工作流支持(变更管理过程)
- 支持非 Kubernetes 部署(Heroku、CI/CD 部署、RDS 等)
长期路线图
在我们验证了 SchemaHero 是有用的,并将被软件开发人员采用来管理数据库模式之后,我们将转向长期路线图。长期路线图是我们希望看到的项目,现在只是一些想法。这些扩展了 SchemaHero API 的领域和核心功能。
一些想法包括:
- 在数据库引擎之间迁移(例如 Postgresql -> CockroachDB)
- 基于负载(索引、键等)自动优化表模式
- 为灾难恢复管理数据库备份
关于 SchemaHero 社区
如果你是 SchemaHero 的新手,作为贡献者开始的一个好地方就是GitHub 仓库[3]中的good first issue[4]或需要帮助的问题[5]。
此外,以下对于跟踪新闻、更新和社区请求非常重要:
- 在 Twitter 上关注我们@schemahero[6]。
- 在 Kubernetes Slack 的#schemahero[7]上聊天、提问或分享你是如何使用 SchemaHero。
- 参与社区活动。我们正在努力安排一次定期的社区会议。如果你想收到邀请,请在#schemahero 告诉我们。
参考资料
[1]
SchemaHero: https://schemahero.io/
[2]
路线图项目: https://github.com/schemahero/schemahero/projects/2
[3]
GitHub 仓库: https://github.com/schemahero/schemahero
[4]
good first issue: https://github.com/schemahero/schemahero/issues?q=is:open is:issue label:"Good first issue"
[5]
需要帮助的问题: https://github.com/schemahero/schemahero/issues?q=is:open is:issue label:"Help wanted"
[6]
]@schemahero: https://twitter.com/schemahero
[7]
#schemahero: https://kubernetes.slack.com/messages/schemahero