БАЗЫ ДАННЫХ И ГЕОИНФОРМАЦИОННЫЕ СИСТЕМЫ

Целью настоящей статьи является ознакомление специалистов в области геодезии и картографии с механизмом хранения и обработки данных, которые предоставляют геоинформационные системы.

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

Большинство современных программ – как ГИС, так и систем управления базами данных (СУБД), предоставляют интуитивно понятные, легкие в освоении инструменты для манипулирования данными. Однако для разработки информационной системы, содержащей всего две-три взаимосвязанных таблицы, уже требуются знания основ организации автоматизированного хранения информации.

ЧАСТЬ 1. АТРИБУТИВНАЯ ИНФОРМАЦИЯ

Организация хранения информации, типы данных

Все виды данных, которые могут быть сохранены в базах данных, могут быть разделены на две основных категории:
• элементарные, или простые данные, например: число или строка;
• составные или сложные, которые представляют собой определенным образом организованную совокупность простых данных.

Наиболее распространенными сложными типами данных являются массивы и записи.

Массив представляет собой упорядоченную последовательность простых данных одного типа: либо чисел, либо строк. Каждому элементу массива присваивается порядковый номер – индекс.

Примеры массивов:
1,2,3,4 (массив целых чисел)
Январь, Февраль, Март, … (массив месяцев)
[1] => '1-янв-1997’, [2] => ‘15-май-1998’, [3] => ‘4-апр-1999’ (массив дат, в квадратных скобках указан порядковый номер - индекс).

Запись представляет собой совокупность простых данных разных типов: как чисел, так и строк. Элементы записи принято называть ее полями, а совокупность записей, имеющих однотипные поля – файлом.

Примеры записей:
Красная Площадь, 1, Кремль
Ленинский проспект, 65, ГИС-ассоциация
(адреса)

Файл является ничем иным, как массивом, состоящим из записей. Следовательно, каждой записи мы можем сопоставить индекс, который в этом случае принято именовать ключом записи. Очевидно, что каждому ключу в файле сопоставлена только одна запись, и, наоборот: для каждой записи существует единственный ключ.

Можно себе вообразить бесконечное разнообразие сложных типов данных, массивов состоящих из других массивов, записей, содержащих массивы в качестве полей, каждый элемент которых является в свою очередь другой записью и т.п. Однако не все сложные типы имеют одинаковую практическую ценность с точки зрения последующей реализации в рамках вычислительных систем. Необходимо добиться, чтобы вычисления производились максимально быстро, при этом используемое программное обеспечение должно быть максимально гибко «настраиваться» для решения различных задач в различных прикладных областях. Эта идея приводит нас к понятию модели данных.

Итак, модель данных приставляет собой описание принципов, в соответствии с которыми осуществляется хранение и обработка данных. Поиск и выработка оптимальных моделей данных является уделом исследователей-математиков, работающих в области теории баз данных. В настоящий момент, в результате большого практического опыта, полученного при реализации конкретных систем, практическое применение нашли реляционная и объектно-ориентированная модели данных.

Модель данных содержит три составляющие:
• описание структуры данных, то есть тех принципов, в соответствии с которыми осуществляется хранение и упорядочение данных;
• описание методов манипулирования данными, то есть тех принципов, в соответствии с которыми осуществляется порождение новых данных путем обработки существующих;
• описание принципов контроля целостности, то есть формальных ограничений (правил), удостоверяющих соответствие данных той или иной предметной области.

Опишем кратко реляционную модель данных, как наиболее широко распространенную. В дальнейшем мы приведем и краткое описание объектно-ориентированной модели данных.

Реляционная модель данных

Реляционная модель данных разработана в 1970 году в корпорации IBM и в настоящий момент является самой распространенной. Она основана на нескольких простых принципах, в основе которых лежит понятие отношения, связи между различными атрибутами, отражающей отношения между сущностями и их атрибутами (характеристиками) в реальном мире.

Пусть мы имеем некоторую предметную область, в которой определены некоторые сущности, т.е. обособленные, отдельные от друг от друга элементы. Примерами сущностей являются «дерево», «дом», «день», «мысль» и т.п. Каждая сущность имеет тип: правило, позволяющее находить похожие сущности, которые могут быть объединены в упорядоченную совокупность сущностей – набор сущностей. Примерами наборов сущностей являются: «деревья», «дом», «месяц» (совокупность «дней»), «цитатник» (совокупность «мыслей»). Одна и та же сущность может принадлежать к разным наборам. Например, сущность «дерево» может принадлежать к наборам «деревья» и «лес», а сущность «день» к наборам «календарь» и «праздники».

