【问题标题】:What is the difference between an ORM and an ODM?ORM 和 ODM 有什么区别?
【发布时间】:2012-08-29 00:25:24
【问题描述】:

我试图弄清楚 ORM 和 ODM 之间的区别是什么,据我了解这个概念,ORM(对象关系映射器)映射数据之间的关系,而 ODM(对象文档映射器)处理文档。我是否认为 mySQL 是 ORM 的示例而 MongoDB 是 ODM 的示例?

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

【问题讨论】:

    标签: database orm odm


    【解决方案1】:

    要了解 ORM 和 ODM 之间的区别,我认为首先查看关系数据库和文档数据库之间的区别会很有帮助。我会以一种随意的方式这样做。

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

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

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

    实际上,这不是 100% 准确的。 MongoDBexplains:

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

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

    好吧,ORM 代表...实际上,我让this answer 解释一下:

    对象关系映射 (ORM) 是一种技术,可让您使用面向对象的范例从数据库中查询和操作数据。在谈论 ORM 时,大多数人指的是实现对象-关系映射技术的库,因此称为“an ORM”。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        ORM 的示例是 nHibernateEntity FrameworkDapper 等等...

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

        Mandango 是 MongoDB 的 ODM 示例。

        【讨论】:

        • 您可以拥有混合的 ORM/ODM 框架,例如 mORMot for DelphiDoctrine for PHPHibernate OGM for Java。并且一些 SQL 数据库对文档有很强的支持,例如出色的 PostgresSQL,它具有 JSON or JSONB data types,因此您可以在同一个表中混合使用 RDBMS 和面向文档的存储,包括索引和高级查询!
        • mongoose 是 ODM 还是 ORM?
        • mongoose、mongoid都是ODM的。我猜对于 noSQL,我们只能有 ODM。
        【解决方案4】:

        本质上,ORM 使用 ODBC、JDBC 或 OLEDB 等 SQL 数据库驱动程序将对象表示法转换为关系表示法,而 ODM 使用 JSON 或 JSONB api 将对象表示法转换为文档表示法。

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

        PS:JSONB 是一种 JSON 文本文档表示法,以 MongoDB 使用的二进制格式存储。

        【讨论】:

        • 从技术上讲,ODBC 和 JDBC 是驱动程序实现的 API 规范。
        • Postgres 也支持 JSONB
        【解决方案5】:

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

        【讨论】:

        • 很好的解释!我仍然不清楚 ODM/ORM 是底层数据库还是驱动程序库提供的抽象层,还是驱动程序和数据库之间的单独层?文档数据库是否可以有 ORM 驱动程序,反之亦然?
        猜你喜欢
        • 2018-06-25
        • 2017-03-23
        • 2018-09-05
        • 1970-01-01
        • 2017-09-04
        • 2016-11-28
        • 2010-11-04
        • 2014-11-06
        • 2015-09-23
        相关资源
        最近更新 更多