Статьи

ORM в Ruby: введение

Облако слов для объектно-реляционного отображения

Любой, кто имеет опыт разработки веб-приложений или использования веб-фреймворка, имел дело с реляционными базами данных, такими как MySQL или PostgreSQL. Временами иметь дело с SQL может быть немного страшно, особенно при работе с данными из разных таблиц и применении различных фильтров.

Вот где ORM приходит на помощь.

Что такое ORM?

ORM является аббревиатурой от Object Relational Mapping.

Объектно-реляционное отображение (ORM, O / RM и O / R mapping) в компьютерном программном обеспечении — это метод программирования для преобразования данных между несовместимыми системами типов в объектно-ориентированных языках программирования. По сути, это создает «базу данных виртуальных объектов», которую можно использовать из языка программирования. Доступны как бесплатные, так и коммерческие пакеты, которые выполняют объектно-реляционное отображение, хотя некоторые программисты предпочитают создавать свои собственные инструменты ORM.
Википедия

Другими словами, среда ORM написана на объектно-ориентированном языке (например, Ruby, Python, PHP и т. Д.) И обернута вокруг реляционной базы данных. Классы объектов отображаются в таблицы данных в базе данных, а экземпляры объектов отображаются в строки в этих таблицах.

преимущества

Ниже приведены преимущества ORM как концепции. Стоит отметить, что не все реализации ORM поддерживают все следующие преимущества.

Независимая база данных

Это, вероятно, самое большое преимущество использования ORM в приложении. Нет необходимости писать код, специфичный для конкретной базы данных. Просто запустите проект с использованием SQLite, а затем перейдите на MySQL или PostgreSQL. Изменение нескольких строк кода в адаптере конфигурации базы данных позволяет работать с другой базой данных.

Модель доменной модели

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

Уменьшить код и повысить эффективность

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

Богатый интерфейс запросов

Платформы ORM обычно поставляются с богатым интерфейсом запросов, освобождая разработчика от сложной семантики SQL.

Отношения

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

совпадение

ORM поддерживает параллелизм, позволяя нескольким пользователям одновременно обновлять один и тот же набор данных.

Кэширование

Объекты можно кэшировать в памяти, уменьшая нагрузку на базу данных.

операции

Изменения в объекте могут быть связаны с транзакцией, которая может быть зафиксирована или откатана. Несколько транзакций могут быть активными в данный момент времени, но все эти транзакции изолированы друг от друга.

Недостатки

накладные расходы

Поскольку ORM-инфраструктура добавляет уровень абстракции, ускоряя разработку и снижая сложность, она также увеличивает накладные расходы на приложение. Использование ORM потребляет больше памяти и увеличивает нагрузку на процессор.

Кривая обучения

Применение ORM к приложению предполагает, что разработчик имеет опыт работы с конкретной платформой. Существует кривая обучения, связанная с большинством структур ORM.

Производительность

Некоторые действия, такие как массовая вставка, обновление, удаление и т. Д., Выполняются медленнее при использовании ORM. Как правило, они более эффективно обрабатываются с использованием собственных запросов SQL.

SQL невежество

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

ORM Каркасы в Рубине

Существует множество фреймворков ORM, написанных на Ruby. Некоторые из наиболее популярных из них кратко описаны здесь.

ActiveRecord

ActiveRecord — это ORM, который поставляется с Rails из коробки. ActiveRecord (или AR) пытается следовать шаблону проектирования Active Record . Он играет роль Model в архитектуре MVC, используемой Rails.

ActiveRecord создает абстракцию из базы данных, используя бизнес-объекты, тем самым освобождая разработчиков от необходимости справляться со сложностями базовой базы данных. Одним из основных принципов ActiveRecord является «соглашение о конфигурации». Он автоматически определяет конфигурацию, если соблюдаются правильные соглашения для имен таблиц, имен переменных и т. Д. Однако всегда можно переопределить конфигурации по умолчанию, если они указаны явно.

Некоторые из примечательных особенностей ActiveRecord:

  • Данные представлены в виде моделей.
  • Ассоциации могут быть реализованы с использованием этих моделей.
  • Наследование может быть достигнуто с помощью связанных моделей.
  • Проверка данных перед сохранением в базе данных.
  • Объектно-ориентированный способ работы с базами данных.