Обособленность от других – есть основной признак сущности. А что значит обособленность? Это значит, что существуют определенные атрибуты, посредством различения которых мы отделяем один объект от другого. Примерами атрибутов являются «цвет», «наименование», «возраст» и.т.п. Например, атрибутом сущности «дом» является его «номер»; каждый дом на одной улице имеет свой номер, и потому мы отличаем дома друг от друга.

Запишем сказанное в символическом виде следующим образом:

ДОМ(НОМЕР)

Пусть для некоей сущности существует набор атрибутов, который однозначно определяет данную сущность. Такой набор атрибутов носит наименование ключа сущности.

В общем случае, количество атрибутов в таком наборе больше одного. Например, знание только номера дома не позволит однозначно установить его местоположения, так в городе существует множество домов с одинаковыми номерами, расположенными на разных улицах. В этом случае набор будет включать два атрибута «улица» и «номер»:

ДОМ(НОМЕР, УЛИЦА)

Далее, между сущностями может существовать некоторая взаимосвязь, например, «дома» могут быть расположены в некотором «районе», либо «городе». Рядом с «домом» может находиться «магазин» и т.п.

Подобно сущностям, связи могут иметь атрибуты и организовывать наборы. Это легко понять. Например атрибутом связи «дом»-«магазин» может быть расстояние между «домом» и «магазином». Кроме того, поблизости от дома может находиться несколько магазинов. В этом случае можно говорить о том, что связь образует набор «магазины поблизости от дома». Если же нас интересует только ближайший магазин, мы говорим о связи «магазин, ближайший к дому» (см. рисунок 1).


Рисунок 1. Наборы «дом» и «магазин», и наборы связей «магазины поблизости от дома», «магазин, ближайший к дому». Магазины, ближайшие к дому могут быть представлены и как набор связей, так и набор сущностей.

Магазины, ближайшие к дому могут быть представлены и как набор связей, так и набор сущностей. Разделение этих двух способов организации данных в рамках реляционной модели достаточно условно.

Обратим внимание на количество сущностей, которые образуют связь. В примере с магазинами и домом, мы определили два набора связей, в один из которых может входить много магазинов (все которые посчитали ближайшими), в другой же – всегда только один магазин (самый ближний).

Связь первого вида называется связью один-ко-многим (один дом – много магазинов), связь второго вида называется один-к-одному (один дом – один магазин).

Для формально-графического отображения подобных ситуаций разработан специальный графический язык, именуемый ER-диаграммами, или диаграммами «сущность»-«связь» (от англ entity-relationship). На рисунке 2 показано, как на ER-диаграмме будет выглядеть пример с магазинами. Такие диаграммы имеют исключительно важное значение, при проектировании баз данных, позволяя в простой, графической форме представить сложную структуру предметной области. Проектирование баз данных мы рассмотрим в последующих частях статьи.



Рисунок 2. ER-диаграмма связи «дом»-«магазин». Вид связи: один-ко-многим.

Вы, наверное, уже заметили, что когда мы говорим о сущностях, то используем имена существительные: «дом», «дома», «магазин», «магазины». Когда же упоминаем связи, то используем в речи глаголы «расположен», «находится». Это очень полезное правило, которое позволит начинающим легко формализовать предметную область в виде диаграмм «сущность»-«связь».

Итак, мы готовы к тому, чтобы завершить описание реляционной модели. Наборы сущностей удобно представлять в виде таблицы, где сама таблица олицетворяет собою собственно набор сущностей, строки представляют собой сущности, а поля или колонки таблицы – атрибуты сущностей. В заголовках полей таблицы содержаться наименования атрибутов сущности. На рисунке 3 приведен пример таблицы для сущности ДОМ(НОМЕР, УЛИЦА, ГОРОД, ЦВЕТ).


Рисунок 3. Пример таблицы, содержащий сущности ДОМ.

Только что мы говорили о том, что в рамках модели объекты должны отличаться друг от друга. Посмотрим, какие атрибуты из указанных в таблице на рисунке 3, позволят однозначно это сделать. Очевидно, что ни одно из полей, взятых отдельно не поможет нам решить задачу поскольку:

Однако, если мы возьмемся «отличать» один дом от другого используя значения первых трех полей в совокупности, мы легко решим нашу задачу. В реляционной модели данных, такая совокупность атрибутов объекта (либо один атрибут), посредством которой мы можем отождествлять конкретный объект  - единственный в таблице -  носит название первичного ключа.   Конечно, в базе данных может быть множество таблиц, содержащих те или иные сведения о сущностях ДОМ, однако хотя бы в одной из таблиц первичный ключ должен существовать.

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

Построим схему базы данных, включающую сущности «дома», «магазины» и связь «расположен», см. рисунок 4.

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



