Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информационное обеспечение(лекции)

.pdf
Скачиваний:
77
Добавлен:
27.03.2016
Размер:
2.19 Mб
Скачать

Пусть R={R1, ..., Rp} – множество реляционных схем над U. Отношение r(U) удовлетворяет зависимости соединения (J-зависимости) *[R1, R2,..., Rp ], если r разлагается без потерь на R1, R2, ..., Rp.

Пример 2.19. Отношение r на рисунке 2.26 удовлетворяет J-зависимости

*[АВ, АС, ВС].

Необходимым условием выполнения в отношении r(U) J-зависимости *[R1, R2, ..., Rp] является равенство R1R2...Rр. Из определения также видно, что MV-зависимость является частным случаем J-зависимости. Отношение r(R) удовлетворяет MV-зависимости X Y тогда и только тогда, когда r разлагается без потерь на XY и XZ, где Z=R-(XY). Условие совпадает с J- зависимостью *[XY, XZ]. С другой стороны, зависимость соединения *[R1, R2] имеет тот же смысл, что MV-зависимость R1 Ç R2 R1.

Для J-зависимости можно привести определение, аналогичное определению MV-зависимости.

Пусть r удовлетворяет зависимости *[R1,R2, ..., Rp]. Если r содержит кортежи t1, t2, ..., t , такие, что для всех i, j

ti(Ri Ç Rj)=Ti(Ri Ç Rj),

то r содержит кортеж t, такой, что t(Ri) = ti(Ri),1<i<p. 2.4.3.13 Пятая нормальная форма

Целью поиска декомпозиций без потери информации является устранение избыточности из отношений. В терминах поиска декомпозиций без потерь 4НФ не является наилучшим решением.

J-зависимость *[R1, R2,..., Rp] над R называется тривиальной, если она удовлетворяется в любом отношении r(R).

J-зависимость соединения *[R1, R2, ..., Rp] приложима к реляционной схеме, если R=R1R2...R.

Пусть R – схема отношения и F – множество F- и J-зависимостей над R. Схема R находится в пятой нормальной форме (5НФ) относительно F, если для каждой J-зависимости *[R1, R2, ..., R], выводимой из F и приложимой к R, J-зависимость тривиальна или каждое Ri является

сверхключом R.

Схема базы данных R находится в пятой нормальной форме относительно F, если в этой форме находится каждая схема R из R.

Приведем еще одно определение 5НФ.

Пусть R - схема отношения и F – множество F- и J-зависимостей.

R находится в пятой нормальной форме (5НФ) относительно F, если для каждой J-зависимости *[R1, R2, ..., Rp], выводимой из F и приложимой к R, зависимость *[R1, R2, …, R p ] выводима из ключевых F-зависимостей в R.

2.4.3.14 Обобщение этапов нормализации Упрощенная обобщенная схема этапов нормализации отношений с

привязкой к известным нормальным формам, выполняемая на этапе логического проектирования базы данных, представлена на рисунке 2.28.

101

Рис. 2.28 - Обобщённая схема процесса нормализации

102

3ФИЗИЧЕСКАЯ ОРГАНИЗАЦИЯ ДАННЫХ В СУБД

3.1Списковые структуры

Всистемах обработки данных в качестве данных выступают описания (представления) фактов и понятий рассматриваемой предметной области на точном и формализованном входном языке системы - языке описания данных .

Спомощью входного языка при описании фактов и понятий ПО между элементами данных конструируются логические структурные отношения.

Вкачестве логических структур (смотри пункт 2) используют либо таблицы, представляющие собой двумерный или n-мерный массив данных, либо древовидные иерархически структуры, либо сетевые структуры, представляющие собой сложную многосвязную структуру с большим количеством взаимных соединений и т.п.

Чтобы правильно использовать вычислительную машину, необходимо хорошо представлять себе структурные отношения между данными, знать способы представления таких структур в памяти машины и методы работы с ними. Структура данных и представление этой структуры в памяти ЭВМ – два важных, но различных между собой понятия. Так, например, некоторая логическая структура данных типа «дерево» может быть представлена в памяти ЭВМ несколькими различными способами.

Таким образом, любое представление структуры данных в памяти ЭВМ должно включать в себя как сами данные, так и задаваемые взаимосвязи, которые и определяют логическое структурирование.

Форма представления структур данных в памяти ЭВМ зависит от предполагаемого использования данных, поскольку для различных типов структур эффективность выполнения тех или иных операций обработки данных различна. Основное различие форм представления структур данных в памяти ЭВМ определяются в первую очередь тем, как адресуются элементы структуры данных в памяти машины – по месту или по содержимому. В первом случае указываются логические или физические адреса данных, определяющие местоположение данных в памяти машины. Во втором случае размещение данных и их выборка осуществляются по известному значению ключа, т.е. определяются содержимым самих данных.

