Sequelize 与 Prisma

开始

目前在 eBay,我正在将我们的内部工具从使用 MongoDB 迁移到 Postgres。这是一个非常困难的项目,但我很兴奋要迎难而上。在研究过程中,我确定对于我们的代码库来说,使用 ORM 会是最佳选择,因为该代码库最初就是为使用 Mongoose 而设计的。但现在的问题是,哪一个 ORM 最适合我们的代码库?在这篇博客中,我将深入探讨这个问题。请注意,由于我与雇主的接触性质,我不能在这篇博客中披露所有内容。

要求

经过对项目需求的仔细分析,我确立了以下任何 ORM 解决方案都必须满足的基本标准:

  • 作为一个 JavaScript 包;因为大部分代码都是用 JavaScript 编写的
  • 必须支持 Postgres 及其大多数特性
  • 其性能必须至少与 Mongoose 持平,或者更好
  • 必须是开源且有人维护

ORM

经过大量研究,我确定最符合这些要求的前三个 ORM 是:SequelizePrismaTypeORM。我最终决定只关注 Sequelize 和 Prisma,因为由于截止日期的限制,我没有时间完整测试三个不同的 ORM。

测试环境

在我的测试环境中,我通过 Docker 运行 Postgres。我取出了我们最大、最复杂的数据集,将其从文档结构转换为表结构,并将其添加到我的本地 Postgres 实例中。我通过使用列、一对一关系、一对多关系以及一些 JSONB 列来转换该数据集。

从那里开始,我会编写使用特定 ORM 的 JavaScript 代码并测量:

  • 创建一条记录需要多长时间
  • 更新一条记录需要多长时间
  • 更新一个嵌套记录需要多长时间(关系和/或 JSON 中的键值)
  • 删除一条记录需要多长时间
  • 查询/获取一条记录需要多长时间

我为每个 ORM 测试环境都创建了仓库。我很想分享这些仓库,但它们在技术上属于 eBay,所以我不能分享它们。

结果

大约在 2023 年 5 月 15 日,我决定 Sequelize 是更适合我们用例的 ORM,并且它将用于我们从 MongoDB 到 Postgres 的迁移。最终,我选择 Sequelize 是因为:

  • 它是真正“开源的”,并且不是由一家有资金支持的初创公司维护的。
  • 支持 Postgres 的大多数特性。
  • 性能很好,尤其是与 Prisma 相比。
  • 文档很好,尽管没有 Prisma 的文档那样完善。

我最终选择了 Sequelize,但我也为我测试的每个 ORM 编写了优缺点列表,希望它能帮助人们更好地判断 Sequelize 或 Prisma 是否适合你的用例。

Sequelize 的优缺点

优点:

  • 有一个 sync() 函数,可自动为你创建和处理表
  • 可以处理复杂的连接(嵌套数据)
  • 支持很多过滤选项(例如 Regex)
  • 模型/架构表示是用原生 JavaScript 中的类来完成的,因此具有高度可定制性。
  • Sequelize 会为你所选的数据库处理连接。
  • Sequelize 支持多个读取连接
  • 支持原始 SQL 查询。
  • 截至 2023 年 5 月 15 日:
    • 在 NPM 上,Sequelize 最后更新于“14 天前”,每周下载量为 1,505,835。
    • 在 GitHub 上,Sequelize 最后更新于“昨天”,有 4.2k 个 Fork,27.9k 个 Stars。
    • Sequelize 采用 MIT 许可证,并且开源已超过 10 年。因此,在可预见的未来,它很可能仍将保持开源。

缺点:

  • 模型/架构表示可能会变得非常复杂且臃肿。例如,我们大型数据集的 Mongoose 表示大约有 262 行(包括空格)。通过 Sequelize 表示的同一数据集有 564 行(包括空格)。
  • Sequelize 的语法在某些情况下会变得非常令人困惑且复杂。
  • 迁移你的数据库(编辑它)非常麻烦。你可以使用 sequelize-cli 生成 JavaScript 迁移模板脚本。但是,这似乎几乎适用于所有 ORM。在大多数情况下,关系型数据库中的迁移并不容易。
  • 文档并不是很好。它已经有所改进,但仍然需要努力。不过有了像 ChatGPT 这样的工具,这不再像以前那样是个大问题,因为 ChatGPT 对 Sequelize 有非常好的理解,这很可能是因为 Sequelize 已经存在十年了。
  • 与 Prisma 相比,Sequelize 对类型没有那么敏感,这可能会导致问题。
  • 它对 TypeScript 的支持不好,这对我的项目来说不是问题,但对许多其他项目来说可能是个大问题。

Prisma 的优缺点

优点:

  • 有自己的 schema 语言。这意味着你可以更轻松、更干净地制作你的 schema/model。例如,我们大型数据集的 Mongoose 表示大约有 262 行(包括空格)。但同一数据集用 Prisma 表示时只有 221 行(包括空格)。
  • Prisma 有一个 CLI 工具,使创建和迁移(修改)数据库更容易。这非常方便。它不是万能灵药,但这是我迄今为止从 ORM 中看到的最好的东西。
  • 支持原始 SQL 查询。
  • Prisma 的代码简洁明了。你仍然需要学习并理解 Prisma 的语法,但它比 Sequelize 的语法容易理解得多。
  • Prisma 有一个客户端,会为 Node.js 和 TypeScript 自动生成查询构建器。
  • 文档非常非常好,而且很干净。ChatGPT 仍然可以帮忙,但它关于 Prisma 的更新程度不如它关于 Sequelize 的更新程度高。
  • 截至 2023 年 5 月 15 日:
    • 在 NPM 上,Prisma 最后更新于“6 天前”,每周下载量为 1,344,705。
    • 在 GitHub 上,Prisma 最后更新于“3 小时前”,有 1.1k 个 Fork,31.3k 个 Stars。

缺点:

  • 不支持 Postgres 的 Regex 过滤,但确实有 “contains”、“includes” 和 “startsWith” 过滤选项。
  • 根据我的测试,Prisma 在 Postgres 中创建我们大型数据集的条目时明显更慢。Sequelize 创建这些大型条目的速度约为每个条目 2.26 秒(JSON 文件)。而 Prisma 的速度约为每个条目 11.21 秒(JSON 文件)。根据这些结果,Prisma 在这项任务上比 Sequelize 慢大约 5 倍。
  • 此外,从大型数据集中删除一条记录会导致近 4 分钟的等待时间,这非常非常糟糕。
  • 在我的测试中,Sequelize 删除最大且最复杂的数据集中的一条记录要快得多。在数据集的构建方面,Sequelize 并没有比 Prisma 更有优势。两者都必须处理这个大型数据集的三层深度关系,所以我认为这是一次公平的比较。
  • Prisma 是一家初创公司,这意味着 Prisma 是一家获得了 5650 万美元融资的营利性公司。了解这一点后,Prisma 的主要 ORM 代码/包是采用 Apache-2.0 许可证的开源项目。这很好,但由于 Prisma 有投资者,如果他们在许可证方面效仿 MongoDB,我也不会感到惊讶。

来源