您应该如何从源代码控制构建数据库?

2024-04-02

SO 社区 wiki 上有一些关于数据库对象是否应该进行版本控制的讨论。然而,我还没有看到太多关于为数据库对象创建构建自动化过程的最佳实践的讨论。

对于我的团队来说,这一直是一个有争议的讨论点 - 特别是因为开发人员和 DBA 在评估数据库部署自动化方法的好处和风险时通常有不同的目标、方法和关注点。

我想听听 SO 社区关于哪些实践在现实世界中有效的想法。

我意识到哪种做法​​真正最好是有点主观的,但我认为关于什么工作的良好对话可能对很多人都有帮助。

以下是我对本主题关注领域的一些预告问题。这些并不是一个明确的列表,而是一个帮助人们理解我正在寻找的内容的起点。

  1. Should both test and production environments be built from source control?
    • 两者都应该使用自动化来构建 - 还是应该通过从稳定的最终测试环境复制对象来构建生产?
    • 您如何处理部署脚本中测试环境和生产环境之间的潜在差异?
    • 如何测试部署脚本在生产中是否像在测试中一样有效?
  2. What types of objects should be version controlled?
    • 只是代码(过程、包、触发器、java 等)?
    • Indexes?
    • 限制?
    • 表定义?
    • 表更改脚本? (例如,更改脚本)
    • 一切?
  3. Which types of objects shouldn't be version controlled?
    • 序列?
    • Grants?
    • 用户帐户?
  4. How should database objects be organized in your SCM repository?
    • 您如何处理一次性的事情,例如转换脚本或 ALTER 脚本?
    • 如何处理从数据库中退休的对象?
    • 谁应该负责促进对象从开发到测试级别?
    • 您如何协调多个开发人员的变更?
    • 如何处理多个系统使用的数据库对象的分支?
  5. What exceptions, if any, can be reasonable made to this process?
    • 安全问题?
    • 存在去识别化问题的数据?
    • 无法完全自动化的脚本?
  6. How can you make the process resilient and enforceable?
    • 开发者错误?
    • 意想不到的环境问题?
    • 用于灾难恢复?
  7. How do you convince decision makers that the benefits of DB-SCM truly justify the cost?
    • 传闻?
    • 行业研究?
    • 行业最佳实践建议?
    • 向公认的权威机构提出上诉?
    • 成本效益分析?
  8. Who should "own" database objects in this model?
    • 开发商?
    • DBAs?
    • 数据分析师?
    • 超过一个?

