简介
如果一个项目有多个开发人员参与,那么跟上开发数据库的变更可能会很困难。在整个开发团队中同步这些变更可能很繁琐且耗时。当不同的团队成员在数据库 架构 上工作,或者使用来自开发数据库的与最新状态不一致的数据时,可能会导致挫折,并最终导致生产环境中的错误。
特别是在以下情况下,会出现这些问题
- 开发人员正在处理数据库架构的不同迭代
- 开发数据库中的数据不反映架构的当前状态
在本指南中,我们将介绍一些方法,使团队能够保持数据库架构和开发数据在团队之间保持最新状态和同步。
在入职过程中设置开发数据库
在将对数据库架构和开发数据的变更共享给团队成员之前,需要先用一些初始数据库状态对这些团队成员进行引导。对于大多数团队而言,这属于他们在开始参与项目时入职流程的一部分。此流程的复杂程度在很大程度上取决于组织的规模、成熟度及其需求。
对于大多数正在入职的开发人员而言,起点是克隆项目并在本地安装。接下来,他们通常需要连接到开发数据库。新开发人员设置开发数据库的两种最常见方式是
- 运行脚本以填充本地开发数据库
- 连接到共享的远程开发数据库
这两种方法都各有利弊。
填充本地数据库
填充本地数据库的好处是无需运行远程开发数据库。开发人员可以更好地控制进入其开发数据库的数据,以便他们可以开始工作。与使用共享的远程数据库相比,他们还可以更轻松地重置数据库。
如果采用这种方法,则需要付出额外的努力来保持填充数据和逻辑与当前架构的同步。如果变更频繁发生,这将是一个挑战,并可能导致入职流程不顺利。
如果您使用的是 Prisma Client,则可以使用 集成的填充功能 来轻松填充数据库。
连接到共享的远程数据库
让开发人员连接到共享的远程开发数据库可以减轻填充新开发人员数据库的本地负担。这很有帮助,因为它简化了初始入职流程,使开发人员能够更快地投入工作。使用共享的远程数据库可能也有益,因为数据库变更可以定期由单个开发人员进行迁移,然后所有团队成员都可以使用这些变更。
使用共享的远程开发数据库的缺点是需要额外的资源来运行,这可能会产生额外的成本。此外,如果所有开发人员都在使用同一个数据库,那么很容易覆盖数据。另一个潜在问题是,如果团队成员异步采用架构变更,则带外变更可能会对数据状态产生负面影响,从而难以使用。
持续数据库更新
无论是在本地还是在远程,一旦开发人员设置了要使用的数据库,他们就需要持续检查数据库架构的更新,以及数据库本身的数据更新。如果团队规模庞大且变更频繁,这可能很困难。
保持团队成员了解架构变更的最佳方法没有放之四海而皆准的方法。适合您团队的最佳方法取决于具体情况。
以下列表包含一些可以结合起来构建您团队架构和数据变更同步策略的方法。
使用迁移
在团队环境中使用 关系型数据库 时,使用 迁移 作为数据库架构变更策略的起点至关重要。
数据库迁移是一组工件,通过自动化可以改变数据库的结构。最简单的迁移就是一个包含应用架构变更所需语句的 SQL 文件。例如,向数据库模型添加一个字段可能会生成以下 SQL 文件
ALTER TABLE User ADD bio varchar(255);
虽然此命令可以在单个开发人员的本地开发环境中独立运行,但将其作为数据库迁移文件存在,可以让团队中所有其他开发人员通过自动化应用完全相同的更改。
具体数据库迁移策略因语言和框架而异。但是,一般来说,它们遵循类似的模式
- 更改描述数据库模型的代码
- 生成一组迁移文件
- 运行迁移以执行语句,并使更改生效
Prisma Migrate 使描述数据库模型并从中生成迁移变得容易。它提供了一种非常简单的方法来保持团队成员之间的数据同步。
通知团队成员变更
使用数据库迁移作为更改策略将有助于保持团队成员之间数据库结构更改的同步。但是,通知开发人员这些更改可能很困难。
当两个或多个团队成员正在处理数据库架构的同一部分或使用给定架构一部分的应用程序的同一部分时,就会出现问题。这种情况很可能导致合并冲突并造成沮丧。
虽然这种情况最好通过改进团队沟通来解决,但技术在一定程度上可以提供帮助。
Git hooks 可用于在不同时间通知开发人员有关架构更改的信息。例如,可以使用钩子来检查已合并并应用于上游的架构更改,然后再允许开发人员推送其更改。这有助于缓解合并冲突,并使团队更加同步。
此行为可以使用脚本编写并应用于团队的特定场景,使用 git-migration-hook 作为起点。
自动化数据同步
当数据库架构发生更改时,整个团队可能需要重新播种数据库,以便其中的数据符合新的架构。维护种子脚本、分发种子脚本并让团队中的每个人持续应用它可能很繁琐。
自动化此过程的一种选择是使用提供数据库之间双向数据同步的服务。虽然此类服务通常用于出于各种目的同步远程生产数据库,但它也可以用于跨团队同步开发数据。这样做可以让团队使用自己的本地或远程开发数据库,这些数据库会不断更新。此类服务的一个例子是 Azure 的 SQL 数据同步。
结论
保持团队成员之间开发数据库更改的同步可能是一项艰巨的任务。当团队快速移动并在同一个架构上进行协作时,发生冲突的机会很多。
通过引入使用 Git hooks 和其他工具来提供自动化的工作流,团队可以更轻松地保持架构更改和数据的同步。