Новости

Классы, таблицы, глобалы – взаимосвязь понятий

Работа добавлена:






Классы, таблицы, глобалы – взаимосвязь понятий на http://mirrorref.ru

Работа №  . Классы, таблицы, глобалы – взаимосвязь понятий.

Теория.

Особенность системыCache в том, что она позволяет работать с данными одновременно в объектной, реляционной и иерархической моделях, не заботясь ни о каких отображениях (mappings).

ЕДИНАЯ АРХИТЕКТУРА ДАННЫХ CACHÉ

СУБД Caché это уникальная система, которая в рамках единой архитектуры поддерживаетТРИ модели данных.

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

Третья модель данных – это модель более низкого уровня абстракции (в документации Caché ее называют многомерной), по своей сути она является иерархической. В Caché она весьма эффективно реализована. Эта модель составляет основу для реализации как объектной, так и реляционной модели данных в СУБД Caché.

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

С математической точки зрения технико-экономический показатель - это число с индексами:

Aijklm

или просто многомерная матрица. «А» - это основание показателя, с основанием обычно связывают его название, а индексы  «i, j, k, l, …» - это идентификаторы объектов или субъектов производственно-хозяйственной деятельности, условий производства и т.д.

Например, существует показатель «Себестоимость изготовления изделия i в цехе j по технологии k в году l и месяце m». Когда многомерные матрицы изучаются в математике, то принимают, что индексы пробегают отрезки чисел натурального ряда. В практике производственной деятельности - это множества идентификаторов объектов (ШИФР ДЕТАЛИ) или субъектов производства (КОД ЦЕХА). Основание показателя – это измеряемая или рассчитываемая величина, выражаемая в рублях, тоннах, километрах и т.д. В такой матрице обычно очень много нулевых элементов, поэтому она часто представляется только значащими кортежами:

<i, j, k, l, m, Aijklm>

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

A(i, j, k, l, m) = Aijklm

Модель упорядочивает индексы показателя по старшинству: первым идет уровень индекса i, затем уровень индекса j,  и так далее. В своей операционной части она предусматривает только операции, имеющие дело с индексами.

«Схема» такой базы данных (глобал в терминологии Caché) выглядела бы следующим образом:

^A=строка переменной длины  (корень дерева)

^A(i)=строка переменной длины (первый уровень дерева)

^A(i, j)=строка переменной длины (второй уровень дерева)

^A(i, j, k)=строка переменной длины (третий уровень дерева)

^A(i, j, k, l)=строка переменной длины (четвертый уровень дерева)

^A(i, j, k, l, m)=строка переменной длины (пятый уровень дерева)

Вот эти явные признаки «иерархичности» допускают эффективную реализацию. Почему слово «схема» взято в кавычки? В отличие от классической иерархической модели данных структура дерева не декларируется.

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

Единственное место, где интерпретируются хранящиеся в дереве данные, - это программа на языке Caché ObjectScript, который  должен предоставить пользователю все необходимые функции для семантической интерпретации строк. Обращение к элементу «многомерной» базы данных в Caché ObjectScript – это просто обращение к глобальной переменной ^A и ничем не отличается от обращения к любой локальной переменной.

Суть единой архитектуры данных Caché определяется двумя концепциями.

Описание базы данных некоторой предметной области как объектной базы данных автоматически генерирует описание соответствующей реляционной базы в синтаксисе SQL-92.Наоборот, описание ее в синтаксисе SQL-92 автоматически генерирует ее объектное описание в синтаксисе CDL (Class Definition Language). —При этом возникают некоторые тонкие моменты, связанные с хранимыми процедурами, триггерами, методами, многозначными структурами, которые оговорены и требуют вмешательства специалиста. Однако огромная часть работы по конвертированию описаний выполняется автоматически. Напомним, что многомерная модель данных Caché не требует декларации хранимых данных и что она составляет ядро всей системы.

  • Данные хранятся в многомерных структурах ядра базы данных, ориентированного на обработку транзакций. Как экземпляры декларированных на CDL классов (объекты), так и строки соответствующих реляционных таблиц базируются на одних и тех же элементах ядра. Необходимые преобразования выполняют соответственно сервер Caché Objects и сервер Caché SQL.

