|
Программирование >> Хронологические базы данных
истинным (в рассматриваемом примере это экземпляр объекта класса COURSE для курса с номером C001). Затем идентификатор этого объекта класса COURSE присваивается переменной COURSE C001. Замечание. В качестве аргумента метода DETECT можно также задать некоторый аргумент выхода на случай, когда выражение р(х) не будет истинным ни для одного объекта в коллекции. Однако такая детализация здесь опущена. В строках 4 и 5 переменной C001 OFFS присваивается идентификатор множества всех потоков для курса с номером С001. Строки 6-8 подобны строкам 2 и 3, поскольку встроенный метод SELECT подобен методу DETECT, за исключением того, что он возвращает идентификатор коллекции идентификаторов всех объектов (вместо того чтобы указывать только на первый найденный объект), для которых выражение р(х) является истинны.м. В рассматриваемом примере в результате выполнения этого метода переменной C001 NY OFFS присваивается идентификатор набора идентификаторов для тех потоков курса с номером СООГ, которые читаются в городе New York. В строке 9 этот идентификатор возвращается пользователю. Следует обратить внимание на некоторые особенности приведенного примера. 1. Условное выражение р(х) в методах SELECT и DETECT может содержать (в самом сложном случае) некоторое количество простых скалярных операторов сравнения, которые соединяются с помощью операторов AND, т.е. сложность данного условия поиска ограничена. 2. Квадратные скобки, окружающие выражение аргумента методов SELECT и DETECT, можно заменить круглыми скобками. При использовании круглых скобок в языке OPAL будет предпринята попытка задействовать индекс (если соответствующий индекс существует), а при использовании квадратных скобок индексы задействованы не будут. 3. Указание, что метод DETECT возвращает идентификатор первого найденного объекта, для которого значением выражения р(х) будет истина, означает, что найденный объект будет первым найденным при использовании произвольной последовательности поиска, которая будет выбрана языком OPAL для просмотра коллекции (внутри набора идентификаторов не задается никакой внутренней упорядоченности). В рассматриваемом примере это замечание не имеет особого смысла, поскольку первый объект, для которого выражение р(х) будет истинно, фактически является единственным таким объектом. 4. Внимательный читатель непременно заметит выражения наподобие метод DETECT , хотя, как отмечалось выще, методы в языке OPAL не имеют имен. Действительно, DETECT и SELECT не являются названиями методов (а потому выражения наподобие метод DETECT некорректны). Они, скорее всего, служат именами внещних параметров для некоторых встроенных (и анонимных) методов. Однако для краткости и простоты далее в качестве имен методов по-прежнему будут использоваться названия DETECT и SELECT (а также другие подобные им названия для других методов). В этом примере подразу.мевается, что такие методы, как GET COURCEi (аналог метода GET EMPi, описанного в этом разделе), уже определены. 5. Кроме того, внимательный читатель заметит, что довольно часто используется выражение метод NEW . В данном случае оно вполне корректно. В качестве исключения в языке OPAL допускается применение анонимных методов, которые не содержат каких-либо аргументов, кроме указания объекта-получателя. Операции обновления Объектный аналог операции вставки INSERT уже обсуждался в предыдущем подразделе, а аналоги операций обновления UPDATE и удаления DELETE рассматриваются ниже. Обновление. Операции обновления выполняются так же, как операции извлечения, но вместо методов GET используются методы SET . Удаление. Для удаления объектов используется встроенный метод REMOVE. Точнее, он используется для удаления идентификатора некоторого объекта из некоторой коллекции. Если на данный объект больше не имеется никаких ссылок, т.е. к нему вовсе не может быть осуществлен доступ, то в языке OPAL он автоматически удаляется системным процессом сборки мусора. Ниже приводится пример реализации операции удаления сотрудника с номером Е001 из набора всех сотрудников . Е001 := OID OF SET OF ALL EMPS DETECT : [ :ЕХ I (EX GET EMP# ) = EOOl ]. OID OF SET OF ALL EMPS REMOVE : EOOl . Ho как в такой ситуации реализовать правило каскадного удаления DELETE CASCADE? Например, как при удалении некоторого сотрудника одновременно удалить и сведения обо всех потоках, в которых он проходит обучение? Для этого, естественно, придется создать соответствующую процедуру. Можно прийти к заключению, что механизм реализации удаления с помощью процесса сборки мусора является всего лишь некоторой разновидностью реализации правила ограничения удаления ON DELETE RESTRICT, поскольку объект не удаляется до тех пор, пока на него существует хотя бы одна ссылка. Однако в данном случае это не совсем так. Например, объекты потоков (OFFERING) не содержат идентификаторов соответствующего объекта курса (COURSE), а потому потоки не накладывают ограничений на удаление объектов курсов. (В иерархиях вложения неявно подразумевается некоторая разновидность правила каскадного удаления, кроме случаев, когда пользователь выполняет следующее: либо включает идентификатор родительского объекта в дочерний объект; либо включает идентификатор дочернего объекта в какой-то другой объект. В таких ситуация интерпретация иерархии вложения не имеет никакого смысла. В следующем разделе этот вопрос будет рассмотрен при обсуждении обратных переменных.) В заключение заметим, что операция удаления REMOVE может быть использована для эмуляции реляционной операции DROP, например для удаления всего класса ENROLLMENT. Подробности оставляем читателю в качестве упражнения. 24.5. Дополнительные аспекты в этом разделе обсуждаются некоторые традиционные аспекты управления базами данных, но в объектном контексте. Произвольные запросы Целостность базы данных Реализация связей Языки профаммирования баз данных Повышение производительности Является ли объектная СУБД действительно СУБД Произвольные запросы До сих пор мы преднамеренно не подчеркивали, что если для манипулирования объектами заданы только заранее определенные методы, то произвольные запросы (не предусмотренные этими методами) просто невозможны, если только классы и методы не разработаны в соответствии со специальными правилами. Например, если для объекта класса DEPT определены только методы HIRE EMP (нанять сотрудника), FIRE EMP (уволить сотрудника) и CUT BUDGET (урезать бюджет), то даже такой простой запрос, как Кто является менеджером (начальником) отдела профаммирования , выполнить будет невозможно. По сушеству, по той же причине невозможно определить представления и декларативные Офаничения целостности для объектов, опять же, если не следовать некоторым конкретным правилам. По нашему мнению, решение этих проблем ( специальные правила ) может быть следуюшим. 1. Определить множество операторов ( операторов ТНЕ ), с помошью которых можно было бы получить некоторые возможные представления рассмафиваемых объектов, как в главе 5. 2. Надлежащим образом внедрить объекты в реляционную сфуктуру. Эта часть решения подробно обсуждается в следующей главе. Однако разработчики объектных систем обычно не придерживаются данных рекомендаций. Вместо этого они поступают следующим образом*. 1. Обычно определяются операторы, которые предоставляют не некоторые возможные представления, а реальные представления (см. обсуждение открытых переменных экземпляра в разделе 24.2). В настоящее время для всех продуктов объектных СУБД требуется, чтобы [переменные экземпляра], которые упоминаются в... запросах, были открытыми [24.38]. Здесь подразумевается, что рассматриваемая объектная система действительно поддерживает произвольные запросы, как и большинство современных объектных систем. Однако более ранние объектные системы иногда не поддерживали такие запросы, частично в силу причин, которые будут рассмотрены в этом разделе.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |