Современные технологии объектно-реляционного отображения

Обзор существующих средств объектно-реляционного отображенияПравить

ВведениеПравить

В программах, использующих доступ к базам данных, у программистов чаще всего возникает необходимость создавать классы , объекты которых соответствуют записям в соответствующей классу таблице БД, при этом записывая все изменения данных, введенных конечным пользователем в прикладной программе, сначала в эти объекты, а затем синхронизируя эти изменения с БД.То же самое удобно делать при чтении информации из базы данных: сначала инициализировать объекты, наполняя их содержимым из таблиц БД, а затем манипулировать уже свойствами этих объектов. Можно вместо этого манипулировать стандартными классами для манипулирования данными , полученными из таблиц БД, так называемыми DataSet'ами, но описываемый здесь подход имеет определенные преимущества: мы можем управлять реляционными связями, задавая свойствам объектов ссылки на объекты других классов. Более наглядно на примере: допустим классы Сотрудник и Отдел реализуют доступ к соответствующим таблицам Сотрудники и Отделы. В объектной модели для того чтобы изменить отдел у сотрудника, следует выполнить следующее действие на уровне программного кода:

сотрудник.Отдел := Отдел1

Поскольку в данном случае сотрудник и Отдел1 - переменные определенных классов, то для того чтобы, к примеру получить название отдела у сотрудника можно применить конструкцию следующего вида :

сотрудник.Отдел.Название

При манипулировании реляционными моделями, даже с применением DataSet такой изящной конструкции не наблюдается (мы должны были бы прочитать в записи из таблицы сотрудник идентификатор отдела сотрудника, затем прочитать запись из таблицы отделы с полученным идентификатором, а после этого прочитать в найденной записи название отдела).

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

В данное время существует много различных инструментальных средств, способных отображать таблицы , связи и другие элементы реляционной модели на объектную модель. Данные инструменты могут чаще всего представляют собой библиотеки, которые программист может использовать, чтобы обращаться в своем программном коде с реляционной СУБД так как если бы это была СУБД, поддерживающая объектную модель, т.е. манипулировать не на уровне понятий запись/таблица/столбец, а на уровне понятий объект/класс/свойство. Существуют также программы, которые позволяют генерировать классы и конфигурационные файлы для таких библиотек, в которых можно на пользовательском уровне задавать соотношения между таблицами СУБД и генерируемыми классами объектной модели.

Помимо данной статьи информацию на данную тему можно извлечь из следующих источников:

http://sharptoolbox.com/Category74089b0a-1105-4389-b1db-eedf27e20cfb.aspx

http://www.agiledata.org/essays/mappingObjects.html

Библиотеки объектно-реляционного отображенияПравить

NHibernateПравить

Перечень СУБД:

DB2,
PostgreSQL,

MySQL, Oracle , Sybase , Microsoft SQL Server, Firebird .

Реализован как .NET- аналог известной библиотеки для Java Hibernate. Данное средство требует для своего функционирования XML-описание отображения(mapping) таблиц на классы БД. Библиотека из этого файла может получить следующую информацию:

  • Какие классы и из каких сборок(DLL) используются для манипулирования данными БД;
  • Для каждого класса -Какая таблица соответствует классу;
  • Для каждого свойства класса - какому полю таблицы он соответствует
  • Реализует ли данное свойство связь между таблицами. Здесь также указывается класс , который соответствует связанной таблице. Если эта связь типа многие ко многим, то из какой таблицы следует брать связку между объектами.

Еще помимо этого класс может содержать (одно или несколько) свойство-коллекцию связанных объектов. Такие коллекции могут использоваться для связей "многие-к-одному" и "многие-ко-многим". При этом каждый член такой коллекции будет типизирован связанным классом. Если данная связь носит характер N:M , то коллекция присутствует у обоих связанных классов. Например, класс "Деталь" может иметь коллекцию материалов, из которых изготовлена деталь, а класс "Материал" может иметь коллекцию Деталей, которые изготовлены из данного материала. Добавление объектов в такие коллекции повлечет создание записей в связывающей таблице.

Для синхронизации изменений с СУБД используется так называемая сессия , которая отвечает за обновление (создание) записей БД и объектов в памяти. Причем, работая с сессией можно использовать режим управления транзакциями.

Ссылки :

http://nhibernate.sourceforge.net/ http://wiki.nhibernate.org/display/NH/Documentation

Gentle. NETПравить

Поддерживает работу со следующими СУБД: Oracle, PostgreSQL, MySQL, Firebird, Interbase, Sybase,Sybase ASA Microsoft SQL Server , Microsoft Access, SQLite.

Данная библиотека также осуществляет отображение классов, описанных на .NET на реляционные таблицы, но в отличии от NHibernate имеет определенные требования к программному коду, определяющему классы, объекты которых будут наполнятся данными из БД. Эти требования к программному коду таковы: ко всем классам , которые отображаются на таблицы БД необходимо применять некоторые атрибуты из библиотеки Gentle.NET, которые определяют к какой таблице БД соответствует класс. У данных классов свойства, данные в которых следует синхронизировать с данными из определенного столбца таблицы, также помечаются специальным атрибутом, в котором указывается на какой столбец отображать поле, а также дополнительную информацию, например о том, является ли данное поле первичным ключом.