Рисунок 4. Пример схемы базы данных. Названия полей, входящие в первичный ключ выделены жирным цветом.

Обратите внимание, что в базе данных существует таблица ПОБЛИЗОСТИ. Для чего она нужна? Предположим, что мы установили связь непосредственно между таблицами ДОМ и МАГАЗИН. В общем случае, каждый из магазинов расположен вблизи какого-нибудь дома, и наоборот, у каждого дома поблизости есть магазин. А это означает, что одному дому могут «соответствовать» несколько магазинов, и наоборот каждому магазину – несколько домов. Такой вид связи носит название связь многие-ко-многим, и в большинстве настольных СУБД и ГИС функционально не реализован.

Для того, чтобы организовать подобного рода связь в рамках реляционной модели, при помощи только связей вида один-ко-многим приходится прибегать к специальному приему. Кроме того, дополнительная таблица позволяет хранить в базе данных важнейший атрибут связи – расстояние. Таблица ПОБЛИЗОСТИ таким образом, является ничем иным, как набором связей.

Манипулирование данными

Раздел теории, который разрабатывает соответствующий математический аппарат, носит название реляционной алгебры.

Реляционная алгебра описывает правила осуществления над строчками таблицы (которые еще называют кортежами)  действий, именуемых операторами. В рамках обычной, школьной алгебры все уже знакомились с операторами сложения +, вычитания -, умножения * и другими. Совершенно аналогично поступает и реляционная алгебра, с той лишь разницей, что операторы для работы с данными определены специфические, а операндами являются не числа, а целые таблицы. Результатом выполнения реляционных операторов так же являются таблицы (путь даже не содержащие строчек, т.е. пустые).

Рассмотрим важнейшие из реляционных операторов.

ВЫБОРКА. Извлечь из таблицы строчки, удовлетворяющие определенным условиям на значения полей (атрибутов).

Пример. Пусть дана сущность ДОМ(УЛИЦА, НОМЕР), сведения о которой приведены в строчках таблицы ДОМ. Теперь мы желаем выбрать из таблицы только те строки, которые соответствуют домам, расположенным на улице «Геоинформационный проспект». Для этого мы пользуемся оператором ВЫБОРКА, и можем условно записать наше выражение так:

ВЫБРАТЬ строки ИЗ таблицы ДОМ, ГДЕ значение атрибута УЛИЦА равно «Геоинформационный проспект».

Результатом выполнения оператора будет таблица

ДОМА_НА_ГЕОИНФОРМАЦИОННОЙ(УЛИЦА, НОМЕР).

ПРОЕКЦИЯ. Извлечь из таблицы подмножество атрибутов. Например, пусть у нас отпала необходимость в использовании сведений о цвете домов. В этом случае, мы можем создать новую таблицу без этого поля, но содержащую все другие поля и их значения в полном объеме.

СОЕДИНЕНИЕ. Построить из двух таблиц одну, основываясь на одинаковых значениях их одноименных полей. Рассмотрим пример. Пусть, дополнительно к объектам ДОМ, мы имеем объекты МАГАЗИН, следующей структуры:

МАГАЗИН(НАЗВАНИЕ, РАССТОЯНИЕ, НОМЕР ДОМА, УЛИЦА), где атрибуты НОМЕР ДОМА и УЛИЦА идентифицируют дом до которого измерено расстояние. Теперь нам необходимо построить таблицу, где будут отображены сведения о минимальных расстояниях от дома до магазина.

Запишем нашу задачу при помощи операторов ВЫБОРКА и СОЕДИНЕНИЕ следующим образом.

ВЫБРАТЬ строки из таблицы ДОМ, строки из таблицы МАГАЗИН, в т.ч. строку из таблицы МАГАЗИН, содержащую минимальное значение РАССТОЯНИЯ ГДЕ НОМЕР ДОМА из таблицы ДОМ равен НОМЕРУ ДОМА из таблицы МАГАЗИНЫ и УЛИЦА из таблицы ДОМ равна УЛИЦЕ из таблицы МАГАЗИНЫ.

Результатом выполнения этих двух операторов будет таблица:

ДОМА_И_МАГАЗИНЫ(НОМЕР, УЛИЦА,  МИНИМАЛЬНОЕ РАССТОЯНИЕ).

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

Язык SQL

Для создания таблиц и манипулирования данными в СУБД, разработан специальный язык, который называется SQL (от англ. Structured Query Language - структурированный язык запросов).

Он включает в себя два подмножества операторов предназначенных для решения двух важнейших задач управления данными:

SQL является весьма обширным языком, существующим в нескольких видах (стандартах) и содержащим множество разнообразных операторов. Ниже мы кратко рассмотрим важнейшие из операторов и напишем на языке SQL рассмотренные ранее примеры с домами и магазинами.