В универсальной архитектуре Cache и объекты и таблицы отображаются в многомерные структуры, хранением которых заведует механизм многомерной памяти. Унифицированные структуры данных доступны и серверу объектов и SQL-серверу. Программное обеспечение промежуточного уровня может обращаться к одному из этих серверов. Шлюз SQL позволяет обмениваться данными с другими базами реляционного типа.

Универсальная архитектура Cache

Универсальная архитектура Cache

Middleware/Application

Промежуточное ПО/Приложение

SQL Database

База данных SQL

Objects

Объекты

Unified Data Arhitecture

Унифицированная архитектура данных

Multidimensional Storage Engine

Средство многомерного хранения

SQL-доступ в Cache допускает использование интерфейсов ODBC, JDBC и ADO.Net. Поддерживается связывание данных с объектно-ориентированными языками, включая Java, C# и C++.

Система классов

Класс задаёт шаблон, по которому создаются объекты определённого им типа. Объект — это экземпляр класса. Метод представляет собой функции или процедуры класса или объекта, определяющие его поведение.Свойства класса считаются определяющими состояния класса, но они не используются для идентификации объектов, как в реляционной модели.

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

Однако, пользовательские типы открыты.

Обычно классы выстраиваются в иерархию наследования.

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

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

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

Незарегистрированные классы (Non-Registered Class) предназначены для создания пользовательской объектной системы и не имеют предопределенного поведения.Объектные ссылки для них не формируются. Разработка функций незарегистрированного класса —обязанность разработчика.

Объекты зарегистрированных классов и их наследники имеют объектную ссылку OREF (object reference), идентифицирующую объект, находящийся в памяти компьютера.

Хранимые объекты имеют вторую ссылку OID (object ID), идентифицирующую объект на физическом носителе.

Зарегистрированные классы это временные классы, обладающие предопределенным поведением. Реализуется оно набором встроенных функций, наследуемых из системного класса %RegisteredObject и отвечающих, в частности, за создание новых объектов и за управление размещением объектов в памяти. Заметим, что знак процента в имени означает, что класс или метод системные.

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

Зарегистрированные классы могут быть ещё хранимыми и встраиваемыми. Первые хранятся независимо и потому имеют уникальную не изменяемую объектную ссылку OID, по которой объект может быть найден на диске, и ссылку OREF.

Встраиваемые классы могут попасть на диск только в составе хранимого класса и потому OID не имеют, но при выгрузке в память для них создаётся соответствующая ссылка OREF. Встраиваемые классы наследуют свое поведение от класса %Serial.

Хранимые классы наследуют свое поведение от класса %Persistent, используя обширный набор его методов, включающий создание объекта, подкачку объекта из базы в память, удаление объекта и т.д.Каждый экземпляр хранимого класса имеет два уникальных идентификатора — OID и OREF.

Практика.

Рабочие областиCache:

  • Студия
  • Терминал
  • Портал управления системой

Студия:

Терминал:

Показан запускSQL – оболочки:do $system.SQL.Shell()

Портал:

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

Каждому объекту некоторого класса соответствует строка таблицы и узел в дереве глобала.

Хранение данных. Глобалы.

Разреженные массивы и их представление деревьями.

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

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

Разреженные массивы, реализованные в Cache, отличаются следующими особенностями:

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

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

Создадим дерево в виде глобала из следующих узлов: ^a(1)="A", ^a(2)="B", ^a(1,1,1)="C". В узлеa(1)="A" единица — это индекс, "А" — значение узла a(1). Строго говоря, дерево получается, только если считать, что к заданным узлам добавлен корневой узел a="" (его значение пустое, но могло быть любое другое) и промежуточный узел a(1,1). Последний называется виртуальным узлом. Такие узлы имеют имя и индексы, но не имеют значения. Их предназначение — связать узлы, отличающиеся на два и более индексов, чтобы на каждом следующем уровне дерева добавлялся ровно один индекс. Виртуальные узлы будем изображать двумя концентрическими окружностями.

