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