Глава III. Индексирование баз данных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава III. Индексирование баз данных



 

В таблицах могут определяться ключи и индексы. Ключ – это комбинация полей, данные в которых однозначно определяют каждую запись в таблице. Простой ключ состоит из одного поля, составной из нескольких полей. Поля, по которым построен ключ, называют ключевыми. Чтобы определить ключевое поле, нужно запустить программу Database Desktop, открыть таблицу, для которой строится ключ, перейти в окно изменения структуры таблицы и в этом окне в поле Key напротив имени поля поставить символ «*» клавишей [Пробел].

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

Индексы при создании именуются. Создание индекса называют индексированием таблицы.

Использование ключей и индексов позволяет:

§ однозначно идентифицировать записи;

§ избегать дублирования значений в ключевых полях;

  • увеличивать скорость доступа к данным (поиск данных);
  • выполнять сортировку записей в таблицах;
  • устанавливать связи между отдельными таблицами БД и т. д.

Для одной таблицы можно создать несколько индексов. В каждый момент времени один из них можно сделать текущим (активным). При существовании нескольких индексов таблица может не иметь текущего индекса.

Задание индекса сводится к определению:

  • состава полей;
  • параметров;
  • имени.

 

Для задания индексов надо:

1) Запустить Database Desktop;

2) Открыть таблицу, которую необходимо проиндексировать;

3) Перейти в окно создания структуры таблицы (Table/Restructure);

4) В комбинированном списке Table properties: выбрать пункт Secondary Indexes (вторичные индексы);

5) Нажать на кнопку Define (определить);

6) В появившемся окне Define Secondary Index (задание вторичного индекса) задать состав полей и параметры индекса:

§ Unique (Уникальный) – индекс требует для составляющих его полей не повторяющихся значений;

§ Case sensitive (Зависящий от условий) – для полей строкового типа учитывается регистр символов;

§ Descending (Нисходящий) – сортировка выполняется в порядке убывания значений.

7) Нажать кнопку ОК, появится окно Save Index As (Сохранить индекс), в котором указывается имя индекса (indИмяПоля, например, indTovar, indKolvo, indTovarCena и т.д.). В имени индекса указывается имя поля, по которому строится индекс.

8) После повторного нажатия кнопки ОК сформированный индекс добавляется к таблице и его имя появляется в списке индексов.

Чтобы изменить индекс, нужно в окне изменения структуры таблицы в списке Table properties выбрать пункт Secondary Indexes, выделить имя изменяемого индекса и нажать кнопку Modify (Изменить). Для удаления индекса, нужно выделить имя удаляемого индекса и нажать кнопку Erase (Удалить).

 

Установка текущего индекса

В НД Table возможно указание текущего индекса. Его можно установить двумя способами:

1. С помощью свойства IndexName: String – содержит имя индекса, заданное при его создании (Например, Table1.IndexName:='indTovar';).

2. С помощью свойства IndexFieldNames: String – содержит имя поля, для которого был создан индекс (Например, Table1.IndexFieldNames:='Tovar';).

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

 

Сортировка набора данных

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

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

Сортировка НД Table выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей. Таким образом, сортировка возможна по полям, для которых создан индекс.

 

Практическая работа

Отсортировать записи набора данных Table1 для таблицы Tovar.db по полям Tovar, Kod, DataVipusk, Kolvo, Cena.

Расположите на форме компоненты в соответствии с рисунком:

Проиндексируйте таблицу Tovar.db по полям Tovar, Kod, DataVipusk, Kolvo, Cena. Создайте простые индексы и назовите их соответственно indTovar, indKod, indDV, indKolvo, indCena.

Для кнопки «Отсортировать» напишите следующий обработчик события OnClick:

procedure TForm1.Button1Click(Sender: TObject);

Begin

case RadioGroup1.ItemIndex of

0: Table1.IndexName:= 'indTovar';

1: Table1.IndexName:= 'indKod';

2: Table1.IndexName:= 'indDV';

3: Table1.IndexName:= 'indKolvo';

4: Table1.IndexName:= 'indCena';

end;

end;

Для кнопки «Отменить сортировку» напишите обработчик события OnClick:

procedure TForm1.Button1Click(Sender: TObject);

Begin

Table1.IndexName:= '';

end;

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


Глава IV. Фильтрация записей

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

Система Delphi дает возможность осуществлять фильтрации записей:

§ по выражению;

§ по диапазону.

По умолчанию фильтрация записей не ведется, и НД Table содержит все записи связанной с ним таблицы БД.

 

Фильтрация по выражению

 

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

Достоинством фильтрации по выражению состоит в том, что она применима к любым полям, в том числе к неиндексированным. Так как в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей.

Свойство Filter типаSrting компонента Table – задает выражение фильтра. В его состав могут входить элементы:

1) имена полей таблиц;

2) литералы – значение, заданное явно (число, строка или символ). В выражение фильтра включаются только выражения строкового типа.

3) операции сравнения (<, >, =, >=, <=, <>);

4) арифметические операции (+, -, *, /);

5) логические операции (and (логическое умножение), or (логическое сложение), not (логическое отрицание));

6) () и [ ] скобки.

Пример:

Tovar = 'Макароны'

Cena >=150 or Cena <= 500

 

Если имя поля содержит пробелы, то его заключают в [ ] (например, [Name Firma] = 'Слад&Ко'), в противном случае [ ] необязательны.

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

Для активизации и деактивизации фильтра используется свойство Filtered типа Boolean. Если Filtered=True, то фильтрация включается, и НД отбираются записи, которые удовлетворяют фильтру, записанному в свойстве Filter. Если Filtered=False (по умолчанию), то фильтрация выключена.

Свойство FilterOptions типа TFilterOptions задает параметры фильтрации. Может принимать комбинации двух значений:

§ foCaseInsensitive – регистр букв не учитывается, т. е. при задании фильтра Tovar='Хлеб' слова "Хлеб", "хЛеБ", "ХЛЕБ" или "хлеб" будут восприняты как одинаковые;

§ foNoPartialCompare – выполняется проверка на полное соответствие содержимого поля и значения, заданного для поиска. Обычно применяется для строк. Если известны только первые символы строки, то нужно указать их в выражении фильтра, заменив остальные символом «*» и выключив значение foNoPartialCompare. Например, при выключенном значении foNoPartialCompare для фильтра Tovar = 'C*' будут отобраны записи, у которых в поле Tovar содержатся значения "Сметана", "Сыр", "Сахар" или "Сельдь с/м".

 

Все параметры фильтра перечисляются в свойстве FilterOptions через «,» и заключаются в [ ]. По умолчанию все параметры фильтра выключены, т.е. свойство FilterOptions = [ ].

 

Практическая работа

Организовать фильтрацию записей таблицы Tovar. db по выражению, которое задает пользователь.

Вид формы работающего приложения показан на рисунке:

Разместите в окне формы компоненты в соответствии с рисунком готовой программы.

Напишите для окна формы обработчик события OnCreate:

рrocedure TForm1.FormCreate(Sender: TObject);

begin

table1.Filter:='';

table1.FilterOptions:=[focaseinsensitive];

table1.Filtered:=true;

end;

Для кнопки Включить фильтр напишите обработчик события OnClick:

procedure TForm1.Button1Click(Sender: TObject);

begin

table1.Filtered:=true;

table1.Filter:=edit1.Text;

end;

Для кнопки «Отменить фильтрацию» напишите обработчик события OnClick:

procedure TForm1.Button2Click(Sender: TObject);

begin

table1.Filtered:=false;

end;

 

Для кнопки «Закрыть» самостоятельно напишите обработчик события, при котором закрывается работающее приложение.

Запустите программу. Напишите в компонент Edit1 выражение фильтра в соответствии с указанным ранее рисунком. Отмените фильтр. Придумайте свое выражение фильтра.

 

Практическая работа

Создадим электронную записную книжку. Совместно с набором данных будем использовать элемент управления с закладками TabControl

Компонент TabCotntrol (п.к. Win32). Представляет собой контейнер с закладками.

Вид записной книжки с распечаткой фамилий на букву "А" показан на рисунке:

 

Создайте таблицу Notebook.db со списком телефонов друзей и знакомых (поля: FIO, Phone, Note (примечания)) в программе Database Desktop. Сохраните созданную таблицу в рабочей папке Baza. Заполните данными (20 записей).