Команда для создания глобала:

S ^a="",^a(1)="A",^a(2)="B",^a(1,1,1)="C"

Созданный глобал можно посмотреть:

Кроме констант и простых переменных узел может принимать следующие значения:

  • строка с разделителями, например,

Команда для создания глобала:

K ^aS ^a(1)="a%b%c"W ^a(1) (Kill –удалить существующую переменную).

  • список, например,

Команда для создания глобала:

K ^a S ^a(1,1,1)=$LB("a","b")

Список создаётся специальной функцией$LISTBUILD(сокращенно $LB). Её формат:

LISTBUILD(элемент_списка [,элемент_списка])

  • значение узла другого массива.

Команда для создания глобала:

K ^b S ^b(1)="b1", ^b(2)="b2", ^b(1,1)="b11"

S ^a(1,1,1)=^b(1) W ^a(1,1,1)

В деревьях Cache навигация осуществляется на физическом уровне. Необходимо обеспечить движение в ширину (функция$ORDER) и движение в глубину (функция $QUERY).

При конструировании глобалов их узлы создаются и удаляются командамиSET и KILL.

Копирование поддеревьев обеспечивает команда MERGE.

Существуют функции, поставляющие дополнительную информацию, необходимую для обеспечения навигации:

  • какой тип имеет узел (функция $DATA), сколько индексов у переменной (функция $QLENGTH);
  • какое значение имеет указанный индекс (функция $QSUBSCRIPT);
  • каково значение узла (функция $GET)

Определение типа узла, уровня дерева, извлечение индекса и значения

Узлы можно характеризовать двумя признаками — наличием потомков и наличием значений.

Если у узла нет потомков, но есть значение, то это листовой узел (узлы a(2), a(1,1,1)). Если у узла есть потомки и значения, то это либо корень дерева, либо реальный промежуточный узел (узлы a, a(1)). Узел, имеющий потомков, но не имеющий значений — виртуальный (узел a(1,1)).

Тип узла определяет функция $DATA. Её значения приведены в таблице (0- отсутствие, 1-присутствие):

Значение функции $DATA

Потомки

Значение узла

Код

Значение $DATA

0

0

00

0

0

1

01

1

1

0

10

10

1

1

11

11

Cache не печатает ведущие (стоящие слева) нули. Поэтому возвращаются значения $DATA такие, как указано в последнем столбце таблицы.

В следующую таблице показаны варианты условий, проверяемых функцией $DATA.

Условия, проверяемые с помощью $DATA

Условие

Значение $DATA

Запись условий

Потомки имеются

10,11

$DATA(узел)\10

Значения имеются

1,11

$DATA(узел)#10

Узел не существует

0

$DATA(узел)=0

Узел виртуальный

10

$DATA(узел)=10

Узел существует

1,10,11

$DATA(узел)

Проверим узлы созданного глобала с древесной структурой с помощью функции $DATA.

Команда:

W $D(^a),?10,$D(^a(1)),?20,$D(^a(2)),?30,$D(^a(1,1,1)),?40,$D(^a(1,1))

(?10-табуляцияспозиции….)

Практическое задание:

Создадим простейший класс с единственным атрибутом Name. Запускаем Cache Studio. Выбираем в меню пункт Файл-Создать.

Создание класса

Затем выделяем иконку "Класс Cache" и нажимаем кнопку "OK". Появляется первый экран мастера создания класса.

Задание имени и комментария

Пакет, который предлагается указать, служит для объединения некоторой совокупности родственных классов. Пакеты %SYS, DOCBOOK, SAMPLES и USER создаются СУБД при инсталляции. Далее используетсяUSER (по умолчанию).

Кнопкой "Далее >" переходим к следующему шагу.

Выбор типа класса

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

Таблица. Выбор типа объекта

Persistent

