Введение в базы данных Birdstep: Моделирование данных с помощью сетевой и реляционной моделейИсточник: wwwbirdstepcom
Моделирование данных - процесс представления реальных данных и их отношений в форме, максимально подходящей для использования в компьютерных программах. Выбор метода эффективного моделирования данных и их отношений - одно из ключевых решений, принимаемых разработчиком при разработке управляемой данными системы. В настоящее время доступно множество методов моделирования данных, но чаще всего используются два - сетевая и реляционная модели. Данная статья представляет собой краткое сопоставление наглядного процесса моделирования данных на примере сравнения этих двух методов моделирования. Будут рассмотрены следующие вопросы:
Краткое определение моделей данных Сначала необходимо указать, что одни и те же отношения можно представить и в сетевой, и в реляционной модели. Они должны сравниваться с точки зрения того, насколько естественно соответствующей структурой базы данных моделируются реальные данные, которые в ней хранятся, и насколько естественными являются поиск и изменение данных, хранящихся в базе данных. В сетевой модели данные и отношения обычно представляются в виде рисунков, содержащих прямоугольники и стрелки. Каждый прямоугольник представляет собой тип записи , а каждая стрелка - тип отношения . Тип записи будет содержать поля , которые используются для хранения отдельных значений, которые в совокупности представляют определяющую информацию о реальном объекте, представленном данной записью. Например, если необходимо хранить в базе данных информацию о сотрудниках, целесообразно определить тип записи сотрудник , содержащий, например, поля фамилия, имя, номер социального страхования, дата рождения и так далее. Если сотрудники некоторой компании группируются по отделам, необходимо также определить тип записи отдел , чтобы хранить информацию об одном или нескольких отделах. Отношение между отделами и сотрудниками можно назвать включает в себя. Это отношение типа "один-множество", согласно которому один отдел может включать в себя несколько сотрудников, а каждый сотрудник (по крайней мере, в данном примере моделирования) может быть включен только в один отдел. Ниже приведен соответствующий рисунок: ОТДЕЛ → ВКЛЮЧАЕТ В СЕБЯ → СОТРУДНИК Название "сетевая модель" объясняется тем, что несколько прямоугольников могут соединяться с другими прямоугольниками с помощью нескольких стрелок: В реляционной модели данные представляются в виде таблицы, в которой каждая строка представляет объект какого-либо типа, а каждый столбец представляет определяющий признак объекта. Столбцы таблиц сотрудник и отдел в реляционной модели могут выглядеть следующим образом: СОТРУДНИК Фамилия Имя Номер социального страхования Дата рождения Название отдела ОТДЕЛ Название отдела Подчиненность отдела Приблизительно, строка - то же самое, что запись, а столбец - то же самое, что поле. Реляционная модель не показывает в явном виде отношения между строками, но позволяет установить отношения через сравнение значений столбцов. В приведенном ниже примере таблица сотрудник содержит столбец название отдела , в котором должен указываться отдел, включающий в себя данного сотрудника. В таком случае, там, где название отдела для какого-либо сотрудника соответствует названию отдела для какого либо отдела, можно установить отношение между данным сотрудником и данным отделом. Пример для сравнения В данном разделе приводится довольно простая модель данных, как в виде сетевой, так и в виде реляционной модели. Одни и те же данные показаны в том виде, в котором они обычно показываются для обеих моделей. В следующем разделе приведен псевдокод, чтобы продемонстрировать, как программист мог бы использовать данные модели в приложениях. Сетевая модель "Сетью" отношений данных, которая может быть визуально представлена в естественном виде, является родословное дерево. На рисунке ниже показана сетевая модель, изображенная в виде простой схемы. ПОТОМОК ЛИЦО ГЕНЕТИЧЕСКАЯ МАТЬ ГЕНЕТИЧЕСКИЙ ОТЕЦ ОТНОШЕНИЕ ДЕТОРОЖДЕНИЯ В данном примере показано, что ЛИЦО может быть или ГЕНЕТИЧЕСКОЙ МАТЕРЬЮ, или ГЕНЕТИЧЕСКИМ ОТЦОМ, с отсутствующими или с одним или несколькими ОТНОШЕНИЯМИ ДЕТОРОЖДЕНИЯ. ОТНОШЕНИЯ ДЕТОРОЖДЕНИЯ могут привести к появлению одного или нескольких ЛИЦ, имеющих отношение ПОТОМОК. На схеме показана форма данных, а не фактические данные. Ниже дано визуальное представление данных, взятых в качестве примера, в форме такой схемы. В данном примере показана часть родословного дерева для трех поколений. Два типа записей и три типа наборов позволяют представить в базе данных любые наследственные отношения, включая детей от родителей из нескольких отношений. Простая схема обеспечивает визуальное представление записей данных и их отношений друг к другу, как показано на примере выше. Реляционная модель Для сопоставления сетевой и реляционной моделей ниже показаны две реляционные таблицы - одна из них содержит данные о ЛИЦАХ, а другая - данные об ОТНОШЕНИЯХ ДЕТОРОЖДЕНИЯ. Эти таблицы, вместе с соответствующими отношениями первичных/внешних ключей, представляют то же самое родословное дерево, что и показанное выше. ЛИЦО
Отношения между строками таблиц устанавливаются через совпадение значений столбцов, часто называемых отношениями ПЕРВИЧНЫХ/ВНЕШНИХ КЛЮЧЕЙ. В данном примере ИДЕНТИФИКАТОР ЛИЦА и ИДЕНТИФИКАТОР ОД - первичные ключи. ПОТОМОК - внешний ключ ИДЕНТИФИКАТОРА ОД, а ГЕНЕТИЧЕСКИЙ ОТЕЦ и ГЕНЕТИЧЕСКАЯ МАТЬ - внешние ключи ИДЕНТИФИКАТОРА ЛИЦА Такое представление, "дружественное для компьютера", не слишком полезно для программиста, который работает, с помощью схем и алгоритмов, с мысленными образами, которые являются пространственными. Родословное дерево в реальной жизни выглядит обычно как сеть людей и их отношений друг с другом. Их сведение в таблицу для представления в базе данных затрудняет программисту работу с ними. Сравнительное описание программирования приложений В данном разделе предполагается, что читатель имеет определенное знакомство с языком SQL. Рассмотрим, как в прикладной программе может быть получен ответ на вопрос " Кто известные предки Эми? " База данных с сетевой моделью будет иметь интерфейс программирования API, позволяющий программисту "перемещаться" по записям и наборам в базе данных. К базе данных с реляционной моделью обычно обращаются, указывая необходимые данные с помощью языка наподобие SQL. Как уже провозглашено, лучше установить, что необходимо от базы данных, чем как найти это в базе данных. В таком случае, СУБД принимает решения о том, как расположить данные, и предоставляет программисту полный ответ. Это называется непроцедурным доступом к базе данных. Однако для данной статьи преднамеренно выбран пример, для которого в языке SQL не существует стандартного способа для указания результатов с помощью непроцедурного доступа. Рекурсивная иерархия данного примера не является редкой структурой базы данных. Переход по иерархиям в таких таблицах возможен с помощью последовательности операторов SELECT, или с помощью расширений SQL, например START WITH и CONNECT BY, поддерживаемых СУБД Oracle. Ниже приведена реализация ответа на заданный выше вопрос с помощью сетевой модели. Псевдокод воспроизводит действия интерфейса программирования API сетевой модели, однако является упрощенным. Интерфейс API позволяет перемещаться между записями с помощью соединения их наборов с единственным вызовом. main() { find_ancestors(level) { Ниже представлена реализация ответа на данный вопрос с помощью реляционной модели. Реализация является процедурной , хотя многие аргументы в пользу реляционной модели связаны с возможностью непроцедурного подхода. Однако для данного примера в языке SQL нет способа выразить вопрос одним оператором (если не используются расширения фирмы-поставщика, которые можно найти в Oracle). При реализации воспроизводится сетевая модель во время перехода по базе данных, но, так как необходимы синтаксический анализ и оптимизация каждого оператора SELECT, его выполнение никак нельзя ускорить. И практическая реализация, учитывая, что в качестве интерфейса API используется интерфейс ODBC, представляет собой гораздо большее число строк программного кода, чем практическая реализация с помощью сетевой модели. main() { /* поиск записи "Эми" */ SELECT name, offspring FROM person find_ancestors(name, var_offspring, level) { SELECT genetic-father, genetic-mother FROM procreative-rel /* поискгенетическойматери */ SELECT name, offspring FROM person Необходимо заметить, что приведенная выше реализация, естественно, подобна реализации для сетевой модели. Однако если перед составлением данной программы недоступно представление с помощью сетевой модели, а перед программистом - только две таблицы, данная реализация была бы крайне затруднена и неестественна для изучения. Еще одним вопросом может быть вопрос " Каковы имена потомков Рона? " Реализация ответа на данный вопрос с помощью сетевой модели будет выглядеть следующим образом: main() { find_descendents(level) { Какой была бы реализация ответа на данный вопрос с помощью реляционной модели? Опять-таки, это аналогичный алгоритм, но более сложный из-за необходимости использовать оператор SELECT для перехода по иерархиям. Краткие выводы По вопросам, рассмотренным в данной статье, можно сделать следующие краткие выводы:
Заключение В примерах, подобных приведенным выше, когда отношения данных фактически содержат одну или несколько иерархий, сетевая модель обеспечивает лучшие методы визуализации и перебора для представления и обработки данных. Результатом являются наглядные программные реализации, малые по объему и эффективные. |