|
Персональные инструменты |
|||
|
Современные технологии объектно-реляционного отображенияМатериал из CustisWikiСодержаниеОбзор существующих средств объектно-реляционного отображенияВведениеВ программах, использующих доступ к базам данных, у программистов чаще всего возникает необходимость создавать классы , объекты которых соответствуют записям в соответствующей классу таблице БД, при этом записывая все изменения данных, введенных конечным пользователем в прикладной программе, сначала в эти объекты, а затем синхронизируя эти изменения с БД.То же самое удобно делать при чтении информации из базы данных: сначала инициализировать объекты, наполняя их содержимым из таблиц БД, а затем манипулировать уже свойствами этих объектов. Можно вместо этого манипулировать стандартными классами для манипулирования данными , полученными из таблиц БД, так называемыми 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) таблиц на классы БД. Библиотека из этого файла может получить следующую информацию:
Еще помимо этого класс может содержать (одно или несколько) свойство-коллекцию связанных объектов. Такие коллекции могут использоваться для связей "многие-к-одному" и "многие-ко-многим". При этом каждый член такой коллекции будет типизирован связанным классом. Если данная связь носит характер 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 DAABData 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. Средство способно:
Средство обладает удобным интерфейсом, отражающем в виде древовидных структур элементы БД, генерируемые классы и их свойства, позволяет отображать классы в виде диаграмм UML. ObjectMapper позволяет генерировать классы доступа к данным в БД на C#, VB.NET , Delphi.
Любые правки этой статьи будут перезаписаны при следующем сеансе репликации. Если у вас есть серьезное замечание по тексту статьи, запишите его в раздел «discussion». Репликация: База Знаний «Заказных Информ Систем» → «Современные технологии объектно-реляционного отображения» |
||