В чем разница между ORM и ODM?
Я пытаюсь выяснить, в чем разница между ORM и ODM, насколько я понимаю концепцию, ORM (Object Relational Mapper) отображает отношения между данными, где ODM (Object Document Mapper) работает с документами. Прав ли я, предполагая, что mySQL является примером ORM, а MongoDB является примером ODM?
Как я уверен, вы можете видеть, я не слишком знаком с теорией концепции. Может ли кто-нибудь прояснить разницу между ними?
6 ответов
MySQL является примером реляционной базы данных - вы использовали бы ORM для перевода между вашими объектами в коде и реляционным представлением данных.
Примерами ORM являются nHibernate, Entity Framework, Dapper и другие...
MongoDB - это пример базы данных документов - вы бы использовали ODM для перевода между вашими объектами в коде и представлением данных в документе (при необходимости).
Mandango является примером ODM для MongoDB.
ORM сопоставляет объектную модель и реляционную базу данных. ODM сопоставляет объектную модель и базу данных документов. MySQL - это не ORM, это реляционная база данных, точнее, база данных SQL. MongoDB - это не ODM, а база данных документов.
Чтобы понять разницу между ORM и ODM, я думаю, было бы полезно сначала рассмотреть различия между реляционной базой данных и базой данных документов. Я сделаю это ручным волнистым способом.
Реляционная база данных — это та, к которой вы, вероятно, привыкли. Тот, который хранит данные в таблицах, например:
Типичными примерами реляционных баз данных являются MySQL, Postgres и SQLite. Чтобы запросить реляционную базу данных, вы должны использовать SQL.
А базы данных документов? Что ж, в базах данных документов данные хранятся в формате JSON, а не в таблицах.
На самом деле, это не на 100% точно. MongoDB объясняет :
Документы хранят данные в парах поле-значение. Значения могут быть различных типов и структур, включая строки, числа, даты, массивы или объекты. Документы могут храниться в таких форматах, как JSON, BSON и XML.
Итак, что такое ORM, что такое ODM и как они соотносятся?
Ну, ORM означает... на самом деле, я позволю этому ответу объяснить:
Объектно-реляционное отображение (ORM) — это метод, который позволяет вам запрашивать и манипулировать данными из базы данных, используя объектно-ориентированную парадигму. Говоря об ORM, большинство людей имеют в виду библиотеку, которая реализует метод объектно-реляционного отображения, отсюда и фраза «ORM».
По сути, в коде вашего приложения вы обычно имеете дело с объектами. Но в вашей базе данных есть таблицы. ORM — это библиотека, которая сопоставляет их между собой. Как объясняет Википедия :
Фактически это создает «базу данных виртуальных объектов», которую можно использовать внутри языка программирования.
Вот пример. Active Record — популярная ORM для Ruby on Rails. С Active Record вы можете сделать что-то вроде
User.find_by(name: 'David')
и вернуть что-то вроде
{ id: 1, name: 'David' }
. Таким образом, ORM выполняет для вас следующее сопоставление:
А затем с ODM, он в основном делает то же самое, за исключением баз данных документов. Это сопоставление объектов в коде вашего приложения с документами в базе данных. Mongoose — хороший пример ODM. Он работает с MongoDB.
По сути, ORM использует драйвер базы данных SQL, такой как ODBC, JDBC или OLEDB, для перевода нотации объекта в реляционную нотацию, а ODM использует API JSON или JSONB для перевода нотации объекта в нотацию документа.
Есть разные виды реализаций под капотом.
PS: JSONB - это нотация текстового документа JSON, хранящаяся в двоичном формате, который используется MongoDB.
Mongoose является хорошим примером ODM(Object Data Model) для MongoDB, в котором вы можете напрямую выполнять операции с объектами, и это переводится в соответствующий запрос и схему. Это можно найти здесь на https://mongoosejs.com/
Mongoose — это пример ODM, который сопоставляет объектные модели и MongoDB. Mongoose предоставляет множество функций для запросов и редактирования документов в коллекции в классе модели, а также богатый класс запросов для ручных запросов.
Sequelize — это современный пример ORM, который сопоставляет объектные модели и базу данных SQL. Sequelize работает со многими реляционными базами данных, такими как Postgres, MariaDB, SQLite, MySQL, Oracle и SQL Server. Интерфейс Sequelize очень похож на интерфейс Mongoose, где вы начинаете с определения таблиц (вместо коллекций) в качестве моделей в TypeScript.