Тип объектов хранимых в базе

Serial

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

Registered

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

Abstract

тип объектов у которых не может быть экземпляров

Data Type (тип данных)

указывает на то, что данный класс будет типом данных

CSP

класс типа CacheServerPage, предназначенный для построения серверных страниц Cache

Extends (расширяет)

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

Выбираем тип Persistent и кнопкой "Далее >" продолжаем создание класса.

Дополнительные характеристики класса (не задаем).

Пополним созданный класс свойством Name. Для этого выбираем в Студия пункт меню Класс > Добавить >  Свойство для запуска мастера.

Extends %Persistent – указывает наследование от системного класса.

Указываем имя свойства Name.

Задание имени свойства и его описания.

Задание типа свойства.

Задание типа свойства (свойство Name является строкой).

Выбираем тип создаваемого свойства.

В Cache поддерживаются несколько типов свойств:

  1. Единичное значения типа. Простые типы данных (%String, %Integer, %Date и т.д.) наследуют свое поведение от класса типов данных.
  2. Коллекция типа. Объектные базы, в отличие от реляционных, могут хранить множество значений в одном свойстве.В Cache поддерживаются два типа коллекций — массив и список.

Элементы массива имеют индекс, уникально характеризующий элемент в массиве.

Элемент списка определяется номером его позиции в списке.

  1. Отношение. Связи представляют собой двунаправленные зависимости между хранимыми объектами. В Cache реализовано два типа связей — Parent - Child (родитель - потомок) и One - Many (один-ко-многим). Первая связь зависимая, то есть при удалении предка, автоматически удаляются все наследники. Связь One-Many независимая связь, поэтому удаление предка при существовании наследников приводит к ошибке.

Характеристики свойства

Первый пункт аналогичен заданию свойства NOT NULL для полей SQL-таблиц, второй — создает индекс для определяемого свойства, третий — аналогичен ограничению UNIQUE , четвертый указывает на то, что данное свойство является вычислимым, то есть его значение вычисляется во время обращения к нему.

Ниже будет установлено, что при создании класса определяется соответствующая ему таблица. Её имя может отличаться от имени класса. Если необходимо, чтобы имена свойств и соответствующих им столбцов таблиц не совпадали, укажите имя SQL-столбца.

Характеристики свойства по умолчанию можно оставить без изменения.

"Далее >". Появится список параметров созданного свойства.

Параметры свойства.

Изменим в нём значение параметра MAXLEN "20".

На последнем шаге мастер предлагает переопределить методы доступа к свойствам Get и Set.  (Не переопределяем) .

Теперь в окне Studio мы получим следующий текст

Class User.A Extends %Persistent {

Property Name As %String(MAXLEN = 20); }

Чтобы класс стал доступным для использования, его нужно откомпилировать (позиция меню "Собрать > Компилировать").

После компиляции.

Был создан персистентный класс, наследующий системному классу%Persistent. От родителя все такие классы получают следующие методы внешнего интерфейса:

  1. %New(). Конструктор объекта. Его задача — создать экземпляр класса и присвоить ему OREF.
  2. %Save() . Сохраняет экземпляр класса на диске и присваивает ему OID.
  3. %Close(). В старых версиях уменьшал значение счетчика OREF на единицу и уничтожал версию объекта в памяти. Начиная с версии 5.0, этот метод ничего не делает.

%Open(). Метод класса. В качестве первого аргумента получает OID (OID представляет собой список, состоящий из ID объекта и имени класса) объекта (или ID), заключенный в оператор построения списка LB().  —LISTBUILD(элемент_списка [,элемент_списка]) Если он находит объект, существующий в базе данных, то создает в памяти его копию, содержащую значения всех свойств, и возвращает объект. Если объект уже загружен в память, просто возвращается OREF.

  1. %OpenId(). Отличается от предыдущего тем, что в качестве аргумента получает не OID, а ID.
  2. %Delete().Удаляет версию объекта, хранящуюся на диске, копия в памяти при этом остается. В качестве единственного параметра получает OID, этот идентификатор больше не используется впоследствии (это касается классов с внутренней системой хранения Cache, в противном случае ответственность за повторное использование OID-ов полностью ложится на плечи разработчика).
  3. %DeleteId(). Отличается от предыдущего тем, что в качестве аргумента получает не OID, а ID.
  4. %IsModified(). Возвращает "истинно" (1), если значения свойств объекта были изменены, в противном случае — 0.

