Болотская Методическое пособие по выполнению лабораторных 2010
.pdfФайлы создаются с помощью оператора (глагола) createfile. Например,
create-file Team 1 1
при этом одновременно создается словарь файла и область данных файла.
Из рис. 3.2 видно, что эти два файла связаны двумя мостами (bridge) от файла «Play» к файлу «Team». Мосты – специальные триггеры, которые срабатывают при сохранении записи об очередной игре в файле «Play» и заносят ссылку на эту игру в записи файла «Team», представляющие каждую из команд, принимавших участие в игре. Ссылка, заносимая в записи файла «Team», – идентификатор записи об игре в файле «Play». Мосты кодируются в записях описания файлов (File Defining Item – FDI), в данном случае в записи описания файла «Play».
Работа с записями описания файлов. На рис. 3.3 и 3.4 показа-
ны фрагменты записи описания файлов «Play» и «Team». Для работы с записями словарей нужно использовать макрос ud (update dictionary). Например, чтобы просмотреть и/или изменить запись описания файла «Play» (см. рис. 3.3), нужно выполнить команду:
:ud Play ‘Play’
Часть атрибутов этой записи формируется при создании файла, из-
менению подлежат атрибуты correlative, macro, outputmacro.
Особое внимание надо уделить атрибуту correlative, в котором описывается способ формирования ключей записей области данных файла, а также триггеры, связанные с файлом. Напомним, что СУБД D3 поддерживает многозначную модель данных. Это значит, что любой атрибут априорно считается многозначным, если не указано противное. Это полностью относится и к атрибуту cor-
relative.
31
dictionary-code |
D |
base |
13683 |
modulo |
1 |
structure |
|
retrieval-lock |
|
update-lock |
|
output-conversion |
ida1 |
correlative |
|
|
bTeam;2;3 |
attribute-type |
bTeam;3;4 |
L |
|
column-width |
10 |
input-conversion |
ID_Play t1 t2 z1 z2 |
macro |
|
output-macro |
|
|
|
Рис. 3.3. Запись описания файла «Play» |
|
|
|
dictionary-code |
D |
base |
13687 |
modulo |
1 |
structure |
|
retrieval-lock |
|
update-lock |
|
output-conversion |
id5 |
correlative |
|
attribute-type |
I13689a1 |
L |
|
column-width |
10 |
input-conversion |
TeamName PlayD GdD SochD PlayG GdG |
macro |
|
|
SochG PlayW GdW SochW *-70 plD chD ochD |
output-macro |
*-70 plG chG ochG *-70 |
TeamName plD GdDL SochL plG GDGL |
|
|
SochGL PlayW GdWL SochWL CountPlays |
|
countplaysH |
Рис. 3.4. Запись описания файла «Team»
Из рис. 3.3 видно, что первым значением атрибута correlative является «ida1». Это комбинация кода обработки «id» и кода обработки «a». Код обработки «id» генерирует ключ записи области данных файла, а код обработки «a» указывает способ генерации – ключ формируется алгебраическим выражением, сле-
32
дующим за кодом «a». В данном случае за кодом «a» следует «1», т.е. в качестве ключа принимается значение первого поля записи. Это значит, что первое поле должно содержать единственное значение, которое при сохранении записи принудительно копируется в нулевое поле.
Вторым значением атрибута correlative в записи описания файла «Play» (см. рис. 3.3) является «bTeam;2;3». Раскроем смысл этого выражения. Код «b» говорит, что указанное выражение представляет мост (bridge) из файла «Play» в файл, имя которого непосредственно следует за «b», т.е. файл «Team». Цифра «2» представляет номер поля в записи файла «Play», в котором находится ключ записи файла «Team», в данном случае – идентификатор команды «хозяина» игры, т.е. команды, на поле которой проходила игра. Цифра «3» представляет номер поля в записи файла «Team», в которое будет помещен ключ записи файла «Play» в результате срабатывания триггера (моста). Поле 3 записи файла «Team» – многозначное, в нем находятся идентификаторы всех игр, которые команда провела «дома».
Третье значение атрибута correlative в записи описания файла «Play» (см. рис.3.3) также представляет мост «bTeam;3;4». В данном случае цифра «3» представляет номер поля в записи файла «Play», в котором находится ключ записи файла «Team», – идентификатор команды «гостя», т.е. команды, играющей на поле хозяина. Цифра «4» представляет номер поля в записи файла «Team», в которое будет помещен ключ записи файла «Play», в результате срабатывания триггера (моста). Поле 4 записи файла «Team» – также многозначное, в нем находятся идентификаторы всех игр, которые команда провела «в гостях».
Обратите внимание на атрибут correlative в записи описания файла «Team» (см. рис. 3.4).
Первое значение этого атрибута – id5 – говорит о том, что записи в области данных файла «Team» имеют ключи (идентификаторы команд), которые генерируются автоматически путем прибавления 1 к последнему сгенерированному ключу. В данном случае (см. рис. 3.4) последний сгенерированный ключ есть 5, поэтому при вводе следующей записи с описанием команды ее ключом будет 6.
33
Второе значение этого атрибута – I13689a1 – генерируется СУБД D3 автоматически при определении индекса. В данном случае это значение говорит о том, что на первом поле определен индекс.
Помимо атрибута correlative в записях описания файлов желательно заполнить атрибут macro и output-macro. Их можно не заполнять, например в записи описания файла «Play» (см. рис. 3.3) атрибут output-macro не заполнен.
В этих атрибутах через пробел перечисляются атрибуты разрабатываемого файла, которые процессорами D3 используются по умолчанию. Атрибут macro используется UPDATE-процессором. Например, команда D3:
:u Play ‘121’
эквивалентна команде
:u Play ‘121’ ID_Play t1 t2 z1 z2
Следует иметь ввиду, что приоритет отдается программной строке, т.е. команда:
:u Play ‘121’ ID_Play t1 t2
будет обрабатывать только три, явно заданные в строке атрибуты. Атрибут output-macro используется ACCESS-процессором, применяемым для генерации отчетов. Если же он – пустой (см. рис. 3.3), ACCESS-процессор будет использовать атрибуты из
macro:
:list Play
эквивалентна команде
:list Play ID_Play t1 t2 z1 z2
Работа с записями описания атрибутов. На рис. 3.5а и 3.5б
показаны фрагменты записи описания атрибутов файла «Team». Напомним, что записи описания атрибутов находятся (сохраняются) в словарях файлов (в данном случае «DICT Team»). Для рабо-
34
ты с записями словарей нужно использовать макрос ud (update dictionary). Например,
:ud Team ‘TeamName’
DICT Team ‘TeamName’size = 53
dictionary-code |
a |
attribute-count |
2 |
substitute-header |
Команда: |
structure |
|
output-conversion |
|
correlative |
l |
attribute-type |
|
column-width |
10 |
Рис. 3.5а. Фрагмент записи описания «хранимого» атрибута
Чтобы работать с записью описания вычисляемого атрибута с именем «Gdd» («Мячи дома»), нужно выполнить команду:
:ud Team ‘Gdd’
DICT Team ‘Gdd’ size = 93 dictionary-code a attribute-count 2 substitute-header Мячи дома structure d;1 output-conversion correlative
a;s(3(tPlay;x;;4)):":":s(3(tPlay;x;;5)) attribute-type r
column-width 2 input-conversion x
Рис. 3.5б. Фрагмент записи описания «вычисляемого» атрибута
Отметим, что имена атрибутов «TeamName» и «Gdd» есть ключи записи описания атрибута в файле «DICT team», при этом ка-
35
вычки при обращении к описанию атрибута можно опускать, т.е. запись команды:
:ud Team Gdd
также будет правильная.
В запись описания атрибута данные вводятся только разработчиком. Рассмотрим их последовательно.
Атрибут «dictionary-code» определен на поле 1 записи описания атрибута и должен иметь значение «a» – код, указывающий, что это запись описания атрибута (для области данных файла).
Замечание. В словаре файла определяем атрибуты для области данных файла. Атрибуты для словаря файла, в частности «dictionary-code», определяются в словаре более высокого уровня, а именно главном словаре базы данных (счета) – «master dictionary», для которого предназначен файл «md» (см. рис. 3.6). Попробуйте выполнить команду:
:ud md ‘dictionary-code’
md
Dict team
Data team
Рис. 3.6. Иерархия описания атрибутов
Атрибут «attribute-count» определен на поле 2 записи описания атрибута и вводит номер поля в записи области данных,
36
для которого определяется этот атрибут. В данном случае (см. рис. 3.5а, 3.5б) это поле 2.
Атрибут «substitute-header» определен на поле 3 записи описания атрибута и вводит заголовок, под которым атрибут выводится в отчетах. В данном случае (см. рис. 3.5а, 3.5б) это «Мячи дома».
Атрибут «structure» определен на поле 4 записи описания атрибута и вводит код, который определяет зависимость атрибутов записи области данных. В данном случае это «d;1», который определяет, что этот атрибут зависит от атрибута, определенного на поле 1, у которого в «structure» стоит код «c;2». Если эти атрибуты многозначны, то, используя эти атрибуты при обработке данных, мы фактически имеем дело с таблицей, включенной в запись области данных.
Атрибут «output-conversion» определен на поле 7 записи описания атрибута и вводит код преобразования значения поля, который срабатывает непосредственно перед выводом на экран или печать. В данном случае (см. рис. 3.5а, 3.5б) в этом атрибуте значение не определено.
Атрибут «correlative» определен на поле 8 записи описания атрибута и вводит код преобразования значения поля, который срабатывает непосредственно перед использованием атрибута в любом преобразовании. В данном случае (см. рис. 3.5б) в этом атрибуте стоит алгебраическое преобразование:
a;s(3(tPlay;x;;4)):":":s(3(tPlay;x;;5))
Это преобразование достаточно сложно и его целесообразно объяснять, когда будут понятны его составляющие.
Атрибут «attribute-type» определен на поле 9 записи описания атрибута и вводит тип атрибута. Интересны два значения:
«r» – строка сдвинута вправо (если она состоит из цифр, то интерпретируется как число);
«l» – строка сдвинута влево.
Проверьте использование этих типов на сортировке записей по атрибуту, содержащему цифры.
37
Атрибут «column-width» определен на поле 10 записи описания атрибута и вводит ширину столбца при выводе в табличном формате.
Атрибут «input-conversion» определен на поле 14 записи описания атрибута и вводит код входного преобразования. В данном случае (см. рис. 3.5б) это «х». Такой код означает, что атрибут вычисляется, а не соответствует значению, хранимому в поле 2 записи области данных.
Компоненты записи описания атрибута, не представленные на рис. 3.5а и 3.5б, для выполнения лабораторных работ не очень нужны, а при необходимости их значения можно узнать в документации.
3.2.Лабораторная работа 2. Использование кодов обработки в многозначных базах данных
Из краткого описания предметной области и соответствующих файлов видно, что большинство атрибутов файла «Team» являются вычисляемыми. Для определения вычисляемых атрибутов используются коды обработки, они позволяют построить системы средней сложности, практически не прибегая к программированию.
Коды обработки полностью описаны в электронном учебном пособии (база «lectur» в D3), а также доступны «on-line» при определении атрибутов. Однако целесообразно разобрать хотя бы несколько примеров.
Чтобы быть более конкретными, давайте разберем выражение, определяющее значение атрибута «Gdd» – «Мячи дома»:
a;s(3(tPlay;x;;4)):":":s(3(tPlay;x;;5))
Это – алгебраическое выражение, на что указывает код «a;». Алгебраической операцией в данном случае является операция конкатенации строк – «:». Заметим, что ":" в этом выражении это тоже строка.
Первая часть этого выражения s(3(tPlay;x;;4)) говорит о том, что суммируются значения многозначного поля 3, предварительно преобразованные.
38
О суммировании говорит код «s», который применяется к выражению 3(tPlay;x;;4). Напомним, что в поле 3 записи файла «Team» хранятся идентификаторы игр, проведенных командой на своем поле. Складывать идентификаторы игр просто нелепо, их надо преобразовать.
Код tPlay;x;;4 называется «трансляцией через файл» и применяется он к каждому значению многозначного поля 3 записи файла «Team» (игр на своем поле может быть много). В терминологии реляционной модели происходит эквисоединение файлов «Team» и «Play» с проекцией на поле 4 файла «Play». Напомним, что в этом поле файла «Play» хранится количество мячей забитых «хозяином».
Оставшаяся часть выражения объясняется аналогично. Результат всех преобразований, выполненных этим алгебраиче-
ским выражением – скалярная строка, например «16:10». Этот результат говорит, что команда, играя на своем поле, забила во всех играх 16 мячей, а пропустила – 10.
Разумеется, использование кодов обработки также требует творческого подхода, как и программирование. Попробуйте сами построить выражение, используя только что рассмотренные коды обработки, определяющее количество игр дома. Ответ можно увидеть по адресу4.
Возникает вопрос: «Почему атрибут «Gdd» (см. рис. 3.5б) определен на поле 2 записи файла «Team», хотя для его определения значение поля 2 не используется?» Напомним, что в поле 2 хранится название футбольной команды.
Самая главная причина – этот атрибут по семантике однозначен, поэтому он должен быть обязательно определен на однозначном поле. Очень часто для этого используется поле 0, которое всегда однозначное. Вторая причина – удобство построения ассоциаций. Так как система «Футбольный чемпионат» доступна (она входит в базу «К9», предоставляемую студентам), попробуйте определить атрибут «Gdd» на поле 3 файла «Team», которое многозначно. Получите многозначный результат, проверьте какой.
4 correlative |
a;s(3=3). |
|
39 |
Как уже говорилось, коды обработки доступны «on-line» при определении атрибутов. При определении атрибута (см. рис. 3.5а и 3.5б), когда курсор стоит на определенной строке, нажав F1 или CtrlX,1, получим список кодов, которые могут быть использованы при формировании этой строки. Пусть, например, курсор стоит на строке «output-conversion». Нажав F1, получим экран со списком кодов, представленный на рис. 3.7.
Всю информацию, связанную с использованием конкретного кода, можно получить, встав курсором на соответствующую строку и нажав F1.
a Алгебраические преобразования в обычной записи c Конкатенация
call Конверсия с помощью подпрограммы пользователя d Конверсия дат
fАлгебраические преобразования в обратной польской записи
gВыделение групп
if Конверсия с использованием условий
lДлина строки либо вывод строки заданной длины
mКонверсия цифровых величин и строк с помощью маски
mc Семейство специальных конверсий буквенно-цифровых строк
mp Десятичная упаковка
ms Изменение последовательности сортировки mt Конверсия времени
mx Конверсия ASCII ───> HEX my Конверсия HEX ───> ASCII
oСортировка значений многозначного атрибута
pСовпадение с шаблоном
rЧисловой Интервал
sПодстановка
text.extract Выделение подстроки translate Трансляция через файл
Рис. 3.7. Коды обработки, используемые в атрибутах
«output-conversion» и «correlative»
40