СТРУКТУРА  БАЗЫ  ДАННЫХ

 

 

ОГЛАВЛЕНИЕ

 

НАЗНАЧЕНИЕ  И  ПРЕИМУЩЕСТВА

СТРУКТУРА  БАЗЫ  ДАННЫХ

ИНТЕРФЕЙС  НА  C++

ФОРМАТЫ  ФАЙЛОВ

ИНСТРУМЕНТЫ

ТЕРМИНЫ

 

 

 

Базовыми понятиями являются измерение, иерархия и факт.

 

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

 

Примеры фактов:

 

(Иванов, Казань) – в Казани есть Иванов;

(Петров, Тверь, 1970) – в Твери есть Петров, 1970-го года рождения;

(Москва) – есть такой город Москва.

 

Факт единичной размерности называется элементом измерения.

 

На самом деле, факты хранятся в базе не в виде их физических значений, а в виде наборов номеров элементов, например: (125, 7, 2123, 35). Каждый факт уникален в смысле определяющего его набора элементов, то есть не может быть двух одинаковых фактов.

 

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

 

[(125, 7, 2123, 235), 10] - многомерный факт, функция Количество = 10 показывает, сколько на самом деле есть таких фактов (в базе он не может повторяться);

 

[(125), Петров] - одномерный факт, заданная на нем функция принимает значение «Петров»;

 

[(7), Тверь] - одномерный факт, заданная на нем функция принимает значение «Тверь»;

 

[(2123), 1970] - одномерный факт, заданная на нем функция принимает значение «1970»;

 

[(235), 185] - одномерный факт, заданная на нем функция принимает значение «185» (скажем, это его рост).

 

Таким образом, факт [(125, 7, 2123, 235), 10] содержит информацию о существовании в Твери десяти Петровых, 1970 г.р., ростом 185 см.

 

 

Измерение предназначается для перечисления однотипных элементов; на каждом измерении задается иерархия, состоящая из нескольких уровней. Пример:

 

уровень 0:   дни,

 

уровень 1:   месяца,

 

уровень 2:   годы.

 

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

 

 

Для задания набора измерений, присутствующих на данной совокупности фактов, применяется кросс – битовая маска фиксированной длины. Длина кросса на единицу больше максимально возможного для данной базы количества измерений; эта длина всегда кратна 8, т.е. 1 байту. Пример кросса:

 

0010 1110 0100 0000 0000 0000 0000 0000 .

 

Первый слева бит характеризует принадлежность к витрине (1 – принадлежит витрине, 0 – не принадлежит, см. описание класса Fct). Следующие биты указывают на наличие или отсутствие 0-го, 1-го, 2-го и т.д. измерений в описываемом типе фактов.

 

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

 

Примеры записей в файле адресов:

 

0010 1110 0100 0000 0000 0000 0000 0000,  0,  0,  0,  1,  0,  13172,  16551,  20       факты из этого диапазона содержат 1-е, 3-е, 4-е, 5-е и 8-е измерения и расположены в файле фактов по адресам в диапазоне с 13172 по 16551, причем каждый факт занимает 20 байт; элементы, характеризующие такие факты на 5-м измерении, принадлежат 1-му уровню иерархии, на 1-м, 3-м, 4-м и 8-м измерениях – 0-му уровню.

 

0001 0000 0000 0000 0000 0000 0000 0000,  1,  7,  9516,  9523,  8       факты из этого диапазона принадлежат ко 2-му измерению (т.к. «1» находится на 4-й позиции слева), к первому уровню иерархии на этом измерении и имеют в качестве родительского элемента 7-й элемент 2-го уровня.

 

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

 

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

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

 

В случае, если в процессе работы все факты из данного диапазона оказываются удаленными, адреса диапазона приобретают вид:   adr1, adr2,   где  adr2 = adr1 – 1. В результате дефрагментации все такие диапазоны удаляются из файла адресов.

 

Файл фактов (*.fct) содержит только информацию о номерах элементов и значения функций.

 

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

 

 

 

 

 

 

 

Рейтинг@Mail.ru