Пример описания класса "User":

using Gentle.Framework;
[TableName("Users")]
public class User : Persistent
{
private int userId;
private string userName;

// указываем , что данное свойства соответствует столбцу таблицы UserId,
// который является первичным ключом, генерируемым СУБД
[TableColumn("UserId"), PrimaryKey(AutoGenerated=true)]
public int Id
{
 get{ return userId; }
 set{ userId = value; }
}
// указываем , что данное свойства соответствует столбцу таблицы,
// название которого совпадает с "Name",
 [TableColumn(NotNull=true)]
 public string Name
 {
  get{ return userName; }
  set{ userName = value; }
 }
}

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

Как и в NHibernate , классы могут содержать коллекции, тип элемента в коллекции – класс, соответствующий классу, связывающему два других.

Ссылки :

http://www.mertner.com/confluence/display/Gentle/Home

DataObjectsПравить

Поддерживаемые СУБД: Microsoft SQL Server 2000 , MSDE 2000 , Microsoft SQL Server 2005 , Microsoft Access, Oracle (9i и выше), Firebird, MaxDB\SAP DB.

Способ отображения классов на реляционные таблицы - специальные .NET - атрибуты классов и полей. (подобно Gentle.NET). Классы-оболочки таблиц должны не только наследоваться от одного абстрактного класса но и сами определяться как абстрактные, причем при создании объектов данного класса с помощью специальных методов библиотеки DataObjects, генерируются для каждого класса свои прокси-классы, к которыми будут типизированны объекты.

http://www.x-tensive.com/Products/DataObjects.NET

DAABПравить

Data Access Application Block - Это набор классов, статические методы которых позволяют выполнять SQL -запросы и хранимые процедуры, причем большее внимание уделено последним. То есть основная идеология работы такова: создаются основные хранимые процедуры доступа к объектам БД,чаще всего параметризованные значениями определенных полей в запросе, в коде приложения заполняется массив значений этих параметров и передается статическому методу DAAB вместе с названием хранимой процедуры. Далее программист может оперировать результатом выполнения этой процедуры , используя общеизвестные конструкции .NET, такие как DataSet, DataReader, XMLReader(то есть способно возвращать XML-данные). Код открытый.

Визуальные средстваПравить

DeKlaritПравить

Реализован как шаблон проекта в .NET, не использует никаких библиотек объектно-реляционного отображения. Пользователь данного продукта создает в нем так называемые бизнес-объекты, то есть некоторые аналоги классов, в которых свойства могут быть не только хранимыми данными , но и вычисляемыми (задаваемыми формулами) значениями. DeKlarit самостоятельно определяет , существуют ли такие таблицы / поля в СУБД, если нет создает их. Данный продукт способен также, анализировать описанные в нем бизнес-объекты, и при необходимости нормализовать их, выделяя отдельные подтаблицы. Таким образом, данный продукт удобно использовать на этапе, когда таблицы в базе данных ещё не готовы, а бизнес-анализ предметной области уже проведен.

Ссылка: http://www.deklarit.com

MyGenerationПравить

Средство получает автоматически описание структур данных из БД ,генерирует программный код для доступа к данным в соответствующей идеологии: NHibernate, Gentle.NET и др. Соответственно генерация кода происходит на основании шаблона. Для NHibernate, например средство может генерировать XML-файлы и классы -оболочки таблиц.

Данное средство позволяет также создавать некоторые шаблоны генерации кода. В данных шаблонах помимо задания правил генерации, определяются элементы графического интерфейса, используемого при запросе у пользователя параметров генерации. MyGeneration имеет набор готовых шаблонов, которые можно применять для генерации классов и конфигурационных файлов NHibernate, хранимых процедур для Microsoft SQL Server, программный код для Gentle.NET и для других технологий. Данные шаблоны можно редактировать, изменяя запрашиваемые при генерации приложением параметры или состав генерируемого кода.

Официальный сайт:

http://www.mygenerationsoftware.com/portal/default.aspx

ObjectMapperПравить

Работает с NHibernate. Средство способно:

  • Анализировать структуру БД, предоставлять пользователю реляционную модель БД , которую он может изменять перед дальнейшими действиями .
  • Анализировать полученную реляционную модель и генерировать объектную модель, которую пользователь может изменять перед дальнейшими действиями .
  • На основании объектной модели генерировать программный код с классами доступа к таблицам БД и XML-таблицы в которых описано само отображение.
  • Управлять генерируемым NHibernate-отображением , предоставляя пользователю возможность задавать свойства классов/ свойств/коллекций.
  • Синхронизировать в обратную сторону построенные модели с СУБД.
  • Отображать построенные объектные модели в виде UML-диаграмм классов.

Средство обладает удобным интерфейсом, отражающем в виде древовидных структур элементы БД, генерируемые классы и их свойства, позволяет отображать классы в виде диаграмм UML.

ObjectMapper позволяет генерировать классы доступа к данным в БД на C#, VB.NET , Delphi.
По крайней мере часть этого текста взята с ресурса http://lib.custis.ru/ под лицензией GDFL.Список авторов доступен на этом ресурсе в статье под тем же названием.