Расположите на форме компонент TabControl. В свойстве Tabs этого компонента в столбик перечислите все буквы алфавита (кроме "Й", "Ь", "Ъ"). В свойстве MultiLine установите значение true, чтобы закладки размещались в несколько рядов. Свойству TabPosition присвойте значение alTop, свойству HotTrack – true.

На форме разместите три компонента для работы с БД (Table1, DataSource1, DBGrid1). Таблицу Notebook.db свяжите с НД Table1. Список владельцев телефонов отображается в компоненте DBGrid1. Пользователь может отобразить все фамилии или вывести фамилии, начинающиеся с определенной буквы.

Для управления отбором записей используется фильтрация. Разместите на форме компонент CheckBox1 и присвойте ему заголовок «Показывать все записи». С помощью этого компонента будет активизироваться и деактивизироваться фильтр. По умолчанию флажок установлен, при этом фильтр выключен, и отображаются все фамилии. Если флажок CheckBox1 сброшен, то выполняется фильтрация. Записи выбираются на основании первой буквы фамилии. Букву можно выбирать с помощью закладок компонента TabControl1.

Напишите следующие обработчики событий для данной формы:

procedure TForm1.FormCreate(Sender: TObject);

Begin

DBGrid1.Align:=alClient;

Table1.FilterOptions:=[foCaseInsensitive];

CheckBox1.Checked:=true;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

Begin

if CheckBox1.Checked then

Table1.Filtered:=false

Else

Table1.Filtered:=true;

end;

 

Событие OnChange возникает при выборе новой закладки и позволяет управлять содержимым окна компонента.

procedure TForm1.TabControl1Change(Sender: TObject);

Begin

Table1.Filter:='FIO= '''+tabcontrol1.Tabs[tabcontrol1.TabIndex]+'*''';

end;

Фильтрация по диапазону

 

При фильтрации по диапазону в НД включаются записи, значения полей которых попадают в заданный диапазон.

Таким образом, условием фильтрации является выражение вида " значение > нижней границы AND значение < верхней границы " (вместо операций сравнения < > могут указываться и операции <= >=).

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

Для фильтрации записей по диапазону компонент Table имеет следующие методы:

ApplyRange – активизирует фильтр (включение фильтра);

CancelRange – деактивизирует фильтр (выключение фильтра);

SetRangeStart – устанавливает нижнюю границу диапазона;

SetRangeEnd – устанавливает верхнюю границу диапазона;

EditRangeStart – изменяет предварительно заданную нижнюю границу диапазона;

EditRangeEnd – изменяет предварительно заданную верхнюю границу диапазона;

SetRange – имеет тот же эффект, что и последовательное выполнение методов SetRangeStart, SetRangeEnd и ApplyRange. Процедура позволяет одновременно задать границы диапазона и выполнить фильтрацию.

Свойство KeyExclusive типа Boolean определяет, как учитывается заданное граничное значение при анализе записей. Если KeyExclusive = False (по умолчанию), то записи, у которых значения полей фильтрации совпадают с границами диапазона, включаются в состав НД, а если KeyExclusive = True, то такие записи в НД не попадают. Свойство KeyExclusive действует отдельно для нижней и верхней границы. Значение этого свойства должно устанавливаться после вызова методов SetRangeStart, SetRangeEnd, EditRangeStart и EditRangeEnd.

 

Пример:

Table1.IndexName: ='indCena'; //установка текущего индекса indCena (создан по полю Cena таблицы Tovar.db)

Table1. SetRangeStart;

Table1. KeyExclusive: = True;

Table1.FieldByName('Cena').AsFloat: =100.5;

Записи, содержащие в поле Cena значение 100,5, не входят в отфильтрованный НД (т. к. KeyExclusive = True). Фильтрация по диапазону подчиняется условию Cena >100,5. Если бы KeyExclusive = False, то условие фильтрации выглядело бы по-другому (Cena >=100,5).

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

 

Самостоятельная работа

Имена полей указываются на английском языке. Дайте им названия на русском.

 



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 405; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.129.100 (0.052 с.)