N модель данных: базовые понятия

N-МОДЕЛЬ ДАННЫХ: БАЗОВЫЕ ПОНЯТИЯ

Ольховик Олег Владимирович Белых Александр Валерьевич

Введение

Данная работа посвящена проблеме снижения трудоемкости поддержания жизненного цикла программного обеспечения информационных систем (ПО ИС). Решая эту проблему, мы исходили из необходимости создания инструмента, позволяющего сократить затраты на всех этапах жизненного цикла, вне зависимости от принятой модели. Подобные инструменты, поддерживающие общий подход, описанный в [1], уже хорошо известны. Они акцентируются на различных аспектах процесса разработки ПО и их сравнительный анализ произведен, например, в работе [2]. Наиболее серьезный набор инструментов на данный момент представлен в линейке продуктов IBM Rational. Среди них IBM Rational Software Architect и IBM Webshere Application Server, которые позволяют из результатов проектирования автоматически генерировать программный код [3]. Однако, по нашему мнению, вполне целесообразна разработка инструмента, выполняющего сходные функции, но с использованием более простых и менее затратных методов и средств.

Рассмотрим возможности, которыми, по нашему мнению, должен обладать такой инструмент. На этапах анализа и проектирования он должен описывать требования к ПО ИС в виде набора однотипных проектных диаграмм, выполненных на визуальном языке проектирования. Здесь важно чтобы диаграммы воспринимались достаточно легко как аналитиками, так и специалистами в предметной области, что позволит им более эффективно взаимодействовать друг с другом.

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

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

На этапе сопровождения важно сохранять соответствие между проектными артефактами и программным кодом. На практике оно часто не соблюдается из-за того, что изменения нужно вносить, как минимум в двух местах. Поэтому инструмент должен позволять легко вносить изменения в эксплуатируемое программное обеспечение через проектные диаграммы. Тем самым, можно гарантировать полное соответствие проектных и программных артефактов на всех этапах жизненного цикла ПО ИС.

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

1. Объекты

Важнейшим понятием в ^модели является объект. Будем считать объектом то, что может быть обособлено в нашем сознании от прочего внешнего мира. Это может быть какой-либо конкретный предмет, или процесс, или состояние чего-либо, или абстрактное понятие. Каждому объекту соответствует некое представление о нем. Представления об одних и тех же объектах у нас могут отличаться, но, в принципе, мы почти всегда можем договориться об одном и том же объекте идет речь, или о разных. То есть, большинство объектов мы идентифицируем одинаково, хотя можем представлять их по-разному.

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

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

Поскольку мы не оперируем реальными объектами, а оперируем их представлениями, далее, для краткости, будем называть эти представления объектами.

Итак, имеется счетное множество образов Е={в1,в2,...,еп}. Объектное пространство Х={х1,х2,...,хт} состоит из объектов, каждый из которых представляет собой некоторое множество образов: X сБ(Е).

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

