 
        
         
ORM
Object-Relational Mapping
 
Определение
ORM (англ. Object-relational mapping), (русск. Объектно-реляционная проекция) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».
 
Зачем это нужно?
| ООП | ? | СУБД | 
 
Пример
Класс описывает таблицу elephants, в которой нас интересует одна колонка color типа string. Для манипуляции с таблицей есть колонка id, являющаяся целочисленным первичным ключом таблицы.
Мы можем создать новую строку в таблице:
elephant = Elephant.new() # Выполняет INSERT
и id будет назначен автоматически; поле color будет NULL. Или мы можем сразу занести данные:
elephant = Elephant.new(color="pink") # Выполняет INSERT
Мы можем извлечь существующую строку по id: elephant = Elephant(id=2112)
или несколько строк поиском по цвету:
elephants = Elephant.select(color="pink")
В результате запроса в elephants окажется (возможно, пустой) список выбранных объектов.
Чтение атрибутов приводит к чтению данных (непосредственно из таблицы или из кэша): color = elephant.color # Выполняет SELECT и, возможно, кэширует результат
Запись атрибутов приводит к записи информации в таблицу:
elephant.color = "pink" # Выполняет UPDATE и, возможно, обновляет кэш
 
Достоинства
Существует явное описание схемы БД в терминах языка программирования; описание это существует и изменяется в одном месте.
Программист манипулирует привычными элементами языка программирования - классами, объектами (экземплярами классов), атрибутами и методами.
Автоматическая генерация SQL-запросов. Не надо менять зашитые в программу DML-запросы при изменении схемы БД. Не надо менять запросы при переносе на другую СУБД - низкоуровневый драйвер ORM будет создавать новые запросы сам.
 
Недостатки
Объектно-реляционное отображение создаёт дополнительный слой между программой и базой данных. Этот слой имеет свой собственный API, который необходимо изучить, а это дополнительная нагрузка на программиста.
Этот слой создаёт дополнительный уровень абстракции, через который подчас бывает необходимо продраться, чтобы понять, где, что и как в программе работает (или не работает). Необходимо разобраться, где обычные классы, методы и атрибуты, а где объекты ORM, вызывающие побочные эффекты (пишем значение в атрибут, а оно пишется ещё и в БД).
Эта абстракция отображает друг на друга не вполне совместимые (по своим операциям) парадигмы - объектно-ориентированную и реляционную.
Дополнительный слой - это дополнительный код, который надо распространять вместе с программой; он вызывает увеличение объёма и падение скорости программы.
В случае ошибок в реализации ORM в программе возникают трудноотлаживаемые ошибки. Особенно тяжёлый случай - ошибки в реализации кэширования, когда ORM кэширует слишком мало, или наоборот, слишком агрессивно.
Недостатки конкретных реализаций.
 
Существующие решения
| Название | Производитель, сайт | Лицензия | Поддержка СУБД | 
| Hibernate/ | http://www.hibernate.org | Свободно | MS SQL Server, Oracle, | 
| NHibernate | 
 | распространяемый, с | DB2, Access, MySQL, | 
| 
 | 
 | открытым исходным | PostgreSQL, SQLite, | 
| 
 | 
 | кодом | Firebird | 
| DataObjects.NET | X-tensive, http://www.x- | Коммерческая, на | MS SQL Server, Oracle, | 
| 
 | tensive.com/Products/Data | разработчика | SAP DB, Firebird/Interbase | 
| 
 | Objects.NET/ | 
 | 
 | 
| eXpress Persistent Objects | Developer Express, | Коммерческая, на | MS SQL Server, Access, | 
| (XPO) | http://www.devexpress.com | разработчика, исходный | MySQL, Oracle, Advanced | 
| 
 | /products/NET/XPO/ | код доступен | Data Server, PostgreSQL | 
| LLBLGen Pro | http://www.llblgen.com | Коммерческая, на | MS SQL Server, Access, | 
| 
 | 
 | разработчика | Oracle, Firebird/Intervase, | 
| 
 | 
 | 
 | DB2, MySQL | 
| Versant Open Access .NET | Versant, | Коммерческая, на | MS SQL Server, Oracle, | 
| (VOA) | http://www.versant.com/pro | разработчика | FastObjects | 
| 
 | ducts/openaccess/dotnet | 
 | 
 | 
