Хотелось бы иметь возможность читать текст сносок при использовании режима "Версия для печати" |
Проектирование реляционных баз данных с использованием семантических моделей: диаграммы классов языка UML
Ограничения целостности и язык OCL
Как уже отмечалось, в диаграммах классов могут указываться ограничения целостности, которые должны поддерживаться в проектируемой БД. В UML допускаются два способа определения ограничений: на естественном языке и на языке OCL. На рис. 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 определены три операции над объектами:
- получение значения атрибута ;
- переход по соединению,
- вызов операции класса (последняя операция для целей проектирования реляционных БД несущественна).
Для записи этих трех операций используется "точечная нотация". Например, результатом выражения вида
<объект>.<имя атрибута>
является текущее значение атрибута с именем имя атрибута, если объект имеет такой атрибут. В противном случае использование подобного выражения приводит к возникновению ошибки типа.
Результатом применения к объекту операции перехода по соединению ( экземпляру связи-ассоциации ) является коллекция, содержащая все объекты, которые ассоциированы с данным объектом через указываемое соединение. Это соединение идентифицируется именем роли, противоположной по отношению к данному объекту. Таким образом, синтаксис выражения перехода по соединению следующий:
<объект>.<имя роли, противоположной по отношению к объекту>