ORM 和 ODM 的区别是什么?

我试图找出 ORM 和 ODM 之间的区别,就我对这个概念的理解而言,ORM (对象关系映射器)映射数据之间的关系,而 ODM (对象文档映射器)处理文档。我假设 mySQL 是 ORM 的一个例子,MongoDB 是 ODM 的一个例子,对吗?

我相信你们也看到了,我对这个概念的理论不太熟悉。有人能澄清一下这两者之间的区别吗?

81066 次浏览

MySQL 就是一个关系数据库的例子——你可以使用 ORM 在代码中的对象和数据的关系表示之间进行转换。

ORM 的例子是 冬眠实体架构衣冠楚楚和更多..。

MongoDB 是一个文档数据库的例子——你可以使用 ODM 在代码中的对象和数据的文档表示之间进行转换(如果需要的话)。

Mandango 是 MongoDB 的 ODM 示例。

对象模型和关系数据库之间的 ORM 映射。对象模型和文档数据库之间的 ODM 映射。MySQL 不是 ORM,它是一个关系数据库,更确切地说,是一个 SQL 数据库。MongoDB 不是 ODM,它是一个文档数据库。

实际上,ORM 使用 SQL 数据库驱动程序(如 ODBC、 JDBC 或 OLEDB)将对象符号转换为关系符号,而 ODM 使用 JSON 或 JSONB api 将对象符号转换为文档符号。

在引擎盖下有不同种类的实现。

PS: JSONB 是以 MongoDB 使用的二进制格式存储的 JSON 文本文档符号。

Mongoose 是 MongoDB 的 ODM (对象数据模型)的一个很好的例子,在这个例子中,您可以直接对对象执行操作,并将其转换为适当的查询和模式。 你可以在这里的 https://mongoosejs.com/找到它

为了理解 ORM 和 ODM 之间的区别,我认为首先回顾一下关系数据库和文档数据库之间的区别会有所帮助。我将以一种手摇的方式来做这件事。

关系数据库是你可能已经习惯使用的一种,它将数据存储在表格中,如下所示:

enter image description here

关系数据库的常见例子有 MySQL、 Postgres 和 SQLite,要查询一个关系数据库,你需要使用 SQL。

那么文档数据库呢? 对于文档数据库,数据存储在 JSON 中,而不是表中。

enter image description here

事实上,这并不是100% 准确。 MongoDB 解释:

文档以字段-值对的形式存储数据。值可以是各种类型和结构,包括字符串、数字、日期、数组或对象。文档可以以 JSON、 BSON 和 XML 等格式存储。

好的,那么现在,什么是 ORM,什么是 ODM,它们是如何比较的?

ORM 代表... 实际上,我会让 这个答案解释:

对象关系映射(ORM)是一种使用面向对象的范例从数据库中查询和操作数据的技术。当谈到 ORM 时,大多数人指的是一个实现了对象关系映射技术的库,因此有了“一个 ORM”这个短语。

基本上,在您的应用程序代码中,您通常是在处理对象。但是在您的数据库中,您有表。ORM 是在两者之间映射的库。维基百科 解释:

这实际上创建了一个可以在编程语言中使用的“虚拟对象数据库”。

这里有一个例子。活动记录是 Ruby on Rails 的流行 ORM。使用活动记录,您可以执行类似于 User.find_by(name: 'David')的操作,然后返回类似于 { id: 1, name: 'David' }的操作。因此,ORM 正在为您执行以下映射:

enter image description here

然后使用 ODM,除了文档数据库之外,它基本上做同样的事情。它从应用程序代码中的对象映射到数据库中的文档。猫鼬是 ODM 的一个很好的例子。它与 MongoDB 一起工作。

Mongoose 是 ODM 的一个示例,它在对象模型和 MongoDB 之间映射。Mongoose 在模型类的集合中提供了许多用于查询和编辑文档的函数,还提供了一个丰富的查询类来进行手动查询。

Sequelize 是 ORM 的一个现代示例,它在对象模型和 SQL DB 之间映射。Sequelize 适用于许多关系数据库,如 Postgres、 MariaDB、 SQLite、 MySQL、 Oracle 和 SQLServer。Sequelize 与 Mongoose 有一个非常相似的接口,首先在 TypeScript 中将表(而不是集合)定义为模型。