Прежде всего, остановимся на полях таблиц -  атрибутах. Мы уже упоминали о том, что атрибут может быть строкой или числом, то есть иметь определенный тип, указывающий, в какой форме должно быть представлено значение атрибута.
Для указания типа поля в таблице в SQL используются обозначения:
CHAR(n) – строка длиной N символов,
INTEGER – целое число,
FLOAT – действительное число.
Например, НОМЕР ДОМА может иметь тип FLOAT, а НАЗВАНИЕ УЛИЦЫ – тип CHAR(100);
SQL определяет множество подобных описаний типов атрибутов, которые вместе именуются Типами данных.

CREATE TABLE. Оператор создания таблиц называется CREATE TABLE (англ – Создать Таблицу). Вид оператора для создания таблицы ДОМ приведен на рисунке 5.



Рисунок 5. Пример оператора CREATE TABLE.

SELECT. Для выполнения выборки используется оператор SELECT …FROM … WHERE… GROUP BY (англ. – Выбрать… Из… Где…Группировать). Это наиболее часто используемый оператор во всем языке SQL.

Оператор состоит из четырех основных частей. После слова SELECT следует перечень полей, которые необходимо выбрать. Тут же могут быть указаны функции, которые вычисляют значения выбранных полей, например функция SUM(“Имя поля”) определяет сумму значений полей по которым осуществляется группировка, а функция MIN(“Имя поля”) – минимальное значение среди полей  по которым осуществляется группировка. После FROM следуют имена таблиц, которые участвуют в запросе. После слова WHERE следует условие, которым должны удовлетворять данные в исходных таблицах, чтобы попасть в результат запроса. Условие может включать в себя один или несколько имен полей и логические операторы, такие как >, <, = и другие. И, наконец, после фразы GROUP BY следует имя поля, по которому должны быть сгруппированы результаты. Если после SELECT указаны функции подобные SUM, MIN, то поля по которым вычисляется значение функции должны быть указаны в GROUP BY. Строка таблицы, в которых значения этих полей одинаковы, будет рассматриваться как одна строка в результирующей таблице.

Язык оператора SELECT во многом похож на естественную речь, посредством которой мы записывали примеры работы оператора ВЫБОРКА. Переведем теперь их на язык SQL!

Построим при помощи запроса SELECT рассмотренную нами ранее таблицу ДОМА_НА_ГЕОИНФОРМАЦИОННОЙ.

Итак, запрос будет выглядеть следующим образом (см. рисунок 6).



Рисунок 6. Пример оператора SELECT.

Можно легко видеть, что мы просто заменили в тексте нашей выборки русские слова на их английские эквиваленты.
Теперь решим более сложную задачу с составлением перечня домов, и указанием ближайших к ним магазинов.
Выборка будет выглядеть так:

SELECT НОМЕР, УЛИЦА, MIN(РАССТОЯНИЕ)  FROM ДОМ, МАГАЗИН WHERE ДОМ.УЛИЦА=МАГАЗИН.УЛИЦА AND ДОМ.НОМЕР=МАГАЗИН.НОМЕР GROUP BY ДОМ.НОМЕР, ДОМ.УЛИЦА

Точка между именами таблиц и полей используется для того, чтобы СУБД смогла определить, к какой именно таблице принадлежат поля. Это необходимо, потому что в таблицах ДОМ и МАГАЗИН есть поля с одинаковыми названиями.

Результаты запроса могут быть помещены в таблицу ДОМА_И_МАГАЗИНЫ(НОМЕР, УЛИЦА,  МИНИМАЛЬНОЕ РАССТОЯНИЕ).

Обратите внимание, что в ней нет сведений о магазинах, за исключением вычисленного запросом минимального расстояния. Если бы мы не включили в SELECT предложение GROUP BY, то результирующая таблица выглядела бы так:

ДОМА_И_ВСЕ_МАГАЗИНЫ(НОМЕР, УЛИЦА,  РАССТОЯНИЕ). Т.е. в ней было бы по одной строчке для каждого магазина. Нам же необходимо было вычислить минимальное расстояние. СУБД сделала это поэтапно: сначала построила таблицу ДОМА_И_ВСЕ_МАГАЗИНЫ, а затем выбрала из них минимальные расстояния, и поместила результат в итоговую таблицу   ДОМА_И_МАГАЗИНЫ.

Можно видеть, что мы неявным образом создали СОЕДИНЕНИЕ между таблицами ДОМА и МАГАЗИНЫ. Вообще-то в языке SQL для этих целей существует специальный оператор JOIN (англ - соединение), но простейшие соединения таблиц можно осуществлять в рамках оператора SELECT описанным выше способом.

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