Выясним, как создаются экземпляры класса (объекты) и где они хранятся.

Запустим портал управления системой, выбрав пункт " Утилиты > Портал управления системой" в главном меню Studio.

В управлении данными (Обозреватель системы) выбираем раздел Глобалы.

Раздел "Глобалы" (область имен User).Глобалов нет.

Запускаем терминал. В нём создаем экземпляр класса с помощью метода-конструктора %New():

User >s ss=##class(User.A).%New()

Макроподстановка ##class создает объектную ссылку OREF. Что же представляет собой эта ссылка?

USER>w ss

1@User.A

OREF состоит из двух частей: имени класса "User.A" и идентификатора объекта "1".

Можно убедиться, что глобал ^User.AD ещё не появился.

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

Используемые команды:

USER>s ss.Name="Иван"  // параметру Name объекта №1 присвоено значение.

USER>d ss.%Save()  // объект №1 сохранен на диске.

USER>d ss.%Close()  // объект №1 закрыт, то есть удален из оперативной памяти.

С помощью портала управления системой обнаруживается созданный глобал User.AD 

Нажав на Просмотр, можно получить подробную информацию о глобале:

Обратите внимание, что после закрытия объекта значение переменной хранящей OREF не меняется(команда W ss).

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

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

Просмотреть OID объекта можно с помощью метода %Oid()(Wss.%Oid()):

Результат: ˪User.A

В действительности OID представляет собой список, состоящий из ID объекта и имени класса.

1

User.A

Можем в этом убедиться, выполнив в терминале следующую команду:

USER>f i=1:1:$ll(ss.%Oid())  {w !,$li(ss.%Oid(),i)}

$LISTLENGTH ($ll) returns the number of elements in list.

$LIST(list,position) ($li)returns the element indicated by the specified position. The position parameter must evaluate to an integer.

Следует отметить, что при использовании индексов может быть создан ещё глобал индекса с именем ^User.AI.

Какие существуют связи, сходства и различия между классом и таблицами и хранятся ли таблицы в Cache?

Был  создан класс А и один объект этого класса.

Откроем раздел SQL портала управления системой.

Обнаруживается таблица с именемSQLUser.A и именем классаUser.A.

Можно посмотреть сведения о таблице, поля и открыть ее.

Идентификаторы объектов: Сохраненные ID и OID

Когда объект сохраняется впервые, Caché создает два постоянных идентификатора, любой из которых  можно использовать для доступа к или удаления сохраненных объектов.

Обычно используется идентификатор ID. Идентификатор представляет собой простой значение, которое является уникальным в таблице. По умолчанию, Caché генерирует целое число, чтобы использовать в качестве идентификатора.

Идентификатор OID является более общим: он также включает в себя имя класса и является уникальным в базе данных. Практически никогда не нужно использовать значение OID;идентификатора ID обычно достаточно.

Левая колонка с именем "#" — это номер строки результата (Уникальная объектная ссылка OREF, обеспечивающая доступ к объекту в оперативной памяти), а колонка "ID" — это идентификатор объекта (строки таблицы). ID — это суррогатный ключ, созданный автоматически (см. выше). (Уникальная не изменяемая объектная ссылка OID, по которой объект может быть найден на диске).

Обратите внимание на то, что Cache автоматически создала столбцы ID иx_classname,значения которых приведены в открытой таблице.

Уникальная объектная ссылка OREF, обеспечивающая доступ к объекту в оперативной памяти.

Уникальная не изменяемая объектная ссылка OID, по которой объект может быть найден на диске,

Приведенный запрос выдает только столбцыID  иName.

