ORM和ODM有什么区别?

Ody*_*3us 143 database orm odm

我试图找出ORM和ODM之间的区别,据我所知,ORM(对象关系映射器)映射数据之间的关系,其中ODM(对象文档映射器)处理文档.我是否正确假设mySQL是ORM的一个例子而MongoDB是ODM的一个例子?

我相信你可以看到,我对这个概念的理论并不太熟悉.有人可以澄清两者之间的差异吗?

Ode*_*ded 158

MySQL是关系数据库的一个示例 - 您可以使用ORM在代码中的对象和数据的关系表示之间进行转换.

奥姆斯的例子是NHibernate的,实体框架,小巧玲珑更多...

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

Mandango是MongoDB的ODM示例.

  • 您可以拥有混合ORM/ODM框架,例如[mORMot for Delphi](http://blog.synopse.info/post/2014/05/07/MongoDB-mORMot-ORM-ODM),[Doctrine for PHP](https ://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/introduction.html)或[Hibernate OGM for Java](http://hibernate.org/ogm/).一些SQL数据库对文档有很强的支持,例如具有[JSON或JSONB数据类型](http://www.postgresql.org/docs/devel/static/datatype-json.html)的优秀PostgresSQL,所以你可以混合使用RDBMS和面向文档的存储在同一个表中,包括索引和高级查询! (8认同)
  • 猫鼬,猫鼬都是 ODM 的。我想对于 noSQL,我们只能拥有 ODM。 (2认同)

Jör*_*tag 26

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


Ada*_*ner 14

为了理解 ORM 和 ODM 之间的区别,我认为首先回顾一下关系数据库和文档数据库之间的区别会很有帮助。我会以挥手的方式这样做。

您可能已经习惯了关系数据库。将数据存储在表中,如下所示:

在此输入图像描述

关系数据库的常见示例有 MySQL、Postgres 和 SQLite。要查询关系数据库,您可以使用 SQL。

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

在此输入图像描述

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

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

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

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

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

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

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

这是一个例子。Active Record是 Ruby on Rails 的流行 ORM。使用 Active Record,您可以执行类似的操作User.find_by(name: 'David')并返回类似的内容{ id: 1, name: 'David' }。所以 ORM 正在为你做以下映射:

在此输入图像描述

对于 ODM,除了文档数据库之外,它基本上做同样的事情。它将应用程序代码中的对象映射到数据库中的文档。Mongoose是 ODM 的一个很好的例子。它与 MongoDB 配合使用。


小智 9

从本质上讲,ORM使用SQL数据库驱动程序(如ODBC,JDBC或OLEDB)将对象表示法转换为关系表示法,ODM使用JSON或JSONB api将Object表示法转换为Document表示法.

引擎盖下有不同类型的实现.

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

  • Postgres 也支持 JSONB (2认同)