Опубликован: 10.10.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский физико-технический институт
Лекция 10:

Проектирование реляционных баз данных с использованием семантических моделей: диаграммы классов языка UML

< Лекция 9 || Лекция 10: 123456

Ограничения целостности и язык OCL

Как уже отмечалось, в диаграммах классов могут указываться ограничения целостности, которые должны поддерживаться в проектируемой БД. В UML допускаются два способа определения ограничений: на естественном языке и на языке OCL. На рис. 10.13 показана простая диаграмма классов Студент и Университет с ограничением, выраженным на естественном языке.

Ограничение, выраженное на естественном языке

Рис. 10.13. Ограничение, выраженное на естественном языке

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

Общая характеристика языка OCL

Более точный и лаконичный способ формулировки ограничений обеспечивает язык OCL (Object Constraints Language). Вот общая характеристика этого языка.

Из языка UML 9Хотя язык OCL формально считается частью UML, он специфицирован в отдельном документе, в котором присутствуют ссылки на другие части спецификации UML, а также вводятся собственные понятия и определения. в OCL заимствованы, в первую очередь, следующие концепции:

  • класс, атрибут, операция ;
  • объект (экземпляр класса );
  • ассоциация ;
  • тип данных (включая набор предопределенных типов Boolean, Integer, Real и String);
  • значение (экземпляр типа данных).

Для понимания языка OCL существенны определяемые в UML традиционные для объектных моделей данных различия между объектом некоторого класса и значением некоторого типа:

  • объект обладает уникальным идентификатором и может сравниваться с другими объектами только по значению идентификатора; следствием этого является возможность определения операций над множествами объектов в терминах их идентификаторов 10Следует заметить, что ни в спецификации UML, ни в описании какой-либо другой объектной модели никогда прямо не говорится, что в операциях над множествами объектов в действительности участвуют идентификаторы объектов. Но другого понимания не существует. ;
  • объект может быть ассоциирован через бинарную связь 11Обратите внимание, что хотя, в UML допускаются n -арные связи, в OCL речь идет только об уже привычном для нас бинарном варианте. с другими объектами, что позволяет определить в OCL операцию перехода от данного объекта к связанным с ним объектам;
  • в то же время значение является "чистым значением" в том смысле, что:
    • при сравнении двух значений проверяются сами эти значения;
    • кроме того, значения не могут участвовать в связях, поскольку понятие связи определено только для объектов классов.

В дополнение к скалярным типам данных, заимствованным из UML, в OCL предопределены структурные типы, которые являются разновидностями типов коллекций (collection):

  • математическое множество (set), неупорядоченная коллекция, не содержащая одинаковых элементов;
  • мультимножество (bag), неупорядоченная коллекция, которая может содержать повторяющиеся элементы-дубликаты;
  • последовательность (sequence), упорядоченная коллекция, которая может содержать элементы-дубликаты. 12В контексте проектирования реляционных БД (если не иметь в виду использование объектно-реляционных СУБД) последняя разновидность типа коллекции является бессмысленной, поскольку в реляционных БД упорядоченность не поддерживается. Поэтому мы не будем обсуждать детали операций над последовательностями.

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

Язык OCL предназначен, главным образом, для определения ограничений целостности данных, соответствующих модели, которая представлена в терминах диаграммы классов UML. OCL может применяться для определения ограничений, описывающих пред- и постусловия операций классов, и ограничений, представляющих собой инварианты классов. При проектировании реляционных баз данных возможность определения пред- и постусловий операций вряд ли может оказаться существенной 13Если снова не иметь в виду использование объектно-реляционных СУБД.. С точки зрения определения ограничений целостности баз данных более важны средства определения инвариантов классов.

Инвариант класса

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

context <class_name> inv:
<OCL-выражение>

Здесь <class_name> является именем класса, для которого определяется инвариант, inv – ключевое слово, говорящее о том, что определяется именно инвариант, а не ограничение другого вида, и context – ключевое слово, которое говорит о том, что контекстом следующего после двоеточия OCL -выражения являются объекты класса <class_name>, т. е. OCL -выражение должно принимать значение true для всех объектов этого класса.

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

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

  • операции над значениями предопределенных в UML (скалярных) типов данных;
  • операции над объектами ;
  • операции над множествами;
  • операции над мультимножествами;
  • операции над последовательностями.

Последовательно обсудим эти группы операций.

Операции над значениями предопределенных типов данных

Полагая очевидной семантику предопределенных скалярных типов данных и операций над ними, ограничимся лишь их перечислением. В OCL поддерживаются следующие заимствованные из определения UML скалярные типы данных: Boolean, Integer, Real и String.

Операции над объектами

В OCL определены три операции над объектами:

  • получение значения атрибута ;
  • переход по соединению,
  • вызов операции класса (последняя операция для целей проектирования реляционных БД несущественна).

Для записи этих трех операций используется "точечная нотация". Например, результатом выражения вида

<объект>.<имя атрибута>

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

Результатом применения к объекту операции перехода по соединению ( экземпляру связи-ассоциации ) является коллекция, содержащая все объекты, которые ассоциированы с данным объектом через указываемое соединение. Это соединение идентифицируется именем роли, противоположной по отношению к данному объекту. Таким образом, синтаксис выражения перехода по соединению следующий:

<объект>.<имя роли, противоположной по отношению к объекту>
< Лекция 9 || Лекция 10: 123456
Nikolay Karasev
Nikolay Karasev

Хотелось бы иметь возможность читать текст сносок при использовании режима "Версия для печати"
 

Александра Каева
Александра Каева
Ирина Шелтер
Ирина Шелтер
Россия, Нижний Новгород, НГПУ им. К.Минина, 2011
Михаил Бородай
Михаил Бородай
Россия, г. Москва