Sequelize 与 Prisma
开始
目前在 eBay,我正在将我们的内部工具从使用 MongoDB 迁移到 Postgres。这是一个非常困难的项目,但我很高兴能够迎头赶上。在研究过程中,我确定对于我们的代码库,使用 ORM 是最好的选择,因为代码库已经设计为使用 Mongoose。但现在的挑战是,哪个 ORM 对我们的代码库最合适?在这篇博客中,我将深入探讨这个问题。请注意,由于与雇主的联系性质,我无法在这篇博客中披露所有内容。
需求
经过对项目需求的仔细分析,我确定了任何 ORM 解决方案需要满足的以下基本标准:
- 必须是一个 JavaScript 包;因为大部分代码是用 JavaScript 编写的
- 必须支持 Postgres 及其大部分功能
- 性能必须至少与 Mongoose 相当或更好
- 必须是开源并且得到维护
ORM
经过大量研究,我确定符合这些要求的前三个 ORM 是:Sequelize、Prisma 和 TypeORM。最终,我决定只专注于 Sequelize 和 Prisma,因为由于截止日期,我没有时间全面测试三种不同的 ORM。
测试环境
在我的测试环境中,我通过 Docker 运行 Postgres。我抓取了我们最大和最复杂的数据集,将其从文档结构转换为表结构,并将其添加到我的本地 Postgres 实例中。我通过使用列、一对一关系、一对多关系和一些 JSONB 列来转换数据集。
从那里,我将编写使用特定 ORM 的 JavaScript 代码并测量:
- 创建一个条目需要多长时间
- 更新一个条目需要多长时间
- 更新一个嵌套条目(关系和/或 JSON 中的键值)需要多长时间
- 删除一个条目需要多长时间
- 查询/获取一个条目需要多长时间
我为每个 ORM 测试环境创建了仓库。我很想分享这些仓库,但它们在技术上属于 eBay,所以我不能分享。
结果
在 2023 年 5 月 15 日左右,我决定 Sequelize 是我们用例中更好的 ORM,并且它将是我们从 MongoDB 迁移到 Postgres 时使用的 ORM。最终,我选择了 Sequelize,因为:
- 它是“真正的开源”,并不是由一家获得资金的初创公司维护。
- 支持大部分 Postgres 的功能。
- 性能良好,尤其是与 Prisma 相比。
- 文档很好,尽管没有 Prisma 的文档那么完善。
我选择了 Sequelize,但我也为我测试的每个 ORM 制作了一个优缺点列表,希望这能帮助人们更好地判断 Sequelize 或 Prisma 是否适合他们的用例。
Sequelize 优缺点
优点:
- 有一个 sync() 函数,可以自动为您创建和处理表
- 可以处理复杂的连接(嵌套数据)
- 支持许多过滤选项(例如正则表达式)
- 模型/模式表示是用原生 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 优缺点
优点:
- 有自己的模式语言。这意味着您可以更轻松、更干净地创建您的模式/模型。例如,我们的大数据集的 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 的正则表达式过滤,但有“包含”、“包括”和“以…开头”的过滤选项。
- 根据我的测试,Prisma 在 Postgres 中创建我们的大数据集条目时显著较慢。Sequelize 创建这些大条目的速度约为每个条目 2.26 秒(JSON 文件)。而 Prisma 的速度约为每个条目 11.21 秒(JSON 文件)。根据这些结果,Prisma 在这项任务上比 Sequelize 慢约 5 倍。
- 此外,从大数据集中删除一个条目导致的等待时间接近 4 分钟,这非常糟糕。
- 在我测试的最大和最复杂的数据集中,Sequelize 删除一个条目的速度远快于 Prisma。在数据集的构建方面,Sequelize 并没有比 Prisma 有优势。两者都必须处理这个大数据集的三层深关系,所以我认为这是一个公平的比较。
- Prisma 是一家初创公司,这意味着 Prisma 是一家拥有 5650 万美元资金的盈利公司。知道这一点,Prisma 的主要 ORM 代码/包是开源的,采用 Apache-2.0 许可证。这很好,但由于 Prisma 有投资者,我不会感到惊讶,如果他们在许可证方面像 MongoDB 一样采取行动。
来源
- https://www.bitovi.com/blog/battle-of-the-node.js-orms-objection-prisma-sequelize
- https://www.prisma.io/docs/orm/more/comparisons/prisma-and-sequelize
- https://github.com/prisma/prisma
- https://github.com/sequelize/sequelize
- https://www.youtube.com/watch?v=rLRIB6AF2Dg
- https://www.youtube.com/watch?v=RebA5J-rlwg
- https://www.youtube.com/watch?v=a5Wh_LDXtLc
- https://www.youtube.com/watch?v=4QN1BzxF8wM