|
Программирование >> Хронологические базы данных
ку в объектных системах не всегда четко прослеживается разница между значениями и переменными (т.е. между неизменяемыми и изменяемыми объектами), возникают проблемы различения значения и возможного замещения переменной (этот вопрос обсуждается в главе 19). Возможность применять один и тот же метод для объектов класса X и класса Y называется полиморфизмом. Обычно объектные системы поставляются с определенной встроенной иерархией классов. Например, в системе OPAL (см. раздел 24.4) каждый класс рассматривается как подкласс некоторого уровня встроенного класса OBJECT (поскольку все является объектами ). Встроенные подклассы класса OBJECT включают классы BOOLEAN, CHAR, INTEGER, COLLECTION и др. Класс COLLECTION, в свою очередь, включает подкласс BAG, а класс BAG содержит класс SET и т.д. и т.п. Наконец, в некоторых системах, кроме одиночного наследования, в той или иной форме поддерживается множественное наследование. Однако автору не известно ни одной системы, которая поддерживала бы наследование кортежей или отношений (как одиночное, так и множественное) в смысле, который подразумевался в [3.3]. 24.4. Простой пример в предыдущей главе были представлены базовые концепции объектного подхода. В данной главе на простом примере последовательно демонстрируется применение этих идей на практике, а именно - как определяется объектная база данных, как она пополняется данными, как в ней выполняются операции извлечения и обновления данных. В рассматриваемом примере используются объектная СУБД GemStone (разработка корпорации GemStone Systems) и ее язык запросов OPAL [24.14]. Язык OPAL, в свою очередь, основывается на языке Smalltalk [24.26], одном из наиболее истинно объектных языков (поэтому он здесь и используется). Замечание Необходимо добавить, что язык Smalltalk появился на рынке раньше, чем язык С++, и гораздо раньше, чем язык Java. Однако несмотря на это два последних языка являются менее чистыми объектными языками, чем Smalltalk. В качестве примера воспользуемся упрошенной версией базы данных профессиональной подготовки из упр. 8.10 главы 8. В этой базе данных содержится информация о схеме подготовки и обучения специалистов внутри некоторой компании. Для каждого курса обучения (COURSE) в базе данных содержится описание отдельных потоков, организованных для его изучения (OFFERING). Для каждого потока хранятся данные обо всех его слушателях (ENROLLMENT) и преподавателях (TEACHER). Кроме того, в базе содержатся сведения о сотрудниках компании. Реляционную версию базы данных можно описать следующим образом. COURSE { COURSEI, TITLE } OFFERING { COURSE*, OFF#, OFFDATE, LOCATION } TEACHER { COURSE*, OFF#, EMP* } ENROLLMENT { COURSE*, OFF*, EMP*, GRADE } EMP { EMP*, ENAME, SALARY, POSITION } Ha рис. 24.6 показана диаграмма связей для рассматриваемой базы данных. Более подробно она описана в главе 8, в упражнениях и ответах к упражнениям. COURSE OFFERING ENROLLMENT TEACHER EMPLOYEE Puc. 24.6. Диаграм.ма связей для образовательной базы данных Определение данных Теперь перейдем к определению данных на языке OPAL для образовательной базы данных. Ниже приводится первое определение объектного класса ЕМР, описывающего сотрудников (для удобства строки этого определения пронумерованы). 1 OBJECT SUBCLASS : ЕМР 2 INSTVARNAMES : [ EMPi, ENAME, POSITION ] 3 CONSTRAINTS : l[ l[ lEMPl, STRING ] , 4 [ #ENAME, STRING ], 5 [ #POSITION, STRING ] ] . Пояснения. В строке 1 определен объектный класс ЕМР, производный от встроенного класса OBJECT. (Согласно терминологии языка OPAL в строке 1 отсылается сообщение объекту OBJECT с запросом выполнить метод SUBCLASS, причем с помощью предложений INSTVARNAMES и CONSTRAINTS указываются параметры вызова этого метода. Для определения нового класса (как и всего прочего) необходимо отослать сообщение объекту.) В строке 2 указывается, что объекты класса ЕМР имеют три закрытые переменные экземпляра- ЕМР#, ENAME и POSITION, а в строках 3-5 на эти переменные экземпляра накладываются ограничения, указывающие, что они должны содержать объекты класса STRING. Замечание. В настоящей главе опускаются чисто синтаксические подробности, несущественные для преследуемых нами целей (например, вездесущие знаки присутствующие в приведенном выще примере). Подчеркнем, что переменные экземпляра ЕМР#, ENAME и POSITION - закрытые переменные для класса ЕМР, поэтому доступ к ним по именам допустим только в методах этого класса. В качестве примера ниже даны определения методов получить и установить , т.е. методов, позволяющих выбрать и обновить номера служащих (здесь символ можно читать как возвратить ). METHOD : ЕМР GET EMPi ~ЕМР# METHOD : EMP SET EMP* : EMP# PARM EMP# := EMP PARM В следующем подразделе о методах определения мы поговорим подробнее. А сейчас рассмотрим определение класса описания курса COURSE. 1 OBJECT SUBCLASS : COURSE 2 INSTVARNAMES : #[ COURSE*, TITLE, OFFERINGS ] 3 CONSTRAINTS : t[ l[ *COURSE#, STRING ] , 4 [ ITITLE, STRING ] , 5 [ iOFFERINGS, OSET ] ] . Пояснения. В строке 5 определена переменная OFFERINGS, которая содержит объект класса OSET, или, точнее, идентификатор объекта класса OSET. Выражаясь неформально, переменная OFFERINGS обозначает множество всех потоков для данного курса. Иначе говоря, связь курс - поток моделируется с помощью иерархии вложения, в которой потоки концептуально содержатся внутри соответствующего курса. Определение класса OSET будет дано ниже, а определение класса потока OFFERING может быть записано так. 1 OBJECT SUBCLASS : OFFERING 2 INSTVARNAMES : *[ OFFi, ODATE, LOCATION, 3 ENROLLMENTS, TEACHERS ] 4 CONSTRAINTS : *[ *[ iOFFi, STRING ] , 5 [ iODATE, DATETIME ], 6 [ iLOCATION, STRING ], 7 [ iENROLLMENTS, NSET ], 8 [ iTEACHERS, TSET ] ] . Пояснения. В строке 7 определяется закрытая переменная экземпляра ENROLLMENTS, содержащая идентификатор объекта класса NSET. Говоря неформально, переменная ENROLLMENTS описывает множество всех слушателей в данном потоке. Аналогично переменная TEACHERS описывает множество всех преподавателей потока. Следовательно, здесь вновь используется представление иерархии вложения. Определения классов NSET и TSET будут даны ниже. Определение класса слушателей ENROLLMENT может быть записано следующим образом. 1 OBJECT SUBCLASS : ENROLLMENT 2 INSTVARNAMES : i[ EMP, GRADE ] 3 CONSTRAINTS : i[ i[ iEMP, EMP ] , 4 [ IGRADE, STRING ] ]. Пояснения. В строке 3 определяется закрытая переменная экземпляра ЕМР, содержащая идентификатор объекта класса ЕМР, представляющий отдельного сотрудника, который является слушателем курса. Замечание. Чтобы продолжить иерархию вложения, объект ЕМР помешается в объект ENROLLMENT. Однако здесь можно заметить асимметрию: зачисление сотрудника на обучение в разные потоки описывается как отношение типа многие ко многим , однако члены этого отношения, сотрудники и потоки, обрабатываются совершенно по-разному.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |