分享到

简介

如果一个项目有多个开发人员参与,那么跟上开发数据库的更改可能具有挑战性。在整个开发团队中同步这些更改可能既繁琐又耗时。当不同的团队成员处理数据库模式或使用来自开发数据库的数据,而这些数据未能反映最新状态时,可能会导致沮丧,并导致错误最终进入生产环境。

特别是,以下情况可能会出现这些问题

  • 开发人员正在处理不同迭代的数据库模式
  • 开发数据库中的数据未能反映当前模式的状态

在本指南中,我们将研究团队可以使他们的数据库模式和开发数据保持最新并在团队之间同步的一些方法。

入职期间设置开发数据库

在数据库模式和开发数据的更改可以在团队成员之间共享之前,这些团队成员需要使用一些初始数据库状态进行引导。对于大多数团队来说,这是他们在开始处理项目时的入职流程的一部分。此流程的复杂程度很大程度上取决于组织的规模和成熟度及其需求。

大多数入职开发人员的起点是在本地克隆和安装项目。接下来,他们通常需要连接到开发数据库。新开发人员设置开发数据库最常见的两种方法是

  1. 运行脚本以种子化本地开发数据库
  2. 连接到共享的远程开发数据库

这两种方法都有其自身的优点和缺点。

种子化本地数据库

种子化本地数据库是有益的,因为它减轻了运行远程开发数据库的需求。开发人员可以在开始时更好地控制进入其开发数据库的数据。与使用共享远程数据库相比,他们还可以更轻松地重置数据库。

如果采用这种方法,则需要付出额外的努力来保持种子化数据和逻辑与当前模式同步更新。如果更改频繁发生,这可能会带来挑战,并可能导致开发人员无法顺利入职。

连接到共享的远程数据库

让开发人员连接到共享的远程开发数据库可以减轻在新开发人员本地填充数据库的负担。这可能很有帮助,因为它使初始入职更容易,使开发人员能够更快地提高工作效率。使用共享的远程数据库也可能是有益的,因为数据库的更改可以由单个开发人员定期迁移,然后这些更改可以被所有团队成员使用。

使用共享的远程开发数据库的缺点是它需要额外的资源来运行,可能会产生额外的成本。此外,如果所有开发人员都针对同一个数据库工作,则很容易覆盖数据。另一个潜在的问题是,如果团队成员异步采用模式更改,则带外更改可能会对数据状态产生负面影响,从而使其难以使用。

持续的数据库更新

无论是在本地还是远程,一旦开发人员设置了要使用的数据库,他们都需要持续检查数据库模式的更新,以及数据库本身中的数据。如果团队规模很大且更改频繁,这可能会很困难。

没有一种万能的方法可以使团队成员及时了解模式更改。适合您团队的正确方法取决于具体情况。

以下列表包含一些可以组合起来构建总体策略的方法,以便在您的团队中保持数据和模式更改同步。

使用迁移

在团队环境中使用关系数据库时,至关重要的是使用迁移作为数据库模式更改策略的起点。

数据库迁移是一组工件,通过自动化可以更改数据库的结构。最简单地说,迁移是一个 SQL 文件,其中包含应用模式更改所需的语句。例如,向数据库模型添加字段可能会生成以下 SQL 文件

ALTER TABLE User ADD bio varchar(255);

虽然单个开发人员可以在其本地开发环境的上下文中单独运行此命令,但将其作为数据库迁移文件存在,允许团队中的所有其他开发人员通过自动化应用完全相同的更改。

特定的数据库迁移策略因语言和框架而异。但是,一般来说,它们遵循类似的模式

  1. 更改描述数据库模型的代码
  2. 生成一组迁移文件
  3. 运行迁移以执行语句并使更改生效

通知团队成员更改

使用数据库迁移作为更改策略将有助于在团队成员之间保持数据库结构更改同步。但是,通知开发人员这些更改可能具有挑战性。

当两个或多个团队成员正在处理数据库模式的同一部分或使用模式给定部分的应用程序部分时,就会出现问题。这种情况很可能产生合并冲突并导致挫败感。

虽然这种情况最好通过改进团队沟通来解决,但技术可以在一定程度上提供帮助。

Git 钩子可用于在不同时间通知开发人员有关模式更改的信息。例如,可以在允许开发人员推送其更改之前,使用钩子检查已合并并应用到上游的模式更改。这可以帮助减轻合并冲突,并使团队更加同步。

可以使用 git-migration-hook 作为起点,将此行为编写脚本并应用于您团队的特定场景。

自动化数据同步

当数据库模式更改时,整个团队很可能需要重新种子化数据库,以使其中的数据遵守新模式。维护种子脚本、分发脚本并让团队中的每个人持续应用它可能很乏味。

自动化此过程的一种选择是使用提供数据库之间双向数据同步的服务。虽然这种服务更常用于同步远程生产数据库以用于各种目的,但它也可以用于跨团队同步开发数据。这样做允许团队使用他们自己的本地或远程开发数据库,这些数据库会不断更新。这种服务的一个例子是 Azure 的 SQL 数据同步

结论

在团队成员之间保持开发数据库更改同步可能是一项具有挑战性的任务。当团队快速行动并在同一模式上协作时,发生冲突的机会很多。

通过引入带有 Git 钩子和其他工具的工作流程以提供自动化,团队可以更轻松地保持模式更改和数据同步。

关于作者
Ryan Chenkie

Ryan Chenkie

Ryan 是一名全栈开发人员,对数据库和 API 特别感兴趣。他是 CourseLift 的创始人,CourseLift 是一个课程托管平台,可帮助作者进行营销和销售。