Современные технологии объектно-реляционного отображения
Обзор существующих средств объектно-реляционного отображенияПравить
ВведениеПравить
В программах, использующих доступ к базам данных, у программистов чаще всего возникает необходимость создавать классы , объекты которых соответствуют записям в соответствующей классу таблице БД, при этом записывая все изменения данных, введенных конечным пользователем в прикладной программе, сначала в эти объекты, а затем синхронизируя эти изменения с БД.То же самое удобно делать при чтении информации из базы данных: сначала инициализировать объекты, наполняя их содержимым из таблиц БД, а затем манипулировать уже свойствами этих объектов. Можно вместо этого манипулировать стандартными классами для манипулирования данными , полученными из таблиц БД, так называемыми 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.Список авторов доступен на этом ресурсе в статье под тем же названием.