Первичные ключи и индексы
В каждой таблице БД может существовать первичный ключ — поле или набор полей, однозначно идентифицирующий запись. Значение первичного ключа в таблице БД должно быть уникальным, то есть в таблице не должно существовать двух или более записей с одинаковым значением первичного ключа.
Первичные ключи облегчают установление связи между таблицами. В таблице покупателей таким ключом может быть одноименное поле. Установив связь по первичному ключу, мы можем выяснить, что, например, 10.12.99 со склада было отпущено 100 единиц книг «Borland С++ Builder 4» покупателю «Магазин № 1», который расположен по адресу: 107005, Москва, 2-я Бауманская ул., 12 (телефон для связи 273-00-14).
Поскольку первичный ключ должен быть уникальным, для него могут использоваться не все поля таблицы. В приведенном примере название покупателя вряд ли может быть уникальным («Магазин № 1» может существовать не только в Москве, но и в любом другом городе), поэтому поле Покупатель не может использоваться в качестве первичного ключа.
Если в таблице нет полей, значения в которых уникальны, для создания первичного ключа в нее обычно вводят дополнительное числовое поле, значениями которого СУБД может распоряжаться по своему усмотрению. Если, например, в таблицу покупателей добавить поле №, то она могла бы выглядеть так.
№ | Покупатель | Адрес | Телефон |
Магазин № 1 | 107005, Москва, 2-я Бауманская ул., 12 | 273-00-14 | |
Дом книги | 105066, Москва, Измайловский б-р, 18/11 | 165-18-99 |
Соответственно изменилась бы и связанная с ней таблица отпуска товаров.
Дата Название книги Покупатель Отпущено
10.12.99 Borland С++ Builder 4 1 100
10.12.99 Delphi 5. Учебный курс 1 100
12.12.99 В сетях Всемирной паутины 2 2000
Теперь в таблице отпуска товаров в поле Покупатель указывается значение первичного ключа, построенного по полю № таблицы покупателей, что позволяет установить однозначную связь между таблицами.
Индексы отличаются от первичных ключей тем, что не требуют непременной уникальности значений входящих в их состав полей. Они устанавливаются по полям, которые часто используются при поиске и сортировке данных: индексы помогут системе значительно быстрее найти нужные данные или отсортировать их в нужной последовательности.
Для быстрого доступа к своему содержимому, записи в таблице упорядочиваются по значению одного или нескольких полей. Список полей, задающий порядок записей, называется индексом (index), а сами поля – ключевыми (index fields). Для одной таблицы может существовать несколько способов упорядочивания записей, т.е. несколько индексов. Индексы имею большое значение при работе с таблицами, т.к. при их отсутствии при поиске информации пришлось бы перебирать подряд все записи таблицы.
Один из индексов является первичным (primary), он задает начальный порядок следования записей в таблице. Значение первичного индекса обязательно должно быть уникальным для каждой отдельной записи. Иначе говоря, в таблице не могут существовать две записи с одинаковыми значениями первичного индекса. Например, в таблице заказов первичный индекс правильно будет построить по полю «номер заказа», т.к. каждому заказу всегда назначается уникальный номер.
Все остальные индексы таблицы являются вторичными (secondary), они задают альтернативные способы упорядочивания записей и могут быть неуникальными.
Механизм BDE
Характерной особенностью программ, созданных с помощью Delphi и предназначенных для работы с базами данных, является их зависимость от специальной библиотеки программ, которая называется BDE (Borland Database Engine — машина баз данных корпорации Borland). BDE представляет собой набор библиотек DLL, предназначенных для низкоуровнего доступа к данным самых различных форматов. BDE автоматически устанавливается в процессе установки Delphi и регистрируется в реестре 32-разрядной версии Windows. BDE «умеет» работать с таблицами самых распространенных СУБД, причем как файл-серверных (dBase, Paradox, FoxPro, Clipper), так и клиент-серверных (InterBase, Microsoft SQL Server, Oracle и др.). В BDE имеется собственный интерпретатор языка SQL, что позволяет создавать запросы не только к серверам БД, но и таблицам файл-сервера.
Без установки и регистрации BDE на компьютере не может работать ни одна программа БД, созданная в Delphi и использующая механизм BDE.
Проектирование БД
Проектирование БД заключается в определении состава полей ее таблиц и связей между таблицами. Оттого, насколько тщательно проведен анализ и насколько грамотно спроектирована БД, в существеннейшей мере зависит эффективность будущей СУБД и ее полезность для пользователя.
Имена таблиц и полей
В файл-серверных БД имя таблицы совпадает с именем файла, в котором размещаются все содержащиеся в ней данные. В именах полей полезно ставить префикс из одной-двух букв названия таблицы (в таблице NAKLS все имена начинать с буквы «N», в FIRMS — с «F» и т. п.). Старайтесь делать имена полей по возможности лаконичными — это сократит код программы и сроки ее создания.
Создание таблиц
В файл-серверных БД все таблицы размещаются в одном каталоге (папке). Создание таблиц файл-серверных БД осуществляется с помощью утилиты (вспомогательной программы) Database Desktop (DBD), входящей в комплект поставки Delphi.
Утилита DBD решает целый ряд задач, связанных с таблицами файл-серверных БД. С ее помощью можно создать или изменить структуру таблицы, создать ее первичные ключи и индексы, создавать и изменять записи, просматривать их и т. д. К сожалению, используемые ею шрифты не поддерживают кириллицу, так что работать с записями, содержащими русскоязычные текстовые поля, невозможно. Другим существенным недостатком утилиты является невозможность ее использования в клиент-серверных БД.
Запустите DBD с помощью команды Пуск ► Программы ► Borland Delphi 7 ► Database Desktop (если вы работаете в среде Delphi, для запуска используйте команду Tools ► Database Desktop главного меню).
Первое, что необходимо сделать, — это настроить рабочий каталог утилиты. Выберите команду File ► Working Directory и установите в появившемся окне ссылку на каталог C:\BIBLDATA (рис. 1.3).
Для создания таблицы NAKLS выберите команду File ► New ► Table. DBD откроет окно Create Table, в котором можно выбрать тип таблицы. Тип таблицы определяет многие ее свойства. Тип Paradox 7 можно считать наилучшим для файл-серверных таблиц: щелчком на кнопке ОК согласитесь с вариантом Paradox 7, предложенным по умолчанию. На экране появится окно (рис. 1.4), предназначенное для создания/редактирования структуры таблицы.
Рис. 1.3. Установка рабочего каталога
Рис. 1.4. Окно создания структуры таблицы
Каждому полю создаваемой таблицы соответствует одна запись в таблице Field roster этого окна: в колонку Field Name нужно поместить имя поля, в колонку Туре — символ, определяющий тип хранимых в поле данных, в колонку Size — число, определяющее длину поля (требуется не для всех типов полей), и, наконец, в колонку Key — символ звездочки (*), если по значениям этого поля нужно построить первичный ключ.
Введите название первого поля Naklld (первый символ названия поля для таблиц Paradox DBD всегда вводится прописным) и нажмите клавишу табуляции для перехода к следующей колонке, в которой вводится тип поля. Нажмите клавишу пробела, чтобы утилита DBD показала список возможных типов, и выберите в нем тип Autoincrement. Поля автоинкрементного типа служат для создания уникального числа, однозначно определяющего запись: для первой записи в это поле будет автоматически помещено число 1, для второй — 2 и т. д. При удалении какой-либо записи выделенное для нее число не используется вновь. Щелкните на колонке Key. Нажмите клавишу пробела, чтобы создать по полю первичный ключ.
Продолжите ввод полей таблицы NAKLS так, как показано на рис. 1.5. Для первых четырех полей установите флажок Required Field, означающий, что при вводе очередной записи в эти поля обязательно должны быть помещены значения — за этим будет следить BDE. Четыре других поля могут не определяться в момент ввода очередной записи. Имеет смысл определить для них значения по умолчанию в строке Default value: для поля NCoeff таким значением будет 1, для остальных — 0.
По полю NDate нужно определить индекс (в терминологии таблиц Paradox он называется вторичным). Для этого раскройте список Table properties в правом верхнем углу окна, выберите пункт Secondary Indexes и щелкните на появившейся кнопке Define. В окне Define Secondary Index (рис. 1.6) в списке полей таблицы выделите (щелчком) поле NDate и затем щелкните на кнопке со стрелкой вправо, чтобы перенести поле в список Indexed fields. Замечу, что таким способом можно перенести не одно, а несколько полей. Индекс, построенный по нескольким полям, называется составным.
Рис. 1.5. Структура полей таблицы NAKLS
Рис. 1.6. Определение индексного поля (полей)
С помощью флажков группы Index options можно определить следующие особенности индекса:
- Unique — индекс будет содержать уникальные значения;
- Maintained — индексные поля сортируются по возрастанию значений;
- Case sensitive — индекс чувствителен к регистру букв в текстовых полях;
- Descending — индексные поля сортируются по убыванию значений.
В нашем случае (а также при определении индексов в других таблицах демонстрационной БД) оставьте эти флажки без изменений и щелкните на кнопке ОК. DBD запросит имя индекса (в таблицах Paradox, как и в большинстве серверов БД, индексы именуются) — введите строку Nakls_date и щелкните на кнопке ОК. Во вновь появившемся окне определения структуры таблицы щелкните на кнопке Save as и затем укажите имя файла — Nakls.
Мы только что создали структуру таблицы NAKLS.