Экстенсионалом объекта будем называть множество объектов, каждый из которых является неким его подмножеством. Иначе говоря, экстенсионал объекта состоит из него самого и объектов, которые его конкретизируют. Через Ех1г будем обозначать экстенсионал произвольного объекта х{ (с тем же индексом):

Ехи = {х / хсх} (1.1).

Интенсионалом объекта будем называть множество объектов, для которых он является подмножеством:

1пи = {х / х(сх} (1.2).

2. Свойства объектов

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

Поскольку свойства информационных объектов принято определять через атрибуты, и это удобно, будем считать, что свойства объектов из Х определяются атрибутами. Атрибут - это функция, определенная на множестве объектов. Аналитические свойства объектов определяются через свойства образов, которые являются функциями f eF\ FE^B(P). Собственно свойства объектов представлены множеством функций feF, F^X^B(P) таких, что

i = n

f(x) = U f'(вг), где {eo,e1,...,er}=x, neN (2.1).

i = 0

Элемент feF называется атрибутивной функцией или атрибутом.

Множество P - это в общем случае некоторое пространство значений. Для простоты P можно ограничить счетным множеством натуральных чисел, которые затем могут интерпретироваться в любой доступной форме: как вещественные числа, литералы, изображения и т.д. При этом выделим число Х„ которое будем интерпретировать как неопределенность (null). Поскольку множество образов счетно и, следовательно, счетно множество объектов Х, последнее из этих множеств можно проиндексировать натуральными числами. Это означает, что элементы P могут интерпретироваться еще и как идентификаторы объектов.

Как видно из (2.1), значение атрибута на объекте - это некое непустое множество, состоящее из элементов р еР. Если атрибут на объекте х принимает значение Л, то он неинформативен на х, в противном случае - информативен.

Введем отношение терминальности Е Объект называется терминальным на атрибуте, если все его образы имеют одинаковое значение функции /", соответствующей данному атрибуту, и, кроме того, атрибут информативен на объекте:

/Ех о /(х)Ф Л, Увех Д(в)=/(х) (2.2).

Также, для удобства, будем говорить, что атрибут терминален на объекте, если объект терминален на этом атрибуте.

Из определений экстенсионала (1.1) и терминальности (2.2) следует, что все объекты в экстенсионале терминального на каком-либо атрибуте объекта имеют такое же значение этого атрибута:

/Ех( УхеЕх1{ /(х)=/(х) (2.3).

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

Если значение атрибута на каждом терминальном объекте может содержать несколько элементов, то он называется множественным. Можно сказать, что на каждом объекте он принимает одномерный массив значений.

И множественные и ординарные атрибуты могут интерпретироваться как ссылки на другие объекты.

Из (2.1) и (1.1) следует важное утверждение: значение атрибута любого объекта состоит из значений этого атрибута на объектах, входящих в его экстенсионал:

7 = п

/х) = и f(х 7), где {хо,хь...,хп}=Ехи, п еИ (2.4).

7 = 0

Таким образом, можно предложить следующую интерпретацию значений атрибутов: если атрибут определен на терминальном объекте значением sс B(P), то все объекты в его экстенсионале имеют значение этого атрибута равное s. Если же атрибут на нетерминальном объекте имеет значение s, то можно лишь говорить, что каждый объект в его экстенсионале имеет значение этого атрибута равное некоторому подмножеству s. Плюс к тому можно сказать, что объединение этих значений дает s.

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

Хг *Xj o3feF, что f(x)fx), f(x)±X, f(xj) фХ (2.5).

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

Еще одной важной функцией является ID: X^N, которая индексирует множество объектов натуральными числами, или, иначе говоря, идентифицирует объекты. Обратную ей функцию, определяющую объект по его идентификатору, обозначим Obj: N^X. Причем, Obj(ID(x))=x, ID(Obj(n))=n.

3. Исходные атрибуты

Поскольку атрибуты - это функции, есть возможность задавать их различными способами. Основной способ - фактическое задание значений атрибутов. Для объекта, на котором атрибут информативен, непосредственно задается его значение. Это похоже на то, как определяются значения атрибутов

в реляционных или объектно-ориентированных базах данных. Поэтому атрибуты, значения которых задаются фактически, будем называть исходными.

Задание значения исходного атрибута на объекте означает, что для всех объектов в его экстенсионале значение этого атрибута будет таким же. Например, если мы говорим, что у какой-то модели монитора диагональ составляет 19 дюймов, то у всех конкретных мониторов данной модели диагональ так же будет 19 дюймов. Таким образом, объекты, на которых задаются значения исходных атрибутов, терминальны относительно этих атрибутов.

Также можно задавать атрибуты аналитическими выражениями (формулами). Такие атрибуты будем называть расчетными.

4. Экземпляры и классы

Как уже говорилось выше, в предметной области объекты из X могут соответствовать конкретным вещам, явлениям, процессам, либо их состояниям или множествам, либо абстрактным понятиям. Соответственно множество X можно разбить на четыре подмножества: объекты-сущности, объекты-

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

Обозначим через Д множество исходных атрибутов, на которых объект х, терминален:

Утверждение. Если объект х^ является подмножеством объекта х7, то множество Д является подмножеством Д. Иначе говоря, при возрастании мощности объекта, множество атрибутов, на которых он терминален, не увеличивается:

Д= {// / Ех>}

(4.1).

(4.2).

Доказательство:

Исходя из (2.2), атрибуты терминальные на х,, так же терминальны и на х. Если хг=х,, то Д=Д. Если хг является собственным подмножеством х, то существует объект хк = х, / хг. Если все атрибуты из Д имеют на хк то же значение, что и на х, то, согласно (2.3), Д= Д. Если же хотя бы на одном атрибуте/еД /(х^^Дх), то, также согласно (2.3), этот атрибут не терминален на х,. То есть, в этом случае разность множеств Д и Д содержит хотя бы одну функцию /, и тогда Д^Д. Таким образом, либо Д=Д, либо Д^Д, то есть Д^

Д.

Экземпляром называется такой объект х, для которого множество Д не пусто. Множество экземпляров обозначим через Ех:

Ех = {х( / Д ф0} (4.3).

Объект хг является концепт-объектом, если ни один исходный атрибут на нем не терминален: Д =0.

Класс - это концепт-объект, состоящий из экземпляров, у которых множества Д содержат одинаковые атрибуты. Множество классов обозначим символом С:

г = п

С = {с / с = и х г , Ухг Д ^Д} (4.4),

г = 1

где Д - некоторое множество исходных атрибутов. Иными словами, множество атрибутов Д определено на классе с, если любой экземпляр этого класса хг терминален на множестве Д.

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

Утверждение. Два различных экземпляра одного класса имеют различные значения хотя бы одного исходного атрибута, терминального на них: х!,х2еЕх1 =^3/еД, чтоДх1)ФДх2) (4.5).

Утверждение. Различные экземпляры одного класса не пересекаются: х1,х2ЕЕх{ =^х1Пх2=0 (4.6).

Доказательство:

Допустим, что х1 и х2 пересекаются, и, следовательно, существует такой непустой объект х3=х1пх2. Тогда х3еЕх11 и х3еЕх12. В этом случае, согласно

(2.3), любой атрибут/из Д будет иметь значение на объектах х1 и х2 такое же, как на объекте х3: /(х1)=/(х2)=/(х3). Однако это противоречит утверждению (4.5). Следовательно, х1 и х2 не пересекаются.

Утверждение. Класс сг является подмножеством класса су, если множество терминальных на экземплярах класса с, функций Д является собственным подмножеством множества функций Дг класса сг:

Д^Д =>с{ сс, (4.7).

Доказательство:

Поскольку ДсД, то все экземпляры класса сг терминальны на множестве атрибутов Д. Тогда, исходя из (4.4), они входят в класс су. Следовательно, исходя из того, что класс также представляет собой объединение своих экземпляров (4.4), сг с^с,.

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

Дс:Д => Ух1 еЕх1 Зх2 еЕх

что х1сх2, и -,Бх3еЕху, что х1сх3 (4.8).

Доказательство:

Исходя из (4.7), произвольный экземпляр х1 класса сг, входит в класс с,. Следовательно, возможны три варианта отношений между экземпляром х1 класса и произвольными экземплярами х2 и х3 класса с,. первый вариант: экземпляр класса сг строго включает в себя хотя бы один произвольный экземпляр класса с,, то есть, х1^х2. Это противоречит (4.2). Второй вариант:

экземпляр класса сг частично или полностью входит в экстенсионал двух или более экземпляров класса с,, то есть, х1=х'1ик"1, х'1сх2 и х"1сх3. Это противоречит (4.6). Остается третий вариант, когда экземпляр х1 входит экстенсионал точно одного экземпляра х2, что и требовалось доказать.

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

Д^Д о с о с, (4.9).

Исходя из свойств отношения строгого включения, наследование является полным порядком, то есть оно транзитивно, иррефлексивно и антисимметрично.

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

сг т с, о сг о с-Вск, что сг о ск и ск о с, (4.10).

Разграничим случаи простого и кратного наследования. При простом наследовании всякий класс может прямо наследовать только от одного класса: сгт с, => -Зск, что с1 т ск (4.11).

При кратном наследовании класс может прямо наследовать от любого числа классов. Ограничение (4.10) не действует.

Теперь введем определение отношения наследования на множестве экземпляров. Экземпляр х1 класса сг наследует от экземпляра х2 класса с, тогда и только тогда, когда сг наследует от с,, и х1 является подмножеством х2: с1 ос,, х1 еЕх, х2еЕх,, х1^х2 ох1ох2 (4.12).

Прямое наследование на экземплярах определяется так: ст, х1 еЕхг, х2еЕх,, х1^х2 ох1ох2 (4.13).

5. Правила определения атрибутов

Для удобства будем считать константы исходными атрибутами, терминальными на абстрактном объекте x0. Тогда правильное задание атрибута определим рекурсивно:

P1. Исходный атрибут правильно задан на классе, если для него определен тип данных и имя, которое не встречается в интенсионале этого класса. Если исходный атрибут - ссылка, то вместо типа данных, для него должен быть определен экстенсионал, на который он ссылается. Экстенсионал может быть задан именем концепт-объекта.

P2. Расчетный атрибут правильно задан, если его формула является записью последовательности допустимых операций над исходными атрибутами. Множество допустимых операций может быть пустым, если исходный атрибут один. Имя расчетного атрибута, который определен в классе, также не должно встречаться в интенсионале этого класса. Если атрибут определен в категории, то его имя может встречаться в интенсионале этой категории (в этом случае возникает перекрытие).

P3. Расчетный атрибут правильно задан, если формула является записью последовательности допустимых операций над правильно заданными атрибутами.

Запись последовательности допустимых операций может выполняться в любой форме, хотя удобней и привычней инфиксная.

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

6. Операции над атрибутами

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

Во-вторых, расчетный атрибут терминален на экземплярах того класса, где он задан. Для экземпляров других классов его значение определяется по

(2.3) и (2.4). То есть, операции выполняются только на терминальных объектах.

Мы рассмотрим унарные и бинарные операции, поскольку с их помощью можно конструировать операции любой арности.

Произвольную унарную операцию обозначим символом / Результат операции определяется выражением:

h(x)= /f(x), h(x)= (qeP/q=/(p), pef(x)}.

В качестве унарных операций могут выступать одноместные функции, такие как sin, cos, lg, sqrt или любые другие функции определяемые пользователем (UDF).

Произвольную бинарную операцию обозначим символом . Результат операции определяется выражением:

h(x)=f(x)0g(x), h(x) = (qeP/q=p0s, pef(x), seg(x)}.

Примерами бинарной операции могут быть арифметические операции +, -, *, /, div, mod или конкатенация || или же двухместная UDF.

Результаты операций объединения, пересечения и взятия разности определяются как у соответствующих теоретико-множественных операций, за исключением случая, когда функция неинформативна на объекте: h(x)=f(x)ug(x), h(x) = (qeP/qef(x) v qeg(x)}, h(x)=f(x)ng(x), h(x) = (qeP/qef(x) Aqeg(x)}, h(x)=f(x) /g(x), h(x) = (qeP/qef(x) Aq0g(x)}.

Агрегатные операции характеризуются тем, что производятся над всеми элементами значения атрибута и, в независимости от их числа, результат будет ординарным. К числу таких операций относятся: подсчет количества (Count) или суммы (Sum) значений, а также определение среднего (Avg), максимального (Max) или минимального (Min) значения: h(x)=Count(f(x)) =\ f(x)\,

i = n

h(x)=Sum( f(x)) = X q г, где (qi,q2,---,qn}=f(x),

i = 1

h(x)=Avg( f(x)) = Sum(f(x)) / Count(f(x)), h(x)=Max( f(x)) = sup f(x), h(x)=Min( f(x)) = inf f(x).

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

i = n

h(x)=f(x).g, h(x) = U g (x,) , где xi=Obj(qi), qiEf(x).

i = 1

Композиция, по сути, позволяет делать то, что в реляционной модели выполняется через операцию соединения.

Другая специальная операция - инволюция. Она позволяет определить для терминального объекта, какие объекты из заданного множества ссылаются на него через определенный атрибут-ссылку. В инволюции два аргумента: первый аргумент - некоторое множество объектов, а второй - атрибут-ссылка: h(x)=Inv(X', f), h(x) = (ID(x) / xteX', lD(x)ef(x), feFj.

Здесь множество Х'имеет смысл задавать именем концепт-объекта.

Итак, множество операций замкнуто на атрибутах, и результат операции рассчитывается только для терминальных объектов.

7. Категории

Под категорией понимается концепт-объект, представляющий собой объединение экземпляров класса, на которых истинно некоторое логическое условие L. Простое условие будем обозначать символом H, возможно, с индексом. Оно имеет вид fi comp-op f2, где fi и f2 - атрибуты (в т.ч. f2 может быть константой), а comp-op - операция сравнения (=, !=, >, <, <=, >=). Простые условия могут быть соединены связками AND, OR и NOT, образуя произвольное условие L. Обозначим произвольную категорию ctu тогда для определения категории необходимо указать класс ск, экземпляры которого она

выделяет, и условие, которое должно быть истинным на этих экземплярах. Если условие простое, то категория определяется выражением:

си[ек, Ь=Н= ^сотр-ор/2] о

7 = т

си= 1.^ х 7, \/х-ЕЕхк, \ZXj- /1(х-) сотр-ор/2(х-)=ггие.

Множество экземпляров класса, входящих в произвольную категорию си будем обозначать Ехс{ с таким же индексом.

Если условие содержит логические связки, то имеются следующие соответствия:

си[ск, ¿1ОЯ Ь2]=сг1[Ск, Ь1]исг2[ск, Е2], си[ск, Ь1АИБ Ь2]=си[ск, Ь1]псг2[ск, Ь2], си[ск, ИОТ Ь1]=ск / сг1[ск, Ь1]].

Множество категорий обозначим словом Саг.

Теперь введем интерпретацию отношения наследования для категорий. Категория наследует от другой категории сг- тогда и только тогда, когда условие первой категории включает в себя условие второй категории:

Ь = Ь- АИБ V о си со сг- (7.1),

где - Ь' непустое логическое условие, определенное в соответствии с вышеописанными правилами. Как и в случае с классами, наследование в категориях транзитивно, иррефлексивно и антисимметрично.

Очевидно, что если категория си наследует от категории сг-, то является ее подмножеством:

си со с^ => си^ си (7.2).

Категория сг{ прямо наследует от другой категории сг-, если она наследует от нее нетразитивно:

си & си о сг{ со си, —Зск, что сг{ со сгк и сгк о си (7.3).

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

что категория си прямо наследует от класса ск тогда и только тогда, она прямо наследует от его категории сГк:

си шск о си шсг\ (7.4).

На категории может быть определено некоторое множество расчетных атрибутов 3'. Атрибут, определенный на категории, считается терминальным на всех экземплярах класса, входящих в эту категорию. Однако информативным он будет только в экстенсионале тех концепт-объектов (класса или категорий), на которых он определен.

Атрибуты, определенные на категориях, могут перекрывать атрибуты

класса или других категорий этого класса. Под перекрытием атрибута

понимается то, что значение этого атрибута в экземплярах некоторых

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

Q1. Допустим, что на некотором концепт-объекте х определен атрибут /. Атрибут / правильно перекрыт, если определен в наследующей от х категории с тем же именем, что и в х, но с другой формулой.

Q2. При перекрытии тип данных атрибута должен сохраняться.

Q3. В экземплярах категории, где перекрыт атрибут, его значения рассчитываются по формуле, определенной в этой категории. Причем

перекрываться может даже исходный атрибут.

8. Отношение наследования

Отношение наследования на множестве объектов, которое определено в этой работе, может иметь различную интерпретацию, и зависит от природы объектов. Для классов оно обусловлено отношением между множествами терминальных атрибутов (4.9), для категорий - отношением между условиями (7.1), для экземпляров - отношениями между классами и самими экземплярами (4.12). Тем не менее, наследование везде сохраняет свои особенности. Во-первых, оно везде обладает свойствами транзитивности, иррефлексивности и

антисимметричности, т.е. задает полный порядок. Во-вторых, для объектов любой природы можно сказать, что если один объект наследует от другого, то является его подмножеством (4.7), (4.12), (7.2). В-третьих, наследование везде одинаково может интерпретироваться на естественном языке выражением «это есть».

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

Отношение прямого наследования соотносится с отношением наследования как, например, отношения «родитель» и «предок». Как видно из (4.10), (4.13), (7.3) и (7.4), прямое наследование отличается нетранзитивностью. Вследствие чего оно позволяет практически задавать порядок наследования между объектами в базе данных.

9. Понятие базы данных

Определим схему базы данных (БД), как n-ку Sh=<C, Cat, m F, Type, Ю>, где C - множество классов; Cat - множество категорий; m- отношение прямого наследования; F - множество информативных атрибутов; Type - множество типов данных; Ю - множество имен.

Каждый класс определяется тройкой <Name, Д Д'>, где Namee Ю -имя класса в схеме; Д - множество исходных атрибутов, определенных на классе; Д' - множество расчетных атрибутов, определенных на классе (Д Д'^F).

Каждая категория определяется тройкой <Name, L, Д'>, где Namee Ю -имя категории в схеме; L - условие категории; Д' - множество расчетных атрибутов, определенных на категории ^'^F).

Имя каждого класса или категории должно быть уникальным в множестве классов и категорий.

Отношение m определяет наследование между классами, экземплярами и категориями.

В множество F входят только те атрибуты, которые информативны хотя бы на одном классе или категории. Согласно (2.3) и (2.4), атрибут может быть информативен на классе (т. е. на его экземплярах), если

- определен на этом классе или его категории;

- определен на классе, от которого он наследует, или его категории;

- определен на классе или категории класса, который наследует от него.

Атрибуты классов и категорий определяются по правилам P1 - P3, а так

же по правилам перекрытия Q1 и Q2. Исходный атрибут задается именем и типом данных из Type. Исключение составляют атрибуты-ссылки, которые задаются своим именем и именем класса или категории, на экземпляры которых ссылаются. Расчетный атрибут задается именем и формулой. Причем в формулах допускаются только операции, определенные в п.6.

Базу данных определим как двойку <Sh, Ex>, где Sh - схема БД, а Ex -множество экземпляров классов из этой схемы.

Единственной допустимой структурой данных является класс (4.4).

С учетом возможностей операций над атрибутами, описанными в п.6, базовые операции над объектами на первое время можно ограничить проекцией и ограничением, которые выполняются на классах. Причем ограничение, по сути, выделяет некоторую категорию в классе, а проекция сужает множество атрибутов, информативных на классе.

Ограничения целостности в БД определяются выражениями (4.5), (4.8) и правилом P1. Функция ID, индексирующая экземпляры классов, выполняет роль суррогатного ключа.

Значения атрибутов, определенных на классе, задаются на экземплярах этого класса. Для исходных атрибутов значения определяются непосредственно на каждом экземпляре. Значения расчетных атрибутов вычисляются по соответствующим формулам с учетом правила перекрытия Q3. Значения

атрибутов не определенных на классе, но информативных на нем, вычисляются по (2.3) или (2.4) в зависимости от места их определения.

Заключение

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