Выполним запрос в терминале. Для ввода запроса в терминале наберите в терминале командуdo $system.SQL.Shell().

Добавим в таблицу SQLUser.A еще два объекта с помощью инструкции INSERT:

В открытой таблице видны введенные значения.

Удалим вторую строку.

Таблица после удаления строки.

Левая колонка с именем "#" — это номер строки результата, а колонка "ID" — это идентификатор объекта (строки таблицы). ID — это суррогатный ключ, созданный автоматически (см. выше). Номер строки поменялся (Уникальная объектная ссылка OREF, обеспечивающая доступ к объекту в оперативной памяти), а идентификатор остался неизменным (Уникальная не изменяемая объектная ссылка OID, по которой объект может быть найден на диске).

Новая вставка увеличивает значение ID на 1.

Глобал:

Результат: создание класса вызывает появление таблицы.

Проверим глобалSQLUser.A  рассмотренными выше функциями для работы с деревьями.Проверим созданный глобал с  помощью функции $DATA, которая использовалась для работы сдревесной структурой.

Результаты проверки:

Видно, что для ^User.AD функция$DATA ($D) выдает значение 11, что соответствует наличию значения и потомков. Для^User.AD(2) (удаленная строка)выдается значение 0, что соответствует отсутствию узла. Для^User.AD(1) выдается значение 1, что соответствует наличию значений и отсутствию потомков.

Таким образом, древовидная структура является общим случаем хранения классов и таблиц.

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

В SQL-менеджере создадим таблицу:

USER>do $system.SQL.Shell()

SQL Command Line Shell

----------------------------------------------------

The command prefix is currently set to: <<nothing>>.

Enter q to quit, ? for help.

USER>>CREATE TABLE T   (c1 NUMBER(2),   c2 CHAR(3))

1.      CREATE TABLE T   (c1 NUMBER(2),   c2 CHAR(3))

0 Rows Affected

statement prepare time: 0.4139s, elapsed execute time: 1.3682s.

В портале появится класс User.T (нажмите на кнопку Обновить для обновления содержимого страницы браузера).

Нажав на ссылку Документация рядом с именем класса, можем посмотреть его содержимое.

Чтобы увидеть описание класса, необходимо в студии в навигаторе зайти в папку Классы/User

и щёлкнуть два раза левой кнопкой мыши по имени класса T. Появится описание этого класса на языке CDL (Class Define Language):

/// Class User.T Extends %Persistent [ ClassType = persistent, DdlAllowed, Owner = _SYSTEM, ProcedureBlock, SqlRowIdPrivate, SqlTableName = T, StorageStrategy = Default ]

}

Обратите внимание, что для созданных свойств SqlColumnNumber равно 2 и 3 соответственно. Происходит это потому, что столбцу ID всегда назначается номер 1.

В первой строке записано имя класса User.T, потомка класса %Persistent, а свойства (Property) c1 и c2 соответствуют именам столбцов c1 и c2. В определении столбцов числовое свойство задается минимальным и максимальным значениями (—99 и 99), а для строчных данных указывается максимальное число символов (MAXLEN=3).

Интересная особенность!!!!!!!!! Можно создать класс без единого атрибута (NoAttribut). Выполнить компиляцию класса. В реляционной ипостаси в него можно внести сколь угодно много строк (INSERT INTO имя VALUES(NULL)). Такое возможно благодаря тому, что СУБД сама создаёт столбцы ID и #.

INSERT INTONoAttribut VALUES(NULL)

Сведения о таблице в Портале управления системой.

Показано, что СУБД сама создаёт столбцы ID.

Подведем итог: создание класса вызывает появление таблицы, а таблица генерирует класс.

В студии посмотрим, что у нас хранится ("Файл >Открыть") на самом деле. Обнаруживаются файлы с расширением .cls, хранящие исходные тексты классов.

Описаний таблиц (скриптов CREATE TABLE ...) не существует.  Таблиц в Cache действительно не существует, есть возможность смотреть на классы как на таблицы.

