Семантика баз данных
В предыдущих лекциях предполагалось, что в базах данных хранятся сущности, у которых есть имя и атрибуты. Атрибуты имеют тип. В объектных моделях к атрибутам добавляются еще методы. Такая вот благостная и вполне привычная для программистского взгляда картина, немного усложненная свойством персистентности.
Здесь мы рассмотрим сущности с многосортными атрибутами, выясним важную роль интерпретатора данных, человека или программы, покажем, как можно реализовать полуструктурированные данные.
Затем изучим эмулирование моделей данных в табличных и иерархических моделях, выясним связанные с ними изменения семантики данных.
Подробно рассмотрим базы, насыщенные элементами семантики, которые мы будем называть смыслами. Дадим их классификацию и покажем, возможности реализации в обычных СУБД.
Покажем, что в SQL-базах данных можно организовывать встроенные продукционные системы, используемые, в частности, для обогащения базы сложной семантикой, использующей дедукцию.
Существуют предметные области, в которых природа данных требует использования в рассуждениях неклассических логик — модальных логик веры, знания и др. В частности, темпоральные данные могут рассматриваться как особая система смыслов, может быть, требующая использования модальных темпоральных логик.
В реляционной модели значения, хранящиеся в базе, предполагаются атомарными. С точки зрения отображаемой модели бизнеса они могли быть сколько угодно сложными, но рамках использованной модели данных работать с их компонентами нельзя. В реализациях баз данных давно используются модели, которые мы будем называть двухслойными. Роль первого слоя выполняет любая модель данных, для которой организованы структуры хранения. Второй слой работает с данными, которые ему предоставляет первый слой, но данные в нем считаются не атомарными, а известным образом организованными. Практически во всех СУБД во втором слое применяются регулярные выражения и/или различные виды XML данных. Понятно, что второй слой не влияет на структуры хранения данных непосредственно, но может предъявлять свои требования к их организации.
Вторая возможность расширения обычных моделей данных связана с хранением дополнительной семантики данных. Можно учесть особенности использования атрибутов, выделяя их разновидности — сорта. Для того, чтобы не путать сущности, хранимые в базе, с их прообразами в предметной области будем называть последние концептами (понятиями) этой области. Оказывается, что в базах данных обычно представляются всего два вида концептов. Это, как правило, концепты с одним сортом атрибутов, которые мы будем называть обязательными, и, изредка, полуструктурированные концепты, допускающие необязательные атрибуты.
Мы попробуем расширить модель представимого концепта, введя атрибуты состояния, ресурсов и смыслов. При этом обнаружится, что концепты с обязательными и необязательными атрибутами описывают замкнутые системы. Атрибуты состояния, как и следовало ожидать, характерны для динамических объектов. Атрибуты ресурсов позволяют описать обмен энергетическими, предметными и информационными сущностями и, тем самым, моделировать открытые системы.
Изучению семантики данных в базах данных препятствует некоторая недовыясненность сути предмета, отсутствие единых признанных подходов и терминологическая путаница. Определенные затруднения вызывает увеличение количества предметных областей, с которыми необходимо работать, и неизбежное усиление роли лингвистического аспекта.
Полезно заимствовать опыт тех областей знания, в которых давно занимаются семантикой. Это лингвистика, исследующаяся естественные языки (ЕЯ), и теория языков программирования.
Прежде всего, отметим несоответствие некоторых терминов в лингвистике и информатике. Лингвисты выделяют два противопоставляемых вида элементов семантики — значения и смыслы. Значение лингвистического знака понимается как нечто стабильное, что можно сначала установить, выяснить, а затем знать. Смысл приходится все время искать, устанавливать, разгадывать. В информатике термин "значение" уже занят. Говоря "переменная имеет значение" подразумеваем не семантику этой переменной, а присваивание ей конкретного экземпляра данных, или означивание, или создание экземпляра переменной, содержащего этот элемент данных. Поэтому элементы семантики мы всегда будем называть смыслами, а "стабильность" или "контекстность" или "вариативность" смыслов будем задавать через классификацию смыслов или вводя в них дополнительные свойства.
Давно известно, что значения и смыслы — это внеязыковые сущности. В частности, для перевода с одного естественного языка на другой ЕЯ может создаваться специальный язык функций для представления семантики, в который транслируются фразы исходного языка. А уже с этого промежуточного языка осуществляется трансляция на второй ЕЯ. Тезис о внеязыковой природе смыслов мы трансформируем для баз данных в несколько смягченную форму как утверждение о возможности разделения данных и смыслов.
В языках программирования обратим внимание на возможность выделения нескольких видов семантики: операционной (описывается в терминах перехода состояний некоторой абстрактной машины), денотационной (в языке для представления семантики используются математические структуры, позволяющие установить возможность вычисления конструкций языка посредством специализированных функций), дедуктивной (позволяет доказывать свойства программ, в первую очередь их правильность), трансляционной (использует правила перевода на язык, семантика которого известна), основанной на таблицах решений и т.д.
Вернемся к терминологии баз данных. Существует безосновательная, но устойчивая традиция выделять некоторые модели и базы данных как семантические (и мы тут не без греха). Так модель "сущность-связь" считается семантической моделью, по-видимому, по сравнению с табличными моделями данных. Однако, семантика, обычно ограниченная, есть в любых моделях данных. Поэтому, еще в 1988 году Э. Кодд отметил, что "ярлык "семантическое" не должен интерпретироваться в каком-либо абсолютном смысле". В тех же табличных базах семантику определяют, в частности, ключи и ограничения целостности. В базах данных с декларативными языками всегда реализуется операционная семантика, представляемая, например, планами исполнения SQL. Так что следует говорить только о большей или меньшей насыщенности моделей и баз данных семантикой.
Как же отделить элементы семантики, хранимые в базе, от обычных данных? По очень простому признаку: элементы семантики, они же смыслы, обладают активностью. Данные всегда пассивны.
Поясним сказанное на простом примере. Пусть, необходимо выбрать все записи из таблицы, например, инструкцией SELECT * FROM emp. Очевидно, СУБД должна сначала проверить существование таблицы emp по словарю и, может быть, установить, имеются ли у действующего пользователя необходимые права на эту таблицу. Если таблица не существует или недоступна, выдать сообщение об ошибке. В противном случае, установить список столбцов emp и только после этого приступить к выборке данных. Как много делается того, что прямо не было указано! Все это обеспечивает активность, которой обладают метаданные.
Еще один пример. Пусть мы вставляем строку в таблицу, имеющую первичный ключ. Поскольку ограничение "первичный ключ" активно, СУБД сначала проверит уникальность вводимого значения ключа, и только если это условие выполнено, сделает то, что ей приказали — введет запись.
Заметим, что активность смыслов выводит модели данных со смыслами за рамки обычных чисто алгебраических моделей данных.
Как далеко следует заходить в насыщении базы данных семантикой? Все зависит от того, имеется ли необходимая информация, насколько нужна семантика, что позволит сделать используемая СУБД и имеющиеся в распоряжении дополнительные программные средства, что дает использование внешних источников семантики, например, онтологий, и от возможностей второго слоя СУБД.
В следующих разделах мы постараемся ответить на вопрос о том, какие смыслы, кроме перечисленных выше, можно хранить в базах данных и как это сделать. Но сначала уточним, какие виды сущностей могут храниться в базах данных.
12.1 Сущности с разносортными атрибутами
12.1.1 Какие концепты могут отображаться в базах данных
В предыдущих разделах для описания сущности задавалось ее уникальное имя и один или более атрибутов. Неявно предполагалось существование не менее одного атрибута, а в описаниях экземпляров сущностей обязательное задание значений всех атрибутов. Допускалось, что значения некоторых атрибутов может быть неизвестно, и тогда им присваивался символ отсутствующего значения NULL. Атрибуты рассмотренного вида будем называть обязательными. Долгое время все атрибуты считались обязательными, что соответствовало идеологии и духу учетных систем. Трудно представить себе, например, ведомость на выплату зарплаты, в которой для некоторых работников не обязательно указание фамилии.
В полуструктурированных данных часть атрибутов обязательна, а другие атрибуты, не обязательные, могут существовать у одних экземпляров сущности и отсутствовать у других. Представим, что необходимо выяснить круг лиц интересующихся некоторым сайтом. Можно, конечно, запретить вход на сайт лицам, которые точно не укажут имена, явки, пароли, серию, номер паспорта и массу других нужных нам сведений. Но ведь они могут просто отказаться от посещения сайта? Так что лучше уж разрешить посетителям сообщить о себе что-нибудь и добавить сведения, которые они сочтут важными. Если кто-то в графе "имя" напишет "DJVasja", то я конечно буду знать, что это не человеческое имя, но ведь оно как-то характеризует посетителя. А если кто-то сам добавит атрибут "цвет глаз" со значением "голубые", то это повод выделить подкатегорию лиц, для которых цвет глаз важен.
Можно считать, что переход от хорошо структурированных данных с обязательными атрибутами к полуструктурированным данным — это движение от систем с обученными и ответственными пользователями к системам с неквалифицированными (в рамках системы) и безответственными пользователями.
Существуют концепты без атрибутов. Их часто используют философы, создавая некоторые структуры из двух и более концептов, например, используя противопоставления или перечни альтернатив. С концептами без атрибутов можно работать, используя естественные для человека рассуждения на примерах. В качестве полезного и совсем не тривиального упражнения предлагается построить базу, допускающую сущности без атрибутов.
В общем случае можно предположить существование концептов со сложно структурированными системами разносортных атрибутов. Достаточно широкое определение концепта можно получить, выделив пять классов атрибутов — обязательные, необязательные, состояния, ресурсы и смыслы. Предполагается, что в моделях понятий допускаются некоторые структуры на атрибутах, а пути сужения/обобщения понятий задаются явно. Могут использоваться ограничения на значения атрибутов и их комбинаций.
Кроме приведенной классификации по сортам атрибутов можно разбить концепты предметной области по их назначению на предметные (вещные, энергетические, информационные) сущности, сущности-связи и сущности-процессы.
Связи рассматриваются как концепты с двумя основными видами атрибутов. Первые определяют стороны связи, а вторые эмерджентные свойства, появляющиеся только при наличии связи. Понятия-связи могут уточняться добавлением атрибутов, определяющих возможность задействования связи, в частности, задающих нелинейности, и атрибутов, определяющих состояние и историю связи.
Конечно, искушенный читатель понимает, что создать, например, таблицу, хранящую атрибуты такой связи недостаточно. Необходимо обеспечить ее активность.
Сущности-процессы можно определить как связи особого вида с четырьмя группами атрибутов, определяющих то, что действует (субъект), то, над чем выполняется действие (объект), какое действие (сценарий) выполняется и, наконец, при каких условиях, с какими ограничениями и свойствами идет процесс. Под сценарием следует понимать связный и взаимно обусловленный набор действий.
Для открытых систем выделяется класс сущностей-ресурсов. Желательно определить для них характеристики доступности и, если это возможно, законы сохранения и преобразования, хотя бы локальные. Используются ограничения на ресурсы и атрибуты любых концептов.
Сами ресурсы многосортны, а ресурсы некоторых сортов могут порождать ресурсы других сортов. Важно понимать, что ресурс может быть доступен экземпляру сущности или всему классу, но не является их свойством.
По-видимому, наиболее естественный подход к моделированию систем с ресурсами это разработка системы концептов, позволяющих описывать вмещающие пространства, существующие в них потоки ресурсов и распределенные объекты изучаемой системы.