Хотя ActiveRecord включен в Rails, он может быть установлен как независимый гем.

gem install activerecord

Вот быстрый пример, демонстрирующий использование ActiveRecord:

 require 'rubygems'
require 'activerecord'
ActiveRecord::Base.establish_connection(
  :adapter=> "mysql",
  :host => "localhost",
  :database=> "articles"
)

class Article < ActiveRecord::Base
end

#Creating a new article
Article.create(title:'ORM', author:'Manu')

#Fetching an article
article = Article.find(:first)

#Destroy an article
Article.find(:first).destroy

Основными недостатками ActiveRecord является то, что он нарушает принцип единой ответственности (SRP). Поскольку доменные объекты также обрабатывают постоянство, дополнительную ответственность, сложность объектов возрастает.

DataMapper

DataMapper был разработан для устранения выявленных недостатков в библиотеке ActiveRecord и для создания среды ORM, которая быстра, поточно-ориентирована и многофункциональна. Следует шаблон проектирования DataMapper

В то время как в Active Record модель предметной области инкапсулирует как бизнес-логику, так и ответственность за доступ к базе данных, DataMapper не знает о базе данных, что приводит к созданию простых старых объектов Ruby (PORO) с бизнес-логикой. DataMapper позволяет логике базы данных и объектной модели развиваться независимо, изолируя их друг от друга, тем самым следуя принципу единой ответственности (SRP).

Преимущества Datamapper следующие:

  • Нет необходимости писать миграции
  • Отмеченные отношения или Коллекция цепочек
  • Ленивая загрузка некоторых типов атрибутов, таких как текстовые поля, что может замедлить запрос.
  • Стремительная загрузка, избегая проблемы запроса N + 1
  • Грязное отслеживание, сохраняет только те поля, которые действительно изменились
  • Уважает принцип единой ответственности

Простой пример использования DataMapper:

 require 'rubygems'
require 'dm-core'
require 'dm-migrations'
DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'mysql://localhost/test')
class Author
  include DataMapper::Resource
  property :id,   Serial
  property :name, String, :required => true
end
DataMapper.auto_migrate!

#Create a new record
Author.create(:name => 'Manu')

#Fetching a record using DM
Author.first(:name => 'Manu')

#Destroying a record
author = Author.get(7)
author.destroy

В приведенном выше примере DataMapper :: Resource добавляется в класс Author для обработки персистентности.

продолжение

Sequel разработан для предоставления простого API, независимого от базы данных, для взаимодействия с базами данных SQL. Он также основан на шаблоне ActiveRecord. Есть много общего между ActiveRecord и Sequel.

Преимущества:

  • Обеспечивает безопасность потоков, пулы соединений и краткий DSL для построения запросов SQL и схем таблиц
  • Включает комплексный уровень ORM для отображения записей на объекты Ruby и обработки связанных записей
  • Поддерживает расширенные функции базы данных, такие как подготовленные операторы, связанные переменные, хранимые процедуры, точки сохранения, двухфазное принятие, изоляция транзакций, конфигурации master / slave и сегментирование базы данных.
  • В настоящее время имеет адаптеры для ADO, Amalgalite, CUBRID, DataObjects, DB2, DBI, Firebird, IBM_DB, Informix, JDBC, MySQL, Mysql2, ODBC, OpenBase, Oracle, PostgreSQL, SQLAnywhere, SQLite3, Swift и TinyTDS.

Простой пример использования Sequel:

 require "rubygems"
require "sequel"

DB = Sequel.sqlite

DB.create_table :author do
  primary_key :id
  String :name
end

authors = DB[:authors]
authors.insert(:name => 'Manu')

Вывод

ORM стремится решить проблему и облегчить жизнь разработчика, предлагая множество различных вариантов достижения одной и той же цели. Хотя ActiveRecord доминирует в среде Ruby ORM, DataMapper и Sequel (и другие) являются законными вариантами. Если вы этого еще не сделали, вам следует выбрать стратегию ORM, соответствующую вашему варианту использования.