Вставляем строку, а создаем или пополняем дерево.

ВSQL-менеджере (do $system.SQL.Shell()) введём в таблицу T одну строку:

INSERT INTO T VALUES  (22, 'QQ')

С помощью команды SELECT * FROM T убеждаемся, что строка действительно записана (запрос не выдаетID и OREF):

 Сведения о таблице в окне портала:

Открытая таблица:

Переходим в раздел "Глобалы" и обнаруживаем глобал User.TD.

Рассмотрим этот глобал (щелчок дважды левой кнопкой мыши по строчке User.TD) и получаем его структуру:

^UserTD=1

^User.TD(1)=$lb.("",22,"QQ")

В узле глобала ^User.TD(1) находится построенный список из пустого элемента и введённых нами значений $LB("","22","QQ"), соответствующий строке таблицы SQLUser.T. Корню дерева ^User.TD присвоено значение 1.

Если добавить ещё одну строку, например (1, 'A'), выполнив команду INSERT INTO T VALUES   (1, 'A')

Обратите внимание, что корню дерева ^User.TD присвоено значение 2 (увеличилось на 1).

Строки, вставляемые в таблицу, сохраняются в том же глобале и в той же структуре, что и объекты соответствующего класса. Значит, объекту (экземпляру класса) соответствует строка таблицы.

Глобалы рассматриваемого вида можно изменять в языке ObjectScript, используя функции для работы со списками. Попробуем изменить таблицу не командой SQL вида

UPDATE T SET c1=11 WHERE c1=1

а исполнив в терминале команду

s ^User.TD(2)=$LB("","11","A")

Просмотр значений:

Добавить с терминала еще одну строку:

s ^User.TD(3)=$LB("","7","Z")

Результат:

Вставим ещё одну строку командой INSERT в SQL-менеджере.

Новая строка замещает старую третью строку (7,'Z'). Произошло это потому, что корень дерева ^User.TD хранит число строк в таблице, а  это значение не было изменено (^User.TD=3).

Теперь вставим строку правильно:

USER>s ^User.TD=4

USER>s ^User.TD(4)=$LB("","9","99")

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

Обратимся к словарю. В Cache все классы словаря хранятся в пакете %Dictionary. Чтобы его просмотреть, в портале выберем "System Explorer > Классы" перейдем в область USER. После нажатия на ссылку Документация около имени любого класса, появится страница описания класса.

Не все атрибуты класса отображаются в столбцы таблицы. Для свойств класса можно установить значение видимости Private. Такое свойство не будет передаваться в таблицу.

Создадим класс Z, у которого второе свойство имеет значение видимости Private:

Class User.NewClass1 Extends %Persistent {

Property P1 As %String;

Property P2 As %String [ Private ];

}

Запрос SELECT * FROM NewClass1  показывает, что столбца P2 в таблице нет. Закрытые атрибуты класса не отображаются в столбцы таблицы.

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

Удалим таблицу Т (Drop Table T)

Соответствующий глобал удаляется.

Итог.

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

Каждому объекту некоторого класса соответствует строка таблицы и узел в дереве глобала.

Задание для самостоятельного выполнения:

  1. Выполнить приведенную последовательность действий самостоятельно.
  2. Создать отчет о выполнении.
  3. Уметь отвечать на вопросы по пунктам задания.

Классы, таблицы, глобалы – взаимосвязь понятий на http://mirrorref.ru


Похожие рефераты, которые будут Вам интерестны.

1. Изучение понятий власть и влияние, а также рассмотрение этих понятий в конкретной организации

2. Распределения IP-адресного пространства. Движение пакетов. ARP- таблицы. Таблицы маршрутизации

3. Таблицы подстановки (таблицы данных)

4. Классы и объекты

5. Классы современных ЭВМ

6. Классы неорганических веществ

7. Классы и марки бетона

8. Основные классы неорганических соединений

9. Классы точности средств измерений

10. ОС: определение, функции. Классы ОС. Основные компоненты ОС