Что такое ORM, как он работает и как его использовать?

Кто-то предложил мне использовать ORM для проекта, который я разрабатываю, но у меня возникают проблемы с поиском информации о том, что это такое и как это работает.

Кто-нибудь может дать мне краткое объяснение, что такое ORM и как он работает, и как мне начать использовать его?

Ответ 1

Вступление

Объектно-реляционное отображение (ORM) - это метод, который позволяет запрашивать и манипулировать данными из базы данных с использованием объектно-ориентированной парадигмы. Говоря об ORM, большинство людей ссылаются на библиотеку, которая реализует технику объектно-реляционного сопоставления, отсюда и фраза "ORM".

Библиотека ORM - это совершенно обычная библиотека, написанная на выбранном вами языке, которая инкапсулирует код, необходимый для манипулирования данными, поэтому вы больше не используете SQL; вы взаимодействуете непосредственно с объектом на том же языке, который используете.

Например, вот совершенно воображаемый случай с псевдоязыком:

У вас есть класс книг, вы хотите получить все книги, автором которых является "Линус". Вручную, вы бы сделали что-то вроде этого:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

С библиотекой ORM это будет выглядеть так:

book_list = BookTable.query(author="Linus");

Механическая часть автоматически обрабатывается с помощью библиотеки ORM.

Плюсы и минусы

Использование ORM экономит много времени, потому что:

  • СУХОЙ: вы пишете свою модель данных только в одном месте, и вам будет проще обновлять, поддерживать и повторно использовать код.
  • Многое делается автоматически, от обработки базы данных до I18N.
  • Это заставляет вас писать код MVC, что в итоге делает ваш код немного чище.
  • Вам не нужно писать плохо сформированный SQL (большинство веб-программистов действительно отстой, потому что SQL трактуется как "вспомогательный" язык, хотя на самом деле он очень мощный и сложный).
  • Санобработка; использование подготовленных операторов или транзакций так же просто, как вызов метода.

Использование библиотеки ORM более гибко, потому что:

  • Это соответствует вашему естественному способу кодирования (это ваш язык!).
  • Он абстрагирует систему БД, поэтому вы можете изменить ее, когда захотите.
  • Модель слабо связана с остальной частью приложения, поэтому вы можете изменить ее или использовать где-либо еще.
  • Это позволяет вам использовать ООП, как наследование данных без головной боли.

Но ORM может быть болью:

  • Вы должны изучить это, и библиотеки ORM не являются легкими инструментами;
  • Вы должны настроить это. Та же проблема.
  • Производительность нормальная для обычных запросов, но мастер SQL всегда будет лучше с собственным SQL для больших проектов.
  • Абстрагирует БД. Хотя это нормально, если вы знаете, что происходит за кулисами, это ловушка для новых программистов, которые могут писать очень жадные операторы, как тяжелый удар в цикле for.

Как узнать об ORM?

Ну, используйте один. Какую бы библиотеку ORM вы ни выбрали, все они используют одни и те же принципы. Здесь много библиотек ORM:

Если вы хотите попробовать библиотеку ORM в веб-программировании, вам лучше использовать весь стек фреймворков, например:

  • Symfony (PHP, использующий Propel или Doctrine).
  • Django (Python, использующий внутренний ORM).

Не пытайтесь написать свой собственный ORM, если вы не пытаетесь чему-то научиться. Это гигантский кусок работы, а старым потребовалось много времени и работы, прежде чем они стали надежными.

Ответ 2

Кто-нибудь может дать мне краткое объяснение...

Конечно.

ORM означает "объект для реляционного сопоставления", где

  • Объект - это тот, который вы используете с вашим языком программирования (в этом случае python)

  • Реляционная часть - это система реляционных баз данных (база данных), есть другие типы баз данных, но наиболее популярной является реляционная (вы знаете таблицы, столбцы, pk fk и т.д. например, Oracle MySQL, MS-SQL)

  • И наконец, Сопоставление - это место, где вы соединяете свои объекты с вашими таблицами.

В приложениях, где вы не используете структуру ORM, вы делаете это вручную. Использование структуры ORM позволит вам уменьшить шаблон, необходимый для создания решения.

Итак, скажем, у вас есть этот объект.

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

а таблица

   create table employee(
          name varcar(10),
          -- etc  
    )

Использование структуры ORM позволит вам автоматически сопоставить этот объект с записью db и написать что-то вроде:

   emp = Employee("Ryan")

   orm.save( emp )

И добавьте сотрудника в БД.

К сожалению, это было не так, но я надеюсь, что это достаточно просто, чтобы поймать другие прочитанные статьи.

Ответ 3

ORM (Object Relational Mapper) - это часть/слой программного обеспечения, который помогает отображать объекты кода в вашу базу данных.

Некоторые обрабатывают больше аспектов, чем другие... но цель состоит в том, чтобы взять часть веса слоя данных со стороны разработчиков.

Вот краткое сообщение от Мартина Фаулера (Data Mapper):

Шаблоны карт данных Enterprise Application Architecture

Ответ 4

Как и все аббревиатуры, это двусмысленно, но я предполагаю, что они означают объектно-реляционный картограф - способ закрыть глаза и убедить нет SQL под ним, а скорее все объекты;-). Не совсем верно, конечно, и не без проблем - всегда красочный Джефф Этвуд описал ORM как Вьетнам CS;-). Но, если вы мало знаете или не имеете SQL, и имеете довольно простую/мелкомасштабную проблему, они могут сэкономить ваше время! -)

Ответ 5

Первая глава книги Hibernate Java Persistence with Hibernate (3-е изд.) имеет отличный обзор общих концепций ORM и обсуждает мотивацию и дизайн ORM. Очень рекомендуется, даже если вы не работаете с Java.

Ответ 6

Это огромная тема. Возьмите хорошую книгу для спящего режима, и она должна подробно объяснить ORM, прежде чем перейти к ничтожному суровому спящему материалу.

https://www.hibernate.org/

Ответ 7

Storm - отличный вариант для тех, кто использует python.

Ответ 8

Объектная модель связана со следующими тремя концепциями Абстракция данных Инкапсуляция наследование Реляционная модель использовала базовую концепцию отношения или таблицы. Объектно-реляционное сопоставление (OR mapping) продукты объединяют возможности языка программирования объектов с реляционными базами данных.

Ответ 9

DALMP http://code.google.com/p/dalmp/ может быть хорошим для php/mysql, который в настоящее время поддерживает множество бэкэндов кэшей, таких как redis/memcache/apc