Наиболее простой формой хранения данных в памяти ЭВМ является одномерный линейный список.

Линейный список – это множество n>0 объектов (узлов) Х[1], Х[2], ..., Х[п], структурные свойства которого связаны только с линейным (одномерным) относительным расположением узлов. Если п>0, то Х[1] является первым узлом; для 1<i<n узел Х[i-1] предшествует узлу X[i], а узел X[i+l] следует за ним, Х[п] является последним узлом, т.е. линейный список реализует структуру, которую можно определить как линейное упорядочение элементов данных.

Линейный список X рассматривают как последовательность Х[1], Х[2], ..., Х[i], ..., Х[п], компоненты которой идентифицированы порядковым номером, указывающим их относительное расположение в X.

103

Одномерный линейный список, используемый для хранения данных в памяти машины, называют еще вектором данных или физической структурой хранения данных. Использование линейного списка в качестве физической структуры хранения данных определяется свойствами памяти вычислительной машины. Так, оперативная память ЭВМ представляет вектор, в котором байты упорядочены по возрастанию их адресов от 0 до наивысшего, т.е. проидентифицированы адресом.

Проблема представления логических структур данных в памяти ЭВМ заключается в нахождении эффективных методов отображения

логической структуры данных на физическую структуру хранения. Такое отображение называют адресной функцией.

При реализации адресной функции используют два основных метода:

последовательное распределение памяти;

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

3.1.1 Последовательное распределение памяти

Последовательное распределение – простой и естественный способ хранения линейного списка. В этом случае узлы списка размещаются в последовательных элементах памяти (рисунок 3.1).

Рисунок 3.1 - Пример последовательного распределения памяти для представления линейного списка

При последовательном распределении вектор данных логически отделен от описания структуры хранимых данных. Например, если структура данных представляет собой линейный список (файл записей фиксированной длины), то описание структуры хранится в отдельной записи и содержит:

а) N – размер вектора данных, т.е. количество элементов списка записей; б) т – размер элемента списка, т.е. размер записи, например, в байтах; в) ß – адрес базы, указывающий на начало вектора данных в памяти.

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

104

α(i) = β + (i − 1)m .

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

Вкачестве примера рассмотрим реализацию с помощью линейного списка при последовательном распределении памяти для логической структуры типа регулярного двоичного дерева (рисунок 3.2). Идея способа заключается в том, что начиная с элемента памяти α(1), делают его корнем

дерева, размещают там данные, соответствующие узлу У1. В элементах памяти α(2) и α(3) размещают непосредственных потомков узла У1 узлы У2 и У3, и т.д. В общем случае, непосредственные потомки узла Ук размещаются по адресам: α(2k) и α(2k+1). Адресная функция имеет вид

α(k ) = β + (k − 1)m ,

где k – номер узла древовидной структуры; р – базовый адрес; т – размер элемента памяти, который требуется для хранения данных узлов дерева (каждый узел представляет собой запись фиксированной длины). По дереву, которое при этом получается, можно двигаться в обоих направлениях, так как от узла Ун можно перейти к его потомкам, удвоив k (или удвоив k и прибавив единицу). Можно двигаться к узлу, являющемуся исходным для узла Ун, разделив k пополам и отбросив дробную часть. Адрес соответствующего узлу элемента памяти определяется по адресной функции.

Рисунок 3.2 - Пример реализации структуры типа регулярного двоичного дерева с помощью линейного списка

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

105

γ= i + j ,

2

где - знак округления до ближайшего меньшего целого.

Корень дерева размещается в середину вектора. В элементах памяти от г-то до (m-l)-гo включительно размещается левое поддерево. В элементах памяти от (m+1)-го до j-го включительно размещается правое поддерево. Аналогично процесс повторяется для размещения каждого поддерева. Приведенный способ позволяет реализовать двоичное сбалансированное дерево.

Существует ряд других способов представления древовидных структур. С помощью приемов, основанных на свойствах целых чисел, можно с помощью последовательного распределения организовать в памяти некоторые сетевые структуры. Однако для представления сложных сетевых структур требуются более гибкие методы построения в памяти ЭВМ, которые невозможно получить с помощью последовательного распределения памяти. В этом случае используется связанное распределение памяти.

3.1.2 Связанное распределение памяти

Связанное представление линейного списка называется связанным списком. При связанном распределении памяти для построения структуры необходимо задать отношения следования и предшествования элементов с помощью указателей. Указателями служат адреса, хранимые в записях данных. В отличие от последовательного распределения памяти, при котором с помощью адресной функции вычисляется адрес следующего элемента, при связанном распределении памяти значение адресной функции можно получить только путем просмотра хранящихся указателей. Такой метод распределения памяти позволяет расширить либо сократить структуру без перемещения самих данных в памяти ЭВМ, однако при этом требуется больше памяти для хранения структуры по сравнению с последовательным распределением.

