9

我很好奇其他人是如何解决在没有 DBA 的情况下跨许多(10 多个)开发人员维护和同步数据库更改的问题的?我的意思是,基本上,如果有人想对数据库进行更改,那么有哪些策略可以做到这一点?(即我已经创建了一个“汽车”模型,现在我想将适当的 DDL 应用到数据库等。)

我们主要是一家 Python 商店,我们的 ORM 是 SQLAlchemy。以前,我们编写模型的方式是使用 ORM 创建模型,但我们最近放弃了这种方式,因为:

  • 我们无法使用 ORM 跟踪更改
  • ORM 的状态与数据库不同步(例如,许多差异主要与索引和唯一约束有关)
  • 除非开发人员通过电子邮件向团队记录数据库更改,否则无法审核数据库更改。

我们对这个问题的解决方案基本上是让一个“看门人”个人检查数据库中的每一个更改并将所有已接受的数据库更改应用到一个accepted_db_changes.sql文件中,从而需要进行任何数据库更改的开发人员将他们的请求放入一个proposed_db_changes.sql文件中。我们签入这个文件,当它更新时,我们都将更改应用到我们开发机器上的个人数据库中。我们不会在模型上创建索引或约束,它们会显式应用于数据库。

我想知道维护数据库模式的一些策略是什么,以及我们的策略是否合理。

谢谢!

4

4 回答 4

2

解决方案是管理而不是技术:)

一般规则很简单,项目中应该只存在树状依赖关系: - 应该始终有一个单一的模式主源,与版本控制中的项目源代码一起存储 - 受主控更改影响的所有内容每次更新主源时都应自动重新生成源,绝不允许手动干预,如果自动生成不起作用 - 修复主源或生成器,不要手动更新源代码 - 所有重新生成都应该由更新主源的同一个人执行,包括主源更改在内的所有更改都应视为单个事务(单个源控制提交,每个受影响环境的单个构建/部署,包括数据库更新)

被强制执行,这将提供 100% 可靠的结果。

主源基本上有 3 种可能的选择 1) 数据库元数据,源是在数据库更新后由连接到实时数据库的某个工具生成的 2) 源代码,某个工具正在从源生成 SQL 方案,以特殊方式注释和然后 SQL 在 DB 上运行 3) DDL,SQL 模式和源代码都是由某个工具生成的 4) 使用了一些其他描述(比如由一个特殊的 Perl 脚本读取的文本文件,生成 SQL 模式和源代码)

1,2,3 同样好,前提是您需要的工具存在并且价格不高 4 是一种通用方法,但它应该从项目的一开始就应用,并且有几千行代码的开销一种奇怪的语言来维护

于 2010-05-04T19:02:50.140 回答
1

您可能会发现Refactoring Databases一书很有帮助,因为它包含管理数据库的一般策略,而不仅仅是如何重构它们。

他的系统希望每个开发人员都拥有自己的数据库副本以及在部署到生产之前使用的一些通用测试数据库。您的情况是本书描述的更简单的情况之一,因为您没有许多单独的应用程序使用数据库(尽管您确实需要知道如何描述数据库迁移的人)。最重要的是能够从源代码控制中的信息构建数据库,并通过小迁移描述更改(请参阅@WoLpH 的答案),而不仅仅是在数据库中进行更改。此外,如果您至少有 ORM <-> 数据库测试来检查它们是否仍然同步,那么您会发现事情更容易。

于 2010-05-06T23:07:50.123 回答
1

您是否尝试过SQLalchemy Migrate工具?

它们专门设计用于自动迁移您的数据库设计更改。

于 2010-05-01T16:00:22.977 回答
1

那么我假设您直接在物理数据库上设计数据库是否正确?多年前我曾经这样做过,但生成的数据库的质量很差。如果您使用建模工具(我个人认为 Sybase pdesigner 仍然是最好的品种,但环顾四周)每个人都可以对模型进行更改,并根据需要同步他们的本地数据库(它还会执行文档任务)。所以,re bobah 的帖子,master 是pdesigner 模型而不是物理数据库。

您的accepted_db_changes.sql文件是一个巨大的更改脚本列表吗?我不确定我是否喜欢更改文件名等的想法。鉴于两个数据库版本之间的区别是更改脚本的顺序列表,那么像这样的模型怎么样:

Ver1 (folder)
  Change 1-1.sql
  Change 1-2.sql
  Change 1-3.sql
Ver2 (folder)
  Change 2-1.sql
  Change 2-2.sql
  Change 2-3.sql

在提交之前审查每个更改(新文件)的位置。

一般规则应该是有意识地努力在您的开发环境中尽可能多地自动化数据库部署;我们在这项工作上获得了可观的投资回报率。您可以使用 redgate 之类的工具来生成您的 ddl(它有一个 api,但不确定它是否适用于 SQLAlchemy)。IMO,数据库更改应该是微不足道的,如果您发现它们正在阻塞,那么看看您可以自动化什么。

于 2010-05-05T10:17:03.173 回答