以下是对您的问题的一些回答:

  1. Should both test and production environments be built from source control? YES
    • 两者都应该使用自动化来构建 - 还是应该通过从稳定的最终测试环境复制对象来构建生产?
    • 两者的自动化。不要在环境之间复制数据
    • 您如何处理部署脚本中测试环境和生产环境之间的潜在差异?
    • 使用模板,这样实际上您将为每个环境生成不同的脚本集(例如对外部系统、链接数据库的引用等)
    • 如何测试部署脚本在生产中是否像在测试中一样有效?
    • 您在预生产环境中测试它们:在生产环境的精确副本(数据库和可能的其他系统)上测试部署
  2. What types of objects should be version controlled?
    • 只是代码(过程、包、触发器、java 等)?
    • Indexes?
    • 限制?
    • 表定义?
    • 表更改脚本? (例如,更改脚本)
    • 一切?
    • Everything, and:
      • 不要忘记静态数据(查找列表等),因此您不需要在环境之间复制任何数据
      • 仅保留数据库脚本的当前版本(当然是版本控制的),并且
      • 存储ALTER脚本:1个大脚本(或名为001_AlterXXX.sql的脚本目录,以便以自然排序顺序运行它们将从版本A升级到B)
  3. Which types of objects shouldn't be version controlled?
    • 序列?
    • Grants?
    • 用户帐户?
    • 请参阅 2。如果您的用户/角色(或技术用户名)在环境之间不同,您仍然可以使用模板编写它们的脚本(请参阅 1。)
  4. How should database objects be organized in your SCM repository?
    • 您如何处理一次性的事情,例如转换脚本或 ALTER 脚本?
    • see 2.
    • 如何处理从数据库中退休的对象?
    • 从数据库中删除,从源代码控制主干/提示中删除
    • 谁应该负责将对象从开发提升到测试级别?
    • 开发/测试/发布时间表
    • 您如何协调多个开发人员的变更?
    • 尽量不要为每个开发人员创建单独的数据库。你使用源代码管理,对吗?在这种情况下,开发人员更改数据库并签入脚本。为了完全安全,请在夜间构建期间从脚本重新创建数据库
    • 如何处理多个系统使用的数据库对象的分支?
    • 艰难的一件事:不惜一切代价尽量避免。
  5. What exceptions, if any, can be reasonable made to this process?
    • 安全问题?
    • 不要存储测试/生产的密码。您可以允许开发人员使用它,特别是如果您每天/每晚都自动进行数据库重建
    • 存在去识别化问题的数据?
    • 无法完全自动化的脚本?
    • 使用发布信息/ALTER 脚本记录并存储
  6. How can you make the process resilient and enforceable?
    • 开发者错误?
    • 从头开始进行每日构建测试,并将结果与​​增量升级(使用 ALTER 从版本 A 升级到版本 B)进行比较。比较结果模式和静态数据
    • 意想不到的环境问题?
    • 使用版本控制和备份
    • 将 PROD 数据库架构与您想象的进行比较,尤其是在部署之前。 SuperDuperCool DBA 可能已经修复了您的票证系统中从未存在的错误:)
    • 用于灾难恢复?
  7. How do you convince decision makers that the benefits of DB-SCM truly justify the cost?
    • 传闻?
    • 行业研究?
    • 行业最佳实践建议?
    • 向公认的权威机构提出上诉?
    • 成本效益分析?
    • 如果开发人员和 DBA 同意,我认为你不需要说服任何人(除非你需要钱购买像dbGhost http://www.innovartis.co.uk/products/products.aspx对于 MSSQL)
  8. Who should "own" database objects in this model?
    • 开发商?
    • DBAs?
    • 数据分析师?
    • 超过一个?
    • 通常 DBA 会批准模型(在签入之前或作为代码审查的一部分之后)。他们肯定拥有与性能相关的对象。但总的来说,团队拥有它[当然还有雇主:)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您应该如何从源代码控制构建数据库? 的相关文章

  • “单词的正则表达式”(语义替换)-任何示例语法和库吗?

    我正在寻找在给定过程语言的情况下对单词而不是字符进行正则表达式样式转换的常用技术的语法示例 例如 为了追踪复制 人们可能想要创建一份具有相似含义但具有不同单词选择的文档 我希望能够简洁地定义这些可以应用于文本流的可能的转换 例如 快速地no
  • Python Twisted 和数据库连接

    我们的工作项目包括同步应用程序 短期 和异步 Twisted 应用程序 长期 我们正在重构我们的数据库 并将构建一个 API 模块来解耦该模块中的所有 SQL 我想创建该 API 以便同步和异步应用程序都可以使用它 对于同步应用程序 我希望
  • Git:如何使外部存储库和嵌入式存储库作为通用/独立存储库工作?

    我有一个大项目 比方说A repo 其中有一个子文件夹来自B repo 当我提交时 我会遇到如下警告A repo warning adding embedded git repository extractor annotator serv
  • ORDER BY id 或 date_created 显示最新结果?

    我有一个表 实际上有几个 我想首先从中获取最新条目的结果 这是我的ORDER BY条款选项 date created INT 从不改变值 id 当然是INT AUTO INCRMENT 两列应同等地代表记录插入的顺序 我自然会使用date
  • 如何列出表中的所有列?

    对于各种流行的数据库系统 如何列出表中的所有列 对于 MySQL 请使用 DESCRIBE name of table 只要您使用 SQL Plus 或 Oracle 的 SQL Developer 这也适用于 Oracle
  • 如何在 PHP MYSQL 中将数据库表和每条记录从一台数据库服务器复制到另一台数据库服务器?>

    您好 我编写了一段代码 可以将数据库表从一个服务器复制到另一个服务器 但是每个表的记录没有复制 如何编写一个可以将表和每个记录从一个数据库服务器复制到另一个数据库服务器的函数 这是我的示例代码
  • 有很多数据库视图可以吗?

    我很少 每月 每季度 使用 Microsoft SQL Server 2005 数据库视图生成数百份 Crystal Reports 报告 在我不读取这些视图的所有时间里 这些视图是否会浪费 CPU 周期和 RAM 因为我很少从视图中读取数
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto
  • 将 Access 数据库转换为 SQL Microsoft DTS - 数据类型“130”不在映射文件中

    我正在尝试将大型 Access mdb 数据库导出到 SQL Server 数据库 但遇到了 Microsoft DTS 无法识别 Access 数据库中特定类型字段的数据类型的问题 我查看了相关的访问表 它们被设置为长度为 1 的 文本
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 具有多个主键的 SQLAlchemy 不会自动设置任何

    我有一个简单的表 class test Base tablename test id Column Integer primary key True title Column String def init self title self
  • SQL Server 大小写/排序规则问题

    今天我在客户数据库中遇到了一个奇怪的情况 SQL Server 2005 数据库排序规则不区分大小写 因此我可以使用任何大小写编写 SQL 查询 没有任何问题 除了一个 一张特定表中的一个特定列称为 DeadZone 如果我这样查询 从表名
  • 如何将彼此“接近”的纬度/经度点分组?

    我有一个用户提交的纬度 经度点的数据库 并且正在尝试将 接近 点分组在一起 接近 是相对的 但目前看来约为 500 英尺 起初 我似乎只能按前 3 个小数位具有相同纬度 经度的行进行分组 大约是一个 300x300 的盒子 了解当您远离赤道
  • SQL Server 批量插入 - “批量加载数据转换错误”

    bulk insert dbo A FROM d AData csv WITH FIELDTERMINATOR ROWTERMINATOR n 将批量数据插入数据库时 在检查可疑数据后 我遇到了无法解释的错误 消息 4867 16 级 状态
  • Riak 在 MapReduce 查询中失败。使用哪种配置?

    我正在与 riak riak js 结合开发一个 nodejs 应用程序 并遇到以下问题 运行此请求 db mapreduce add logs run 正确返回存储在存储桶日志中的所有 155 000 个项目及其 ID logs 1GXt
  • 通过 SQLAlchemy 获取随机行

    如何使用 SQLAlchemy 从表中选择一个或多个随机行 这在很大程度上是一个特定于数据库的问题 我知道 PostgreSQL SQLite MySQL 和 Oracle 具有通过随机函数排序的能力 因此您可以在 SQLAlchemy 中
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con

随机推荐