Связанное распределение - более сложный, но и более гибкий способ хранения линейного списка. Каждый узел содержит указатель на следующий узел списка, т.е. адрес следующего узла списка (рисунок 3.3).

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

106

Рисунок 3.3 - Примеры связанных линейных списков: а) – однонаправленный список;

б) – тот же список после удаления узла 4 и включения узлов 2а и 5

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

Для достижения большей гибкости при работе с линейными списками в каждый узел X[i] вводятся два Указателя.

Один из указателей реализует связь рассматриваемого узла с узлом Х[М], а другой - с узлом X[i+l] (рисунок 3.4).

Рисунок 3.4 - Пример двунаправленного линейного списка

Связанные списки - удобная форма представления динамически изменяющихся линейных структур. Любое произвольное изменение порядка записей, сокращение или расширение вектора данных в какой-либо записи

107

не требуют перемещения записей в памяти ЭВМ. Для выполнения этих операций достаточно лишь изменить значения полей связи.

Однако доступ к конкретному узлу может оказаться намного длительнее, чем при последовательном распределении памяти. Чтобы получить доступ к данным, хранящимся в узле X[i], необходимо сделать i итераций, используя указатели и поля связи в узлах X[k], где k=1, 2, ..., i, т.е. последовательно просмотреть все предшествующие узлы списка. Этот недостаток можно устранить различными способами.

Одним из способов является организация связанного линейного списка с пропусками (рисунок 3.5, а). Для этого линейный список делится на группы узлов, связанные между собой обратными указателями.

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

Другой способ (рисунок 3.5, б) заключается в построении специального дополнительного линейного списка - индекса, например, с последовательным распределением памяти. Элементы индекса - значения первых УЗЛОВ каждой группы и указатели на них.

Оптимальный размер группы (количество узлов в группе) при равновероятном нахождении узла в любой из групп nr = n где n– количество элементов списка.

Число групп

= n l .

nГ

Рисунок 3.5 - Примеры реализации способов ускорения доступа к узлам линейного связанного списка:

а) – организация линейного связанного списка с пропусками; б) - организация линейного связанного списка с индексом

108

При равновероятном нахождении узла в любой из групп при доступе к узлу необходимо просмотреть в среднем l/2 групп, а в каждой группе nГ/2 узлов. Следовательно, общее количество просмотров

 

 

n

 

 

A = l / 2 + nГ

/ 2 = 0,5

 

+ nГ

 

 

nГ

 

Для связанных линейных одноили двунаправленных списков в ряде случаев целесообразно создать специальный узел – голову списка – и хранить его в специальной фиксированной ячейке памяти по адресу β.

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

Важной разновидностью представления в памяти линейного списка является циклический список.

Циклически связанный линейный список обладает той особенностью, что связь от последнего узла идет к первому узлу списка (рисунок 3.6). Циклический список позволяет получить доступ к любому узлу списка, отправляясь от любого заданного узла. Циклические списки называются также кольцевыми

структурами или кольцами.

Рисунок 3.6 - Пример однонаправленного циклического списка

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

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

109

большого числа указателей в многосвязанной структуре в ряде случаев повышает эффективность обработки.

Таким образом, основой построения связанных списковых структур являются указатели.

При практической реализации на ЭВМ можно использовать три типа указателей (адресов записей):

машинный (действительный);

относительный;

символический (идентификатор).

Первый тип указателей - действительный адрес -используется тогда, когда необходимо получить наибольшую скорость обработки данных, организованных в связанные списковые структуры.

Этот тип указателей имеет серьезный недостаток - жесткую привязку записей к конкретному месту расположения в памяти. Если возникнет необходимость переместить список на новое место в памяти ЭВМ, то потребуется выполнить работу изменению указателей во всех записях.

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

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

Третий тип указателей – символический адрес (идентификатор) – позволяет перемещать отдельные записи относительно друг друга, включать или удалять записи в список без изменения указателей во всех остальных записях списка. Однако при работе с символическими указателями скорость доступа меньше, чем при работе с машинными или относительными адресами. Идентификаторы в качестве указателей удобно использовать для интенсивно изменяющихся файлов. Преобразование идентификатора в машинный адрес при выполнении операций обращения к узлам списка выполняется с помощью специального алгоритма в соответствии с выбранным методом адресации.

С точки зрения организации структуры данных различают два типа указателей:

встроенные указатели;

справочник указателей.

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

справочник.

Указатели имеют следующие возможные пути использования:

110