Особенности использования индексов зависят от формата связываемых таблиц. Так, для таблиц dBase индексы строятся по одному полю и нет деления на ключ (главный или первичный индекс) и индексы. Для организации связи в главной и подчиненной таблицах выбираются индексы, составленные по полям совпадающего типа, например, целочисленного.
Для таблиц Paradox в качестве полей связи главной таблицы должны использоваться поля ключа, а для подчиненной таблицы — поля индекса. Кроме того, в подчиненной таблице обязательно должен быть определен ключ. На рис. 2.2 показана схема связи между таблицами БД Paradox.
24
Часть I. Основы работы с базами данных
В главной таблице определен ключ, построенный по полю MCode автоинкрементного типа. В подчиненной таблице определен ключ по полю D_Number также автоинкрементного типа и индекс, построенный по полю D_Code целочисленного типа. Связь между таблицами устанавливается по полям D_Code и M_Code. Индекс по полю D_Code является внешним ключом. В названия полей включены префиксы, указывающие на принадлежность поля соответствующей таблице. Так, названия полей главной таблицы начинаются с буквы м (Master), a названия полей подчиненной таблицы начинаются с буквы d (Detail). Подобное именование полей облегчает ориентацию в их названиях, особенно при большом количестве таблиц.
Замечание
J
Как отмечалось, поля связи должны быть индексированными, хотя, строго говоря, это требование не всегда является обязательным. При доступе к данным средствами языка SQL можно связать (соединить) между собой таблицы и по неиндексиро-ванным полям. Однако в этом случае скорость выполнения операций будет низкой.
Связь между таблицами определяет отношение подчиненности, при котором одна таблица является главной (родительской, или мастером — Master), а вторая — подчиненной (дочерней, или детальной — Detail). Саму связь (отношение) называют связь "главный-подчиненный", "родительский-дочерний" или "мастер-детальный". Существуют следующие виды связи:
|
□ отношение "один-к-одному";
□ отношение "один-ко-многим";
□ отношение "много-к-одному";
□ отношение "много-ко-многим".
Отношение "один-к-одному" означает, что одной записи в главной таблице соответствует одна запись в подчиненной таблице. При этом возможны два варианта:
□ для каждой записи главной таблицы есть запись в подчиненной таблице;
□ в подчиненной таблице может не быть записей, соответствующих записям главной таблицы.
Глава 2. Реляционные базы данных и средства работы с ними
25
Отношение "один-к-одному" обычно используется при разбиении таблицы с большим числом полей на несколько таблиц. В этом случае в первой таблице остаются поля с наиболее важной и часто используемой информацией, а остальные поля переносятся в другую (другие) таблицу.
Отношение "один-ко-многим" означает, что одной записи главной таблицы в подчиненной таблице может соответствовать несколько записей, в том числе ни одной. Этот вид отношения встречается наиболее часто. После установления связи между таблицами при перемещении на какую-либо запись в главной таблице в подчиненной таблице автоматически становятся доступными записи, у которых значение поля связи равно значению поля связи текущей записи главной таблицы. Такой отбор записей подчиненной таблицы является своего рода фильтрацией.
|
Типичным примером является, например, организация учета выдачи книг в библиотеке, для которой удобно создать следующие две таблицы:
□ таблицу карточек читателей, содержащую такую информацию о читателе, как фамилия, имя, отчество, дата рождения и домашний адрес;
□ таблицу выдачи книг, в которую заносится информация о выдаче книги читателю и о возврате книги.
В этой ситуации главной является таблица карточек читателей, а подчиненной — таблица выдачи книг. Один читатель может иметь на руках несколько книг, поэтому одной записи в главной таблице может соответствовать несколько записей в подчиненной таблице. Если читатель сдал все книги или еще не брал ни одной книги, то для него в подчиненной таблице записей нет. После связывания обеих таблиц при выборе записи с данными читателя в таблице выдачи книг будут доступны только записи с данными о книгах, находящихся на руках этого читателя.
В приведенном примере предполагается, что после возврата книги соответствующая ей запись удаляется из таблицы выдачи книг. Вместо удаления записи можно заносить в соответствующее поле дату возврата книги.
Отношение "много-к-одному" отличается от отношения "один-ко-многим" только напрвлением. Если на отношение "один-ко-многим" посмотреть со стороны подчиненной таблицы, а не главной, то оно превращается в отношение "много-к-одному".
Отношение "много-ко-многим "имеет место, когда одной записи главной таблицы может соответствовать несколько записей подчиненной таблицы и одновременно одной записи подчиненной таблицы — несколько записей главной таблицы. Подобное отношение реализуется, например, при планировании занятий в институте и устанавливается между таблицами, в которых хранится информация о номерах аудиторий и номерах учебных групп. Так как учебная группа может заниматься в разных аудиториях, то одной записи об учебной группе (первая таблица) может соответствовать несколько записей о занимаемых этой группой аудиториях. В то же время в одной аудитории могут заниматься разные учебные группы (даже одновременно), поэтому одной записи об аудитории может соответствовать несколько записей об учебных группах (вторая таблица).
|
26
Часть I. Основы работы с базами данных
На практике отношение "много-ко-многим" используется достаточно редко. Причинами являются сложность организации связи между таблицами и взаимодействия между их записями. Кроме того, многие СУБД, в том числе Paradox, не поддерживают организацию ссылочной целостности для подобного отношения. Отметим также, что для отношения "много-ко-многим" понятия главной и подчиненной таблицы не имеют смысла.
Среди рассмотренных отношений наиболее общим является отношение "один-ко-многим". Другие виды отношений можно рассматривать как его варианты — отношение "один-к-одному" представляет собой частный случай этого отношения, а отношение "много-к-одному" является его "переворотом". Отношение "много-ко-многим" можно свести к отношению "один-ко-многим", соответствующим образом преобразовав и разделив таблицы. В дальнейшем предполагается, что таблицы связаны именно отношением "один-ко-многим".
Работа со связанными таблицами имеет следующие особенности.
□ При изменении (редактировании) поля связи может нарушиться связь между записями двух таблиц. Поэтому при редактировании поля связи записи главной таблицы нужно соответственно изменять и значения поля связи всех подчиненных таблиц.
□ При удалении записи главной таблицы нужно удалять и соответствующие ей записи в подчиненной таблице (каскадное удаление).
□ При добавлении записи в подчиненную таблицу значение ее поля связи должно быть установлено равным значению поля связи главной таблицы.
Ограничения по установке, изменению полей связи и каскадному удалению записей могут быть наложены на таблицы при их создании. Эти ограничения, наряду с другими элементами, например описаниями полей и индексов, входят в структуру таблицы и действуют для всех приложений, которые выполняют операции с БД. Указанные ограничения можно задать при создании или реструктуризации таблицы, например, в среде программы Database Desktop, которая позволяет устанавливать связи между таблицами при их создании.
Ограничения, связанные с установкой, изменением значений полей связи и каскадным удалением записей, могут и не входить в структуру таблицы (таблиц), а реализовываться программным способом. В этом случае программист должен обеспечить:
□ организацию связи между таблицами;
□ установку значения поля связи подчиненной таблицы (это может также выполняться автоматически);
□ контроль (запрет) редактирования полей связи;
□ организацию (запрет) каскадного удаления записей.
Например, в случае удаления записи из главной таблицы программист должен проверить наличие соответствующих записей в подчиненной таблице. Если такие записи есть, то необходимо удалить и их или, наоборот, запретить удаление записей из обеих таблиц. И в том, и в другом случае пользователю должно быть выдано предупреждение.
Глава 2. Реляционные базы данных и средства работы с ними
27
Механизм транзакций
Информация БД в любой момент времени должна быть целостной и непротиворечивой. Одним из путей обеспечения этого является использование механизма транзакций.
Транзакция представляет собой выполнение последовательности операций. При этом возможны две ситуации.
□ Успешно завершены все операции. В этом случае транзакция считается успешной, и все изменения в БД, которые были произведены в рамках транзакции отдельными операциями, подтверждаются. В результате БД переходит из одного целостного состояния в другое.
□ Неудачно завершена хотя бы одна операция. При этом вся транзакция считается неуспешной, и результаты выполнения всех операций (даже успешно выполненных) отменяются. В результате происходит возврат БД в состояние, в котором она находилась до начала транзакции.
Таким образом, успешная транзакция переводит БД из одного целостного состояния в другое. Использование механизма транзакций необходимо:
□ при выполнении последовательности взаимосвязанных операций с БД;
□ при многопользовательском доступе к БД.
Транзакция может быть неявной или явной. Неявная транзакция стартует автоматически, а по завершении также автоматически подтверждается или отменяется. Явной транзакцией управляет программист с использованием компонента Database и/или средств SQL.
Часто в транзакцию объединяются операции над несколькими таблицами, когда производятся действия по внесению в разные таблицы взаимосвязанных изменений. Пусть осуществляется перенос записей из одной таблицы в другую. Если запись сначала удаляется из первой таблицы, а затем заносится во вторую таблицу, то при сбое, например из-за перерыва в энергопитании компьютера, возможна ситуация, когда запись уже удалена, но во вторую таблицу не попала. Если запись сначала заносится во вторую таблицу, а потом удаляется из первой таблицы, то при сбое возможна ситуация, когда запись будет находиться в двух таблицах. В обоих случаях имеет место нарушение целостности и непротиворечивости БД.
Для предотвращения подобной ситуации операции удаления записи из одной таблицы и занесения ее в другую таблицу объединяются в одну транзакцию. Выполнение этой транзакции гарантирует, что при любом ее результате целостность БД нарушена не будет.
Еще одним примером, демонстрирующим необходимость применения механизма транзакций, является складской учет товара. При поступлении товара на склад в таблицу движения товара заносится запись с данными о названии, количестве товара и дате его поступления. Затем в таблице склада соответственно количеству поступившего товара увеличивается наличное количество этого товара. При возникновении какой-либо ошибки, связанной с записью наличного
28
Часть I. Основы работы с базами данных
количества товара, новое значение может быть не занесено в соответствующую запись, в результате чего будет нарушена целостность БД, и она будет содержать некорректные значения. Такая ситуация возможна, например, в случае многопользовательского доступа к БД при редактировании этой записи другим приложением. Поэтому в случае невозможности внести изменения в наличное количество товара должно блокироваться и добавление новой записи в таблицу движения товара.
Для реализации механизма транзакций СУБД предоставляют соответствующие средства.
Бизнес-правила
Бизнес-правила представляют собой механизмы управления БД и предназначены для поддержания БД в целостном состоянии, а также для выполнения ряда других действий, например, накапливания статистики работы с БД.
(_____ ЗамечаниеJ
В данном контексте бизнес-правила являются просто правилами управления БД и не имеют отношения к бизнесу как предпринимательству.
В первую очередь бизнес-правила реализуют следующие ограничения БД:
□ задание допустимого диапазона значений;
□ задание значения по умолчанию;
□ требование уникальности значения;
□ запрет пустого значения;
□ ограничения ссылочной целостности.
Бизнес-правила можно реализовывать как на физическом, так и на программном уровнях. В первом случае эти правила (например, ограничения ссылочной целостности для связанных таблиц) задаются при создании таблиц и входят в структуру БД. В дальнейшей работе нельзя нарушить или обойти ограничение, заданное на физическом уровне.
Вместо бизнес-правил, заданных на физическом уровне, или в дополнение к ним можно определить бизнес-правила на программном уровне. Действие этих правил распространяется только на приложение, в котором они реализованы. Для программирования в приложении бизнес-правил используются компоненты и предоставляемые ими средства. Достоинство такого подхода заключается в легкости изменения бизнес-правил и определении правил "своего" приложения. Недостатком является снижение безопасности БД, связанное с тем, что каждое приложение может устанавливать свои правила управления БД. В главе 19, посвященной навигационному способу доступа, приводится пример программирования бизнес-правил в приложении, связанный с каскадным удалением записей связанных таблиц.
Глава 2. Реляционные базы данных и средства работы с ними
29
При работе с удаленными БД в архитектуре "клиент-сервер" бизнес-правила можно реализовывать также на сервере.
Словарь данных
Словарь данных представляет собой совокупность определений БД и атрибутов. Словарь данных позволяет сформировать и сохранить характеристики, которые в дальнейшем можно использовать для описания БД.
Использование словаря данных позволяет:
□ ускорить процесс создания БД;
□ облегчить изменение характеристик БД;
□ придать единообразный вид визуальным компонентам приложения.
Определение БД является специализированной БД, которая описывает структуру базы, но не содержит данных. Это описание структуры можно использовать для создания других БД.
Атрибуты представляют собой совокупности характеристик отдельных полей. Заданные через атрибуты характеристики поля при выполнении приложения устанавливаются в качестве значений соответствующих свойств визуальных компонентов, которые отображают значения поля, например, DBGrid или DBText. Приведем некоторые наиболее распространенные характеристики полей (они же свойства визуальных компонентов):
□ Alignment — выравнивание;
□ DisplayLabel — заголовок столбца (сетки DBGrid);
□ Readonly — недоступность поля для редактирования (поле предназначено только для чтения);
□ Required — требование обязательного ввода значения;
□ visible — видимость;
□ DispiayFormat — формат отображаемого значения;
□ Minvalue — минимальное значение;
□ Maxvalue — максимальное значение.
Для работы со словарем данных удобно использовать программу SQL Explorer.
Таблицы форматов dBase и Paradox
Delphi не имеет своего формата таблиц, но поддерживает как собственные два типа локальных таблиц — dBase и Paradox. Каждая из этих таблиц имеет свои особенности.
Таблицы dBase являются одним из первых появившихся форматов таблиц для персональных компьютеров и поддерживаются многими системами, которые связаны с разработкой и обслуживанием приложений, работающих с БД.
30
Часть I. Основы работы с базами данных
Основные достоинства таблиц dBase:
□ простота использования;
□ совместимость с большим числом приложений.
В табл. 2.1 содержится список типов полей таблиц dBase IV. Для каждого типа приводится символ, используемый для его обозначения в программе Database Desktop (это программа создания и редактирования таблиц, SQL-запросов и запросов QBE), а также описание значений, которые может содержать поле рассматриваемого типа.
Таблица 2.1. Типы полей таблиц dBase IV
Замечание
J
При работе с таблицей в среде программы Database Desktop значения полей типа
Binary, Memo и ole не отображаются.
Таблицы dBase являются достаточно простыми и используют для своего хранения на дисках относительно мало физических файлов. По расширению файлов можно определить, какие данные они содержат.
□ dbf — таблица с данными.
□ dbt — данные больших двоичных объектов, или BLOB-данные (Binary Large OBject). К ним относятся двоичные, Memo- и OLE-поля. Memo-поле также называют полем комментариев.
Глава 2. Реляционные базы данных и средства работы с ними
31
П mdx — поддерживаемые индексы.
□ ndx — индексы, непосредственно не поддерживаемые форматом dBase. При
использовании таких индексов программист должен обрабатывать их само
стоятельно.
Имя поля в таблице dBase должно состоять из букв и цифр и начинаться с буквы. Максимальная длина имени составляет 10 символов. В имена нельзя включать специальные символы и пробел.
К недостаткам таблиц dBase относится то, что они не поддерживают автоматическое использование парольной защиты и контроль целостности связей, поэтому программист должен кодировать эти действия самостоятельно.
Таблицы Paradox являются достаточно развитыми и удобными для создания БД. Можно отметить следующие их достоинства:
□ большое количество типов полей для представления данных различных типов;
□ поддержка целостности данных;
□ организация проверки вводимых данных;
□ поддержка парольной защиты таблиц.
Большой набор типов полей позволяет гибко выбирать тип для точного представления данных, хранимых в базе. Например, для представления числовой информации можно использовать один из пяти числовых типов. В табл. 2.2 содержится список типов полей для таблиц Paradox 7. Для каждого типа приводятся символ, используемый для обозначения этого типа в программе Database Desktop, и описание значений, которые может содержать поле рассматриваемого типа.
Таблица 2.2. Типы полей таблиц в Paradox 7
Тип Обозначение Описание значения
Alpha А Строка символов. Длина не более 255 символов
Number N Число с плавающей точкой. Диапазон -10307... 10308.
Точность 15 цифр мантиссы
Money $ Денежная сумма. Отличается от типа Number тем,
что в значении отображается денежный знак. Обозначение денежного знака зависит от установок Windows
Целое число. Диапазон -32 768... 32 767
Целое число. Диапазон —2 147 483 648... 2 147 483 647
Число в двоично-десятичном формате
Дата. Диапазон 01.01.9999 до н. э.... 31.12.9999
Время
32
Часть I. Основы работы с базами данных
Таблица 2.2 (окончание)
J |
Замечание
При работе с таблицей в среде программы Database Desktop значения полей типа
Graphic, Binary, Memo и OLE не отображаются.
Имя поля в таблице Paradox должно состоять из букв (допускается кириллица) и цифр и начинаться с буквы. Максимальная длина имени составляет 25 символов. В имени можно использовать такие символы, как пробел, #, $ и некоторые другие. Не рекомендуется использовать символы.,! и |, т. к. они зарезервированы в Delphi для других целей.
При задании ключевых полей они должны быть первыми в структуре таблицы.
Глава 2. Реляционные базы данных и средства работы с ними
33
(_____ ЗамечаниеJ
Если требуется обеспечить перенос или совместимость данных из таблиц Paradox с таблицами других форматов, желательно выбирать имя поля длиной не более 10 символов и составлять его из латинских букв и цифр.
Поддержка концепции целостности данных обеспечивает правильность ссылок между таблицами. Например, если в БД имеются таблицы клиентов и заказов, то эти таблицы могут быть связаны следующим образом: каждая запись таблицы заказов ссылается через индексное поле на запись в таблице клиентов, соответствующую сделавшему заказ клиенту. Если в таблице клиентов любым способом удалить запись с информацией о каком-либо клиенте, то BDE автоматически удалит все записи, соответствующие этому клиенту, и из таблицы заказов. Подобное удаление взаимосвязанных записей называют каскадным.
Для полей можно определить специальный диапазон, в котором должны находиться вводимые в них значения. Кроме того, для каждого поля можно определить минимальное и максимальное допустимые значения. При попытке ввода в поле значения, выходящего за допустимые границы, возникает исключение, значение не вводится и содержимое поля не изменяется. Например, для поля Salary (оклад) в качестве минимального значения логично указать ноль, тем самым в это поле запрещается вводить отрицательные значения. Максимальное значение поля Salary зависит от организации, страны и от других факторов.
Наряду с диапазоном допустимых значений для каждого поля можно задать значение по умолчанию, которое автоматически заносится в поле при добавлении к таблице новой записи.
При работе с конфиденциальной информацией может потребоваться защита таблиц и их полей. Для каждой таблицы Paradox следует указать основной пароль, который используется при изменениях во всей таблице, связанных со сменой структуры или с редактированием данных в любом поле. Возможно также задание дополнительного пароля, позволяющего ограничить доступ к конкретному полю или группе полей таблицы, а также набора операций, применимых к таблице (например, разрешения только на чтение записей таблицы без возможности их модификации). После установки паролей они будут автоматически запрашиваться и контролироваться при любой попытке доступа к таблице.
Определенным недостатком таблиц Paradox является наличие относительно большого количества типов файлов, требуемых для хранения содержащихся в таблице данных. При копировании или перемещении какой-либо таблицы из одного каталога в другой необходимо обеспечить копирование или перемещение всех файлов, относящихся к этой таблице. Файлы таблиц Paradox имеют следующие расширения:
□ db — таблица с данными;
□ mb — BLOB-данные;
□ рх — главный индекс (ключ);
□ xg* и yg* — вторичные индексы;
Часть I. Основы работы с базами данных
П val — параметры для проверки данных и целостности ссылок;
□ tv и fam — форматы вывода таблицы в программе Database Desktop.
(Замечание^
Указанные файлы создаются только если в них есть необходимость; конкретная таблица может не иметь всех приведенных файлов.
Кроме названных файлов, при работе в сети для управления доступом к таблицам Paradox используются файлы с расширением net.
Средства для работы
с реляционными базами данных
Хотя система Delphi не имеет своего формата таблиц БД, она тем не менее обеспечивает мощную поддержку большого количества различных СУБД — как локальных (например, dBase или Paradox), так и промышленных (например, Sybase или InterBase). Средства Delphi, предназначенные для работы с БД, можно разделить на два вида:
□ инструменты □ компоненты
К инструментам относятся специальные программы и пакеты, обеспечивающие обслуживание БД вне разрабатываемых приложений.
Компоненты предназначены для создания приложений, осуществляющих операции с БД.
Напомним, что в Delphi имеется окно Обозревателя дерева объектов, которое отображает иерархическую структуру объектов текущей формы. При разработке приложений баз данных это окно удобно использовать для просмотра структуры базы данных и изменения связей между компонентами. Кроме того, в окне Редактора кода имеется вкладка Diagram, служащая для отображения и настройки взаимосвязей между элементами баз данных.
Инструменты
Для операций с БД система Delphi предлагает следующий набор инструментов.
□ Borland Database Engine (BDE) — процессор баз данных, который представляет собой набор динамических библиотек и драйверов, предназначенных для организации доступа к БД из Delphi-приложений. BDE является центральным звеном при организации доступа к данным.
□ BDE Administrator — утилита для настройки различных параметров BDE, настройки драйверов баз данных, создания и удаления драйверов ODBC, создания и обслуживания псевдонимов.
□ Database Desktop — программа создания и редактирования таблиц, SQL-запросов и запросов QBE.
□ SQL Explorer — Проводник БД, позволяющий просматривать и редактировать БД и словари данных.
Глава 2. Реляционные базы данных и средства работы с ними
35
П SQL Builder — программа визуального конструирования SQL-запросов.
□ SQL Monitor — программа отслеживания порядка выполнения SQL-запросов
к удаленным БД.
□ Data Pump — программа для переноса данных (схемы базы данных и содержимого) между БД.
□ IBConsole — программа для управления удаленными БД.
□ InterBase Server Manager — программа для запуска сервера InterBase.
□ SQL Links — драйверы для доступа к удаленным промышленным СУБД, таким как Microsoft SQL Server или Oracle. К промышленному серверу InterBase, поставляемому с Delphi, доступ также можно организовать напрямую через BDE, не используя драйвер SQL Links. В Delphi 7 вместо SQL Links для доступа к базам данных SQL Server рекомендуется использовать dbExpress.
□ dbExpress — набор драйверов для доступа к базам данных SQL с помощью таких компонентов, как SQLConnection, SQLDataSet, SQLQuery, SQLStoredProc и SQLTable. dbExpress включает в свой состав следующие драйверы:
• InterBase (файл dbexpint.dll);
• DB2 (файл dbexpdb2.dll);
• Oracle (файл dbexpora.dll);
• MSSQL (файл dbexpmss.dll);
• MySQL (файл dbexpmys.dll).
□ InterBase Server — клиентская и серверная части сервера InterBase.
Одни инструменты, например, BDE Administrator и SQL Explorer, можно использовать для работы с локальными и удаленными БД, другие, например, IBConsole, — для работы с удаленными БД.
Компоненты
Рассмотрим компоненты, используемые для создания приложений БД. Кроме компонентов, Delphi предоставляет разработчику специальные объекты, например, объекты типа Field. Как и другие элементы управления Delphi, связанные с БД компоненты делятся на визуальные и невизуальные.
Невизуальные компоненты предназначены для организации доступа к данным, содержащимся в таблицах. Они представляют собой промежуточное звено между данными таблиц БД и визуальными компонентами.
Визуальные компоненты используются для создания интерфейсной части приложения. С их помощью пользователь может выполнять такие операции с таблицами БД, как просмотр или редактирование данных. Визуальные компоненты также называют элементами, чувствительными к данным.
36
Часть I. Основы работы с базами данных
Компоненты, используемые для работы с БД, находятся на страницах Data Access, Data Controls, dbExpress, DataSnap, BDE, ADO, InterBase, Decision Cube, Rave и InterBase Admin Палитры компонентов. Некоторые компоненты предназначены специально для работы с удаленными БД в архитектуре "клиент-сервер". Отметим, что в Палитре компонентов Delphi 7 появились новые страницы и по сравнению с предыдущими версиями изменилось распределение компонентов, используемых для работы с БД, по страницам. В частности, вместо страницы QReport появилась страница Rave.