WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     || 2 | 3 | 4 | 5 |   ...   | 8 |
-- [ Страница 1 ] --

Андрей Сорокин DELPHI РАЗРАБОТКА БАЗ ДАННЫХ Москва • Санкт-Петербург • Нижний Новгород • Воронеж Ростов-на-Дону • Екатеринбург • Самара • Новосибирск Киев • Харьков • Минск

2005 ББК 32.973.233-018 УДК 004.65 С65 Сорокин А. В.

С65 Delphi. Разработка баз данных. — СПб.: Питер, 2005. — 477 с : ил.

ISBN 5-469-00927-0 Разработка приложений баз данных является одной из наиболее востребованных возмож ностей среды программирования Delphi. Эта среда программирования предоставляет разработчику поистине великолепный набор простых в использовании инструментов, позволяющих быстро раз рабатывать сложные проекты.

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

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

ББК 32.973.233- УДК 004. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.

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

ISBN 5-469-00927-0 © ЗАО Издательский дом «Питер», Краткое содержание Введение Урок 1. Введение в базы данных Урок 2. Архитектура приложений баз данных Урок 3. Технологии доступа к данным Урок 4. Основы технологии С М О Урок 5. Технология DataSnap Урок б. Введение в язык SQL Урок 7. СУБД M Access S Урок 8. Сервер InterBase Урок 9. Сервер M SQL Server S Список литературы Алфавитный указатель Содержание Введение От издательства, УРОК 1. Введение в базы данных Терминология Первичные ключи и индексы Реляционные отношения между таблицами Ссылочная целостность Понятие транзакции Параллельная обработка транзакций Блокировка ресурсов Сериализуемые транзакции и виды блокировок Уровень изоляции транзакции Курсор.у Хранимые процедуры Понятие триггера Представление Модели данных Иерархическая модель Сетевая модель Реляционная модель Объектно-ориентированная модель Нормализация таблиц при проектировании баз данных Первая нормальная форма Вторая нормальная форма. Третья нормальная форма Пользователи и роли Системный каталог УРОК 2. Архитектура приложений баз данных Общая структура приложения баз данных Модуль данных Содержание Подключение данных Компонент TDataSource Набор данных Навигация по набору данных Редактирование набора данных Поиск записей и фильтрация в наборах данных Состояния набора данных Работа с полями Использование объектов-полей Статические и динамические поля Типы и виды полей Стандартные компоненты, связываемые с набором данных УРОК 3. Технологии доступа к данным BE D Создание псевдонима базы данных Создание таблиц базы данных Определение индексов и ссылочной целостности Разработка простого приложения БД Настройка BDE Компонент TDatabase Компонент TSession Компонент TStoredProc Компонент TUpdateSQL Компонент TBatchMove Пример связи с Excel через BDE Пример связи с Access через BDE Пример связи с InterBase через BDE Стандарт ODBC Архитектура ODBC Уровни соответствия Определение имен источников данных OLE DB Основные конструкции OLE DB Стандартные провайдеры OLE DB ADO Основы ADO Компонент TADOConnection Механизм соединения с хранилищем данных ADO Класс TCustomADODataSet Компонент TADODataSet Компонент TADOTable Компонент TADOQuery Компонент TADOStoredProc Пример связи с Access через ADO Пример связи с SQL Server 2000 через ADO Ill 8 Содержание dbExpress Интерфейсы dbExpress Компонент TSQLConnection Соединение с сервером баз данных Класс TCustomSQLDataSet Компонент TSQLDataSet Компонент TSQLTable Компонент TSQLQuery Компонент TSimpleDataSet Компонент TSQLStoredProc Компонент TSQLMonitor Пример работы с InterBase Пример работы с SQL Server 2000 УРОК 4. Основы технологии СОМ ш Базовые понятия Объект Интерфейс Интерфейс IUnknown Сервер СОМ Фабрика класса Библиотека типов СОМ и потоки выполнения Реализация СОМ в Delphi Класс TComObject Класс TTypedComObject Интерфейс IUnknown Класс TComObjectFactory Класс TTypedComObjectFactory Класс TComGassManager Класс TComServer Создание внутреннего сервера СОМ и работа с ним Создание локального сервера СОМ и работа с ним Автоматизация Интерфейс IDispatch Интерфейсы диспетчеризации и дуальные интерфейсы Класс TAutoObject Класс TAutoObjectFactory TAutoIntfObject Сервер автоматизации и пример его реализации Контроллер автоматизации и пример его реализации..

• УРОК 5. Технология DataSnap Технология DataSnap Сервер приложения Клиентское приложение Компонент TDCOMConnection Содержание Компонент TSocketConnection Компонент TSimpleObjectBroker Компонент TConnectionBroker Компонент TLocalConnection Компонент TSharedConnection Сервер приложения Интерфейс IAppServer Удаленный модуль данных Провайдеры данных Пример разработки сервера приложения Клиентское приложение Компонент TClientDataSet Обработка ошибок сохранения данных Пример разработки клиентского приложения с использованием DCOM.. Пример разработки клиентского приложения с использованием сокетов.. УРОК б. Введение в язык SQL Типы данных Запросы к отдельным таблицам Использование выражения SELECT Выборка по условию Исключение повторяющихся значений Вычисляемые поля Операторы сравнения и логические операторы Использование оператора IN Использование оператора BETWEEN Использование оператора LIKE Агрегатные функции Упорядочивание записей Многотабличные запросы Объединение таблиц Вложенные подзапросы Использование оператора EXISTS Использование объединения UNION Модификация данных Использование оператора INSERT Использование оператора UPDATE Использование DELETE Другие операторы SQL Работа с представлениями Создание и удаление таблиц баз данных Создание и удаление индексов УРОК 7. СУБД MS Access Типы данных Создание базы данных 10 Содержание Создание таблиц Определение ссылочной целостности Администрирование базы данных Управление рабочими группами и распределение прав Сжатие и восстановление файлов Access Репликация базы данных Работа с базой данных из Delphi УРОК 8. Сервер InterBase Установка InterBase Связь с сервером и соединение с базой данных Создание базы данных Страницы базы данных Размер страницы базы данных Диалект базы данных Типы данных Компоненты InterBase eXpress Компонент TIBDataBase Компонент TIBTransaction Класс TIBCustomDataSet Компонент TIBDataSet Компонент TIBSQL Компонент ПВТаЫе Компонент TIBQuery Компонент TIBUpdateSQL Компонент TIBStoredProc Компонент TIBDatabaselnfo Компонент TIBSQLMonitor Компонент TIBEvents Сервисные компоненты InterBase eXpress Класс TIBCustomService Компонент TIBConfigService Компонент TIBBackupService Компонент TIBRestoreService Компонент TIBValidationService Компонент TIBStatisticalService Компонент TIBLogService Компонент TIBSecurityService Компонент TIBServerProperties Компонент TIBLicensingService Системные таблицы, временные таблицы и системные представления InterBase Системные таблицы InterBase Временные таблицы Системные представления InterBase.Содержание Логика приложения Работа с доменами Работа с таблицами Использование внешних наборов данных.. Работа с индексами Работа с представлениями Работа с хранимыми процедурами Работа с триггерами Работа с исключениями Работа с генераторами Администрирование сервера Создание ролей, учетных записей и определение прав на объекты Сборка «мусора» Работа с механизмом Shadowing Резервное копирование базы данных Восстановление базы данных УРОК 9. Сервер MS SQL Server 2000 Установка SQL Server 2000 Архитектура SQL Server 2000 Сетевые библиотеки Серверные сетевые библиотеки Клиентские сетевые библиотеки Типы данных SQL Server 2000 Соединение с сервером Создание базы данных Работа с группами файлов Регистрация базы данных,. Удаление баз данных Работа с таблицами базы данных Создание, изменение и удаление таблиц баз данных Отношения ссылочной целостности Индексы Включение таблиц баз данных в группы файлов Хранимые процедуры Пользовательские функции Триггеры Обработка ошибок Представления Администрирование сервера Резервное копирование и восстановление Работа с ролями и учетными записями Определение прав на работу с объектами базы данных Список литературы Алфавитный указатель Введение Любая организация нуждается в своевременном доступе к информации. Цен ность информации в современном мире очень высока. Роль распорядителей информации в современном мире чаще всего выполняют базы данных. Базы данных обеспечивают надежное хранение информации, структурированном виде и своевременный доступ к ней. Практически любая современная орга низация нуждается в базе данных, удовлетворяющей те или иные потребнос ти по хранению, управлению и администрированию данных.

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

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

К сожалению, на рынке ощущается недостаток литературы для начинающих по данной теме. Аспекты разработки распределенных приложений затрагива ются в отдельных главах, но.не являются ключевыми. Задача книги заключа ется в том, чтобы максимально просто объяснить, как разрабатывать распре деленные СУБД, излагая максимум сопутствующего материала.

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

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

От издательства Задача разработчика — написать стабильную систему управления БД. Грамот но настроить сервер БД, чтобы свести к минимуму возможные потери данных.

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

Благодарности Благодарю Моих Родителей, мою любимую — Таню, тётю Люду, чету Тойчей, Владимира Владимировича Шахиджаняна (автора книги «СОЛО на клавиа туре»), Серёгу (Serg999), Бабушку, Бориса Борисовича, Игоря Шапошнико ва (моего редактора) и еще тех немногих, кто мне помогал, и тех, кто мне мешал.

Спасибо вам всем.

От издательства Ваши замечания, предложения и вопросы отправляйте по адресу электрон ной почты comp@piter.com (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

Все исходные тексты, приведенные в книге, вы можете найти по адресу http:

//www.piter.com/download.

Подробную информацию о наших книгах вы найдете на веб-сайте издатель ства: http://www.piter.com.

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

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

Терминология В базе данные хранятся в табличном виде. Таблица представляет собой двух мерный массив, состоящий из набора строк и столбцов. Каждая строка пред ставляет собой единицу хранения информации — запись. Каждая запись со держит поля данных, которые и являются столбцами таблицы. Поле данных является атрибутом записи. Базы данных, между отдельными таблицами которых существуют связи, называются реляционными. В табл. 1.1 приведен пример простой таблицы БД.

Каждое поле имеет свой заголовок. В примере это «Наименование CD», «Ко личество», «Дата поступления». Также каждое поле имеет свой тип данных.

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

1Ь Терминология Таблица 1.1. Пример таблицы БД Наименование CD Количество Дата поступления 06.08. CD 1 07.08. CD 2 CD3 07.08. В зависимости от расположения СУБД различают локальные и распределен ные системы. Все компоненты локальной СУБД, то есть сам сервер и таб лицы с данными, расположены на машине конечного пользователя. В слу чае распределенной системы на машине конечного пользователя располага ется только клиентская программа, которая взаимодействует с сервером БД по сети. Базы данных могут иметь многозвенную архитектуру. Чаще всего встречаются двух- и трехзвенные СУБД. На рис. 1.1 показана схема двух звенной СУБД.

Клиент 1 Клиент 2 Клиент Рис. 1.1. Схема двухзвенной СУБД При использовании двухзвенной системы происходит непосредственное вза имодействие клиентского приложения с сервером БД. На рис. 1.2 показана схема трехзвенной СУБД.

При использовании трехзвенной СУБД клиентское приложение взаимодей ствует с промежуточной программой — сервером приложения. Сервер прило жения осуществляет обмен данными с сервером БД, получает от него данные, обрабатывает их и передает клиенту. Таким образом, вся вычислительная на грузка ложиться на сервер приложения, а клиент становиться очень «легким», так как получает только запрошенные данные. Примером легкого клиента может служить интернет-браузер. При работе с веб-приложениями пользова тель выбирает ссылку в браузере и получает связанный с ней документ.

Распределенные СУБД в общем случае могут быть как двухзвенными, так и трехзвенными.

Урок 1. Введение в базы данных Клиент 1 Клиент 2 Клиент Рис. 1.2. Схема трехзвенной СУБД Первичные ключи и индексы Каждая запись таблицы должна иметь уникальный объект (поле, группу по лей), который однозначно определял бы ее. Такой объект называется первич ным ключом. Когда ключ состоит из одного поля, его называют простым. Со ставной ключ состоит из нескольких полей. Поля, из которых составляется ключ, называются ключевыми. В таблице можно определить только один ключ.

В соответствии с ним будут производиться сортировка и сохранение данных.

Для примера, в табл. 1.1 можно определить поле «Наименование CD» как ключевое. Соответственно, упорядочивание строк будет производиться по этому полю.

Ключ обеспечивает:

О однозначную идентификацию данных таблицы;

О предотвращение повторения значений ключа (контроль за выполнением этого условия осуществляет сервер БД);

О ускорение выполнения запросов к БД;

О использование ограничений ссылочной целостности.

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

Первичные ключи и индексы Таблица 1.2. «Слепок» накладной на доставку товаров Заказанный товар Количество Предприятие Телефон Микроконтроллер 2 Какое-то НИИ 455-333- Датчик уровня 10 Другое НИИ 112-789- Микроконтроллер 5 Третье НИИ 587-982- Физически ключ является системной таблицей (каждый сервер БД имеет свой формат таблицы и по-своему работает с ней), в которой в определенном по рядке хранятся значения, составляющие ключ. Для каждого значения ключа имеется уникальная ссылка, указывающая на расположение соответствующей записи в таблице БД. При запросе сервер производит поиск по значению клю чевого поля и, таким образом, быстро получает нужные данные. Таблица, в ко торой содержаться значения ключа, может располагаться как в отдельном файле, так и вместе с самой базой данных. Например, в БД Paradox значения ключа содержаться в одноименном файле с расширением *.рх*, а сервер MS SQL 2000 хранит значения ключа в том же файле, где располагается сама БД.

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

В связи с этим к построению ключей предъявляются определенные требова ния:

О Ключ должен быть уникальным.

О Ключ должен быть достаточным и неизбыточным.

О Ключ не должен содержать поля неоднозначного содержания.

В качестве ключевого поля удобно использовать автоинкрементное поле, ко торое автоматические увеличивает максимальное значение числа при вводе новой записи. Данный тип поля поддерживается многими серверами БД, та кими как, например, Access или SQL Server 2000. В иных случаях разработ чик обязан сам предусмотреть реализацию данного механизма. Реализовать его легко, достаточно лишь создать триггер с соответствующим содержанием.

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

Значения индекса, так же как и значения ключа, содержатся в системных таб лицах.

Урок 1. Введение в базы данных Индекс Таблица БД № Поле А Поле С Поле В АА 12.04. ВВ 08.06. СС 05.11. DD 25.02. ЕЕ 18.11. Рис. 1.3. Использование индекса На рис. 1.3 приведен обобщенный пример взаимодействия индекса с табли цей БД. Как было сказано ранее, индекс содержит в себе упорядоченные зна чения одного или нескольких полей. Также он содержит ссылки на записи, расположенные в таблице. При осуществлении поиска по индексированному полю сервер БД быстро находит нужный элемент, если он существует, полу чает ссылку на него и сразу переходит к нему в базе и возвращает данные клиентскому приложению. В приведенном примере есть таблица, состоящая из трех полей: А, В, С. Как можно заметить, поля в таблице А не упорядоче ны. Однако в индексе, созданном по этому полю, данные хранятся в отсорти рованном виде. При осуществлении операций с данными сервер БД проверя ет, индексировано ли поле, по которому производится запрос. Если поле ин дексировано, сервер БД осуществляет быстрый поиск по индексу. По такому же принципу осуществляется работа с ключом.

Но во всем важно знать меру. Можно индексировать всю таблицу и получить медленно работающую БД гигантского размера. При создании индекса важно продумать, по каким полям чаще всего будет вестись поиск. Грамотно создан ный индекс существенно увеличивает производительность БД. Но необходи мо помнить о балансе. Индексировать нужно лишь те поля, по которым будет чаще всего производиться поиск., Реляционные отношения между таблицами В частном случае БД может состоять из одной таблицы. Но чаще всего реля ционная БД состоит из нескольких взаимосвязанных таблиц. Организация связи между таблицами называется связыванием. Связи между таблицами можно устанавливать как на этапе разработки БД, так и при разработке при ложения. Связывать можно одну или несколько таблиц. Для связывания таб лиц используются соответствующие поля связи. Поле связи — особое поле таблицы, которое однозначно идентифицирует запись. В подчиненной табли це для связи с главной также используется особый набор полей, называемый внешним ключом. Поле связи и первичный ключ должны быть индексирова Реляционные отношения между таблицами ны, так как это ускоряет доступ к связанным записям. В общем случае поле связи и внешний ключ представляют собой индексы.

Название города Код города Поле связи Екатеринбург ХХХХ Санкт-Петербург ХХХХ 2 N Воронеж ХХХХ Длительность Абонент Внешний ключ разговора Алексеев 3 мин Костин 5 мин Рис. 1.4. Пример связи между таблицами В качестве примера на рис. 1.4 приведены данные о длительности разговоров абонентов телефонной сети. «Поле связи» главной таблицы содержит некое значение. С этим значением связано поле подчиненной таблицы «внешний ключ», которое указывает на двух абонентов с фамилиями Алексеев и Кос тин. Использование поля связи позволяет получить данные о разговорах тех абонентов, которые звонили в Екатеринбург. В качестве поля связи можно было использовать поле «Код города», поскольку оно является уникальным.

Связь между таблицами определяет отношение подчиненности, при котором одна таблица является главной, другая подчиненной. Главная таблица обыч но называется Master, подчиненная — Detail.

Различают следующие разновидности связи:

О отношение «один-к-одному»;

О отношение «один-ко-многим»;

О отношение «многие-к-одному»;

О отношение «многие-ко-многим».

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

Урок 1. Введение в базы данных Таблица «Студенты» Таблица «Сдача зачетов» Группа № Оценка ФИО № Дата 1 • Иванов И. А. ОПИ-99-2 24.12.2004 Кузнецов А. Г.

2 • АГП-00-1 2 18.05.2004 Перминов И. В. ИТР-01- 3 3 15.06.2003 Рис. 1.5. Связь «один-к-одному» Отношение «один-ко-многим» подразумевает, что одной записи главной таб лицы может соответствовать несколько записей в одной или нескольких под чиненных таблицах. Этот вид отношения встречается наиболее часто.

Таблица «Студенты» Таблица «Сдача зачетов» Предмет Группа Оценка № № Дата ФИО 24.12. 1 Иванов И. А. ОПИ-99-2 г • 1 Химия Кузнецов А. Г. 18.05. 2 АГП-00-1 2 Физика V Перминов И. В. ИТР-01-2 3 15.06.2003 3 Математика \ т 2 18.05.2003 Математика 3 15.06.2003 Математика Рис. 1.6. Связь «один-ко-многим» Таблица «Отпуск товаров со склада» Таблица «Покупатель» кол-во Код Код Адрес Товар ФИО покупателя ед. покупателя Макароны 1А Иванов И. А. XXX 2000 1А Минеральная Кузнецов А. Г. XXX 2С 1000 2С вода Перминов И. В.

Консервы 1А XXX 2000 1А Макароны 5000 2С Сок томатный 550 2С 300 1В Рожки / Сок томатный 150 1А Рис. 1.7. Связь «многие-ко-многим» Различают две разновидности связи «один-ко-многим». В первом случае для каждой записи главной таблицы должны существовать записи в подчинен ной. Во втором — наличие записей в подчиненной таблице необязательно.

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

Отношение «многие-ко-многим» имеет место, когда одной записи главной таб лицы соответствует несколько записей подчиненной, а одной записи из под чиненной таблицы может соответствовать несколько записей из главной.

Как видно из рис. 1.7, один вид товара могут купить несколько покупателей, в то же время один покупатель может купить несколько товаров.

Несмотря на то что многие СУБД не поддерживают данный вид отношения, его можно реализовать неявным способом, если возникнет такая необходи мость.

Ссылочная целостность На рис. 1.8 представлена таблица, находящаяся в отношении «один-ко-мно гим». Связь производиться по полю «Номер».

Таблица «Покупатель» Таблица «Проданные картины» Номер Художник Цена Номер Дата ФИО Название Юров В. А.

1 1200 11.10. Иванов А. Г. Облака Комаров А. Я. Лес 09.06. Илюшин Ж. Е. 2 Коровьев Ф. Н. Мороз Ильин С. В. 5600 07.04. \ Шторм Юров В. А. 12000 11.12.2004 \ Егоров М. Е. 0,98 18.07.2004 Сияние Рис. 1.8. Связанные таблицы Потеря связей между записями может произойти в нескольких случаях:

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

О Если будет изменено значение поля (полей) связи в дочерней таблице без изменения соответствующего значения в родительской таблице.

Рассмотрим простой случай. Неожиданно у одного из клиентов картинной галереи сменился личный номер. Таким образом, в таблице «Покупатель» у Иванова оказался номер 11.

Так как у Иванова А. Г. номер 11, а заказанные им товары находятся под но мером 1, то налицо нарушение целостности и достоверности данных. В новом, измененном варианте, Иванов ничего не заказал, а в таблице «Проданные картины» появились «бесхозные данные».

Рассмотрим второй вариант, изображенный на рис. 1.10. Данные в поле «Но мер» были изменены на другие. Таким образом, в полях, имеющих прежнее Урок 1. Введение в базы данных значение «1», данные стали иметь значение «6». В этой ситуации тоже теря ются нужные данные.

Таблица «Покупатель» Таблица «Проданные картины» Номер Художник Цена Дата Номер ФИО Название Юров В. А.

Иванов А. Г. 11 Облака 1200 11.10.2004 Комаров А. Я. Илюшин Ж. Е. 2 Лес 09.06. w Коровьев Ф. Н. Мороз Ильин С. В. 07.04. 3 5600 Юров В. А.

Шторм 11.12. 12000 Егоров М. Е. 0,98 18.07.2004 Сияние Рис. 1.9. Нарушение целостности БД Таблица «Покупатель» Таблица «Проданные картины» Художник Номер Цена Дата Номер ФИО Название Юров В. А. 11.10. 1 Облака 1200 Иванов А. Г.

Комаров А. Я. 09.06. Илюшин Ж. Е. 2 Лес 2000 Коровьев Ф. Н. Мороз 07.04. Ильин С. В. 5600 Шторм Юров В. А. 11.12. 12000 \ Егоров М. Е. 0,98 18.07. Сияние Рис. 1.10. Нарушение целостности БД из дочерней таблицы В обоих примерах имело место нарушение целостности БД, то есть информа ция, хранящаяся в БД, стала недостоверной из-за искажения связей.

Нарушение ссылочной целостности может возникнуть в нескольких случаях:

О удаление записи из главной таблицы, без удаления связанных записей в до черней таблице;

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

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

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

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

О При удалении записи в родительской таблице обязательно следует удалить все связанные записи.

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

Понятие транзакции Транзакция — это последовательность действий с базой данных, в которой либо все действия выполняются успешно, либо не выполняется ни одно из них.

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

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

О Увеличить количество единиц товара на складе.

О Ввести дату поступления новой партии.

О Ввести номер площадки, где будет храниться новая партия товара.

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

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

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

Параллельная обработка транзакций Когда несколько транзакций в одно и то же время работают с базой данных, такие транзакции называются параллельными транзакциями. За работой тран закций следит объект сервера БД, который условно можно назвать «менед жер обработки транзакций». Схематично он изображен на рис. 1.11. Несколь ко транзакций отправляют свои запросы данному менеджеру. Он в определен ной последовательности, зависящей от сервера, выбирает транзакцию из списка и обрабатывает ее.

При параллельной обработке часто возникает ситуация, когда несколько тран закций обращаются к одной записи или к одному блоку записей и вносят в них 24 Урок 1. Введение в базы данных изменения, не дождавшись освобождения ресурсов. Таким образом, получа ется, что транзакция, часть которой была выполнена, изменила блок данных и была «временно приостановлена», а другая транзакция, стоящая следующей в очереди менеджера обработки транзакций, также обратилась к этому блоку записей и также изменила его. Когда первая транзакция снова обратилась к данному блоку записей, он уже был изменен, и она продолжила работать уже с измененными данными. Одно из средств борьбы, против несогласованное тей, вызванных параллельной обработкой транзакций, называется блокиров кой ресурсов.

Клиент Клиент 1 Клиент Менеджер обработки транзакций Рис. 1.11. Схематичный пример работы нескольких транзакций с БД Блокировка ресурсов Один из способов предотвратить проблемы при параллельной обработке — запретить совместное использование ресурсов путем блокировки данных, которые считываются для обновления. В этом случае, если блок записей или одна запись «заняты» какой-либо транзакцией, то другая транзакция не смо жет их изменить.

Блокировки могут налагаться либо автоматически, по требованию СУБД, либо по запросу пользователя. Некоторые СУБД предусматривают блокировку ресурсов на уровне строк, другие — на уровне страницы, третьи — на уровне таблицы, четвертые — на уровне всей базы данных. Размер блокируемого ресурса называется глубиной детализации. В данном случае действует простое правило — чем глубже детализация, тем медленнее идет работа. При блоки ровке на уровне строк и большой «пользовательской нагрузке» СУБД может работать очень медленно, так как на блокировку будут производиться очень Понятие транзакции большие затраты ресурсов и времени. Наиболее часто применяется постра ничная блокировка данных. При блокировке на уровне таблицы базы данных будут неизбежно возникать простои, особенно в тех случаях, когда пользова тель запрашивает большие объемы данных.

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

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

Существует теорема, что сериализуемость транзакций заведомо гарантирует ся, если блокировки, относящиеся к одновременно выполняемым транзакци ям, удовлетворяют правилу: «Ни одна блокировка от имени какой-либо тран закции не должна устанавливаться, пока не будет снята ранее установленная блокировка». Это правило известно под названием двухфазового блокирова ния. Транзакция сначала устанавливает блокировки, а потом сама же блоки ровки снимает.

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

Для распределенных СУБД те же задачи переносятся на распределенную среду.

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

О выполнение этого множества транзакций сериализуемо на каждом узле;

О упорядочение транзакций на всех узлах одинаково.

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

О централизованный протокол двухфазной блокировки;

О протокол двухфазной блокировки первичной копии;

;

О распределенный протокол двухфазной блокировки;

О протокол блокирования большинства.

При централизованном блокировании для всей распределенной базы данных поддерживается единая таблица блокировок. Эта таблица, располагаемая на 26 Урок 1. Введение в базы данных одном из узлов, находится под управлением единого менеджера блокировок.

Менеджер блокировок отвечает за установку и снятие блокировок от имени всех транзакций. Поскольку управление 28 Урок 1. Введение в базы данных Каждой транзакции приписывается некоторый уровень изоляции: READUN COMMITTED (незавершенное чтение), READCOMMITTED (завершенное чтение), REPEATABLEREAD (воспроизводимое чтение) или SERIALIZABLE (сериализуемость). Уровень изоляции транзакции определяет степень, в ко торой на операции этой транзакции влияют операции параллельно выполня ющихся транзакций и в которой операции данной транзакции влияют на опе рации других транзакций. Уровень изоляции может быть явно установлен оператором SETTRANSACTION. По умолчанию устанавливается уровень изоляции SERIALIZABLE. При выполнении конкурирующих транзакций на этом уровне изоляции гарантируется их сериализуемость.

На рис. 1.12 показаны уровни изоляции транзакции и ошибки, которые мо гут на них возникать. Отсутствие на уровне SERIALIZABLE (сериализуемость) ошибок является следствием того, что такие транзакции являются сериали зуемыми. Чем выше уровень транзакции, тем больше ресурсов требуется для ее обработки. Программист должен найти компромисс «производительность достоверность». Например, уровень READUNCOMMITTED является наибо лее быстродействующим, но в то же время на этом уровне возможны искаже ния данных. Вряд ли имеет смысл ставить уровень SERIALIZABLE на сер вер, с которым работают 2-3 клиента, и вероятность того, что они обратятся к одной записи, весьма мала.

Уровень изоляции Уровень Грязное Невоспроизводимое Фантомное изоляции чтение чтение чтение Незавершенное Возможно Возможно Возможно чтение Завершенное Невозможно Возможно Возможно чтение Воспроизводимое Невозможно Невозможно Возможно чтение Сериализуемость Невозможно Невозможно Невозможно Рис. 1.12. Уровни изоляции транзакции Курсор Курсором называется именованный указатель на блок данных (набор строк).

Обычно курсоры определяются с помощью оператора SELECT:

E E S L B GN D CA E SECTION;

XC Q E I E LR char szLastName[] = "White":

_^ Курсор В данном запросе определяется курсор author_cursor, указывающий на набор полей au_fname, в которых поле au_lname содержит значение White. Такой кур сор называется статическим. Динамический курсор получает значения пара метров в ходе выполнения запроса. Транзакция может открывать несколько курсоров как последовательно, так и одновременно. Так как курсоры занима ют значительное количество памяти, то открытие большого их числа может сильно замедлить работу системы. Один из способов снизить накладные рас ходы — использовать курсоры разного типа, особенно в тех случаях, когда полнофункциональный курсор не требуется. Всего существует четыре типа курсора:

1. Последовательный (forward only cursor).

2. Статический (static cursor).

3. Ключевой (keyset cursor).

4. Динамический (dynamic cursor).

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

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

Ключевой курсор при открытии для каждой строки базы данных сохраняет значение первичного ключа. Когда приложение устанавливает курсор на не которую строку, СУБД по ключу считывает текущее значение этой строки.

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

Данный курсор видит лишь сохраненные обновления и удаления.

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

Курсор может располагаться как на сервере, так и на стороне клиентского приложения.

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

Клиентский курсор обеспечивает передачу базы данных клиенту от сервера целиком. Такой режим работы подходит, если база данных имеет небольшой размер.

30 Урок 1. Введение в базы данных ^т в ь | 6ора типа курсора и места его расположения зависит производительность 1ПРИМЕЧАНИЕ СУБД. В случае многозвенных СУБД часто применяется расположение курсора на стороне сервера. Если курсор располагается на стороне клиента, то ему автомати чески присваивается ключевой курсор.

Хранимые процедуры Хранимая процедура — последовательность команд SQL, хранящаяся на сер вере БД в скомпилированном виде. Хранимые процедуры составляют для часто выполняемых операций. Например, каждый месяц сотрудникам надо пересчи тывать зарплату. Можно создать хранимую процедуру, производящую пере расчет, и таким образом сэкономить время. Хранимая процедура может при нимать параметры и возвращать результаты работы. Когда приложение исполь зует процедуру, оно передает параметры, если они есть, а сервер СУБД затем выполняет хранимую процедуру без повторной компиляции (рис. 1.13).

Параметры Сервер БД хранимой процедуры Хранимые Запрос [ процедуры j« Результат Клиент Рис. 1.13. Выполнение хранимой процедуры Использование хранимых процедур имеет несколько преимуществ с точки зрения производительности:

1. Так как хранимые процедуры уже скомпилированы и записаны, то серверу требуется меньше времени для их выполнения.

2. Снижается нагрузка на сеть, так как передается меньшее число операторов.

Создать хранимую процедуру довольно просто. Следующий фрагмент кода иллюстрирует этот процесс:

C E T P O give_raise A RAE R C S U D T E P OE S S T salary = salary * 1. P AE M L YE E В данном примере создается хранимая процедура give_raise, модифицирующая таблицу EMPLOYEES. Значение поля salary увеличивается на 10%.

Понятие триггера Триггер — хранимая процедура, вызов которой происходит автоматически при выполнении с базой данных определенных действий: удаление, изменение, добавление записей. В зависимости от того, какой оператор модификации данных активизирует триггер, он называется триггером вставки (insert trigger), триггером удаления (delete trigger) или триггером обновления (update trigger).

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

U E pubs S IF EXISTS (SELECT name F O sysobjects RM W E E name = 'reminder' A D type = 'TR') HR N D O TRIGGER reminder RP GO C E T TRIGGER reminder RAE O titles N F R INSERT, UPDATE, D L T O EE E AS E E master.,xp_sendmail 'MaryM', XC 'DorT't forget to print a report for the distributors.' GO В данном примере приведено определение триггера reminder. Он выполняет ся при удалении, добавлении или изменении записи. В теле триггера вызыва ется хранимая процедура xpsendmail, отправляющая некой Мэри М. по элек тронной почте соответствующее напоминание.

Представление Представление является виртуальной таблицей, записи в которую собраны с помощью оператора Sel ect из одной и более таблиц. Работа с представлени ем осуществляется, как с-обычной таблицей:

C E T VE Example A RAE I W S SELECT Fieldl, Field F O EXTABLE RM W E E Field3 = HR SELECT * F O Example RM В приведенном примере создается представление Example, в которое включа ются поля Fieldl и Field2. Выбираются записи, в которых значение поля Field равно трем. Последний оператор вызывает просмотр. Само по себе представ ление не содержит данных, оно их получает каждый раз при вызове.

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

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

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

Для того чтобы представление было модифицируемым, оно должно удовлет ворять списку условий:

О В представлении должны быть собраны записи только из одной таблицы.

О В операторе SELECT не должны использоваться статистические функции, описатель DISTINCT, операнд H VN, а также соединения таблиц.

AI G О Представление не должно содержать полей, которые являлись бы агрегат ными функциями.

О Для команды INSERT представление должно содержать любые поля табли цы, имеющие ограничение N T NULL, если не задано иное ограничение.

O В качестве примера можно взять модифицированное представление Example и показать, как в него добавляются записи при помощи небольшого фрагмен та кода:

INSERT INTO Example V L E (333, 'fds") AU S Модели данных Под моделью базы данных обычно понимаются структура базы и методы ра боты с ней. В общем случае понятиями, на основе которых строится модель, являются объекты и отношения между ними. Подобную модель данных, функ ционирующую на сервере, и можно называть базой данных.

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

Иерархическая модель Иерархическая модель (ИМ) представляется связанным графом типа дере ва. Вершины деревьев располагаются на разных иерархических уровнях.

Иерархическая БД состоит из упорядоченного набора деревьев. Тип дерева в целом представляет собой иерархически организованный набор типов за писей. На иерархическую модель налагается целый список ограничений и правил:

Модели данных О Все тины связей должны быть функциональными (1:1, 1:М, М:1).

О Дерево представляет собой неориентированный граф, не содержащий цик лов.

О Тип дерева состоит из одного «корневого» типа записи и упорядоченного набора из нуля или более типов поддеревьев (каждое из которых является некоторым типом дерева).

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

О Ветвь дерева соответствует типу связи «исходный—порожденный».

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

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

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

На рис. 1.14 приведен пример базы данных с иерархической моделью. База данных имеет два уровня. Узел содержит 2 потомка.

Склад,^-^ ~ Место Грузчики Уровень Товар на складе ^ \ Уровень Промышленный Продовольственный Рис. 1.14. Пример модели иерархической БД У иерархической модели есть и определенные недостатки:

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

О Происходит дублирование данных на логическом уровне.

О Для представления связи M:N необходимо дублирование деревьев.

о В ИМ автоматически поддерживается целостность ссылок между предками и потомками. Никакой потомок не может существовать без своего родите ля. Целостность по ссылкам между записями, не входящими в одну иерар 2 Зак. Урок 1. Введение в базы данных хию, не поддерживается. Поэтому невозможно хранение в БД порожденно го узла без соответствующего исходного. Аналогично, удаление исходного узла влечет удаление всех порожденных узлов (деревьев)г-связанных с ним.

Сетевая модель Сетевой подход к организации данных является расширением иерархическо го. Цель разработчиков заключалась в создании модели, позволяющей опи сывать связи M:N и одновременно в исправлении недостатков иерархической модели. Сетевая модель данных базируется также на использовании представ ления данных в виде графа. С точки зрения теории графов сетевой модели, соответствует произвольный граф. В иерархических структурах запись-пото мок должна иметь только одного предка. В сетевой структуре данных пото мок может иметь любое число предков. На рис. 1.15 представлен схематиче ский вид сетевой модели.

Рис. 1.15. Схематическое изображение сетевой модели Сетевая БД состоит из набора записей и набора связей между этими запися ми. Тип связи определяется для двух типов записей: предка и потомка. Эк земпляр типа связи состоит из одного экземпляра типа записи предка и упо рядоченного набора экземпляров типа записи потомка. Набор — поименован ная совокупность записей, в котором записи одного типа объявляются вла дельцами набора, а записи других типов — членами этого набора.

У сетевой модели есть свои особенности:

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

• каждый экземпляр типа Р является предком только в одном экземпля ре L;

• каждый экземпляр С является потомком не более чем одного экземпля ре L.

О Для представления связи M:N вводятся дополнительный тип записи и две функциональные связи типа 1:М и М:1. При необходимости запись-связ ка может содержать дополнительную информацию.

О Экземпляр записи может быть членом только одного экземпляра набора среди всех экземпляров набора одного типа (он может входить в состав двух и более экземпляров наборов, но разных типов).

Модели данных На рис. 1.16 показана сетевая модель базы данных «Учет товаров на скла де». Она была получена путем преобразования иерархической модели, изоб раженной на 1.15. В базу данных были введены дополнительные записи связки, на рисунке они обозначены эллипсами. Такая структура модели, в отличие от иерархической, позволяет быстро получить те места на скла де (номера боксов), где расположены продовольственные товары.

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

Уровень Уровень Уровень Промышленный Продовольственный Рис. 1.16. Пример модели сетевой БД Реляционная модель Отношение можно представить как двухмерную таблицу. Каждая строка в таб лице содержит данные, относящиеся к некоторой вещи или к ее части. Каж дый столбец описывает какой-либо атрибут этой вещи. Строки отношения называются сущностями, а столбцы — атрибутами.

Чтобы таблицу можно было считать отношением, она должна удовлетворять определенным требованиям:

О Значения в ячейках должны быть одиночными.

О Все записи в столбце должны быть одного типа.

О Каждый столбец должен иметь уникальное имя.

О В отношении не может быть двух одинаковых строк.

О Порядок строк не имеет значения.

На рис. 1.17 представлено отношение «Товар». Данное отношение содержит в себе сущность «товар». Эта сущность обладает атрибутами «Наименование 36 Урок1. Введение в базы данных товара», «Единица измерения», «Цена, руб.», «Код товара», полностью опи сывающими и характеризующими ее как уникальный объект.

Атрибут 1 • • Атрибут Наименование Единица Цена, Код товара измерения товара руб.

Макароны пачка Сущность 1 25 1А Устрицы кг 600 1Б кг Колбаса 100 1С Сущность 4 булка Хлеб 1Д Рис. 1.17. Отношение «Товар» Функциональная зависимость является важным термином, который необхо димо знать, чтобы понять, что такое нормализация. Функциональная зависи мость (functional dependency) — это связь между атрибутами. Предположим, что нам известен какой-либо атрибут сущности. Имея известный атрибут (или их групп}'), можно вычислить неизвестный атрибут. Такая зависимость назы вается функциональной. Функциональные зависимости в отношениях обыч но выражаются не уравнениями, но смысловыми зависимостями.

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

Объектно-ориентированная модель Объектно-ориентированная модель опирается на несколько базовых концепций:

О Объекты, обладающие внутренней структурой и однозначно идентифици руемые уникальным внутрисистемным ключом.

О Классы, являющиеся типами объектов.

О Операции над объектами одного или разных типов, называемые метода ми.

О Наследуемость внешних свойств объектов на основе соотношения «класс подкласс».

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

Но помимо достоинств у объектно-ориентированной модели есть и недос татки:

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

разное понимание терминов и различия в терминологии.

О Отсутствие общеупотребимых стандартов, позволяющих связывать кон кретные объектно-ориентированные системы с другими системами рабо ты с данными.

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

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

В этом разделе будут рассмотрены первая, вторая и третья нормальные фор мы, так как они являются наиболее распространенными.

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

Неделимость поля означает, что содержащиеся в нем значения не должны делиться на более мелкие. Для примера, поле «Ф.И.О.» следует разделить на поля «Фамилия», «Имя» и «Отчество», тогда будет соблюдаться атомарность значений.

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

Таблица «Список сотрудников» Сотрудник 1 Сотрудник 2 Сотрудник Дата Рис. 1.18. Пример дублирующихся полей Каждый раз, когда штат расширяется или сокращается, придется перестра ивать таблицу, добавляя отдельное поле. А если список сотрудников будет Урок 1. Введение в базы данных большим. То работать с ней будет просто неудобно. В этом случае таблицу сле дует преобразовать к виду, представленному на рис. 1.19.

Таблица «Список сотрудников» Сотрудник Дата L Рис. 1.19. Преобразованная структура таблицы В качестве примера можно привести некоторую ненормализованную табли цу, представленную на рис. 1.20, к первой нормальной форме. Предположим, руководству организации захочется получить список всех сотрудников, кото рые проживают в том или ином городе. В приведенной таблице содержится поле «Домашний адрес». Из него нужно вынести значение «Город» в отдель ное поле. «Адрес и улицу» оставить в ноле «Адрес». Далее необходимо разде лить поле «Ф.И.О.» на составляющие его поля «Фамилия», «Имя», «Отче ство». Таким образом будет получена нормализованная таблица, приведенная к первой нормальной форме.

Фамилия, Таблица «Список сотрудников» имя, / / отчество Ф.И.О.

Должность Отдел Рабочий телефон Улица, Зарплата город, Дата устройства на работу / дом У Домашний адрес Домашний телефон Рис. 1.20. Ненормализованная таблица Полученная таблица представлена на рис 1.21.

Таблица «Список сотрудников» Фамилия Имя Должность Отдел Рабочий телефон Зарплата Дата устройства на работу Город Адрес Домашний телефон Рис. 1.21. Таблица, приведенная к первой нормальной форме Нормализация таблиц при проектировании баз данных Вторая нормальная форма Вторая нормальная форма требует, чтобы все неключевые поля (атрибуты) таблицы зависели от первичного ключа, то есть чтобы первичный ключ одно значно определял запись и не был избыточен. Те поля, которые зависят только от части первичного ключа, должны быть выделены в составе отдельных таб лиц. Также отношение должно удовлетворять первой нормальной форме.

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

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

Полученную таблицу можно увидеть на рис. 1.22.

Таблица «Список сотрудников» Фамилия Имя Отчество Должность Отдел Рабочий телефон Зарплата Дата устройства на работу Город Адрес Домашний телефон Рис. 1.22. Таблица с первичным ключом Таблица «Ставка» Должность Отдел Рабочий телефон Зарплата Таблица «Список сотрудников» Фамилия Имя Отчество Должность Дата устройства на работу Город Адрес Домашний телефон Рис. 1.23. Выделение таблицы «Ставка» Поля «Отдел», «Рабочий телефон», «Зарплата» зависят от поля «Должность», входящего в первичный ключ, но не от всего ключа. Поэтому их нужно выне Урок1. Введение в базы данных сти в отдельную таблицу «Ставка», связанную с таблицей «Список сотруд ников», отношением «один-к-одному». Полученный результат изображен на рис. 1.23.

Рассматривая структуру базы, можно увидеть, что поля «Город», «Адрес», «Телефон» зависят только от полей «Фамилия», «Имя», «Отчество» первич ного ключа, но не от всего ключа. Поэтому их нужно выделить в отдельную таблицу «Дом» и связать ее с основной таблицей в соотношении «один-к-од ному». В результате будет получена структура базы данных во второй нор мальной форме (рис. 1.24).

Таблица «Ставка» Должность Отдел Рабочий телефон Зарплата Таблица «Список сотрудников» Фамилия Имя Таблица «Дом» Отчество Город Должность Адрес Дата устройства на работу Домашний телефон Город Адрес Домашний телефон Рис. 1.24. Таблица во второй нормальной форме Третья нормальная форма Третья нормальная форма требует, чтобы в таблице не имелось транзитивных зависимостей между неключевыми полями, то есть чтобы значение любого поля, не входящего в первичный ключ, не зависело от значения другого поля, также не входящего в первичный ключ. Также отношение должно удовлетво рять второй нормальной форме.

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

Нормализация проводится для того, чтобы устранить излишнюю избыточность из таблиц. Заметьте, не полностью избавить их от избыточности, а миними зировать ее в разумных пределах. Чем выше уровень нормализации, тем на большее число таблиц «разбиваются» сущности. В больших организациях базы данных могут состоять из сотен связанных таблиц, что отнюдь не упрощает их понимание. Другим недостатком нормализованной базы данных является то, что при обращении к ней запрос должен считывать связанные данные из Системный каталог нескольких таблиц. Что, само собой, не добавляет производительности. Та ким образом, при нормализации баз данных большого объема приходится идти на компромисс между избыточностью таблиц и удобством работы. Существуют и другие нормальные формы, но чаще всего пользуются именно перечислен ными тремя.

Пользователи и роли Безопасность данных, особенно предотвращение к ним доступа тех, у кого нет соответствующих прав, является серьезной проблемой. В клиент-серверных СУБД для этой цели используются понятия пользователя и его роли. Пользо ватель характеризуется учетной записью конкретного человека, которая вклю чает в'себя набор ограничений на доступ к данным, логин пользователя и па роль. Роль объединяет группу пользователей и позволяет задавать им те или иные общие правила доступа к данным. Используя списки пользователей, можно для конкретной таблицы назначить видимые поля. Можно разрешить той или иной роли или отдельному пользователю осуществлять с базой дан ных те или иные действия.

Системный каталог Любая реляционная база данных, в которой поддерживаются такие объекты, как пользователи и роли, должна сохранять их списки. Кроме того, обычно с базой данных хранятся системные таблицы, триггеры, транзакции, храни мые процедуры — соответствующая часть памяти СУБД называется систем ным каталогом.

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

Модуль данных (Data module) Источник U _ w Соединение Пользовательский Набор с БД данных данных интерфейс Рис. 2.1. Обобщенная схема БД Как видно из рисунка, база данных представляет собой соединение пользова тельского интерфейса и модуля данных. Модуль данных предназначен для хранения соответствующих компонентов. Одним из них является источник данных, предоставляющий данные другим частям приложения. Вторым ком понентом является набор данных, содержащий в себе базу данных. Дополня ет картину компонент, реализующий соединение с базой данных.

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

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

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

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

Для обеспечения связи набора данных с визуальными компонентами отобра жения данных предназначен специальный компонент — источник данных, реализуемый классом TDataSource. Компонент TDataSource обеспечивает пере дачу данных в визуальные компоненты, отслеживает синхронное изменение их состояния, если изменяется состояние связанного с ними набора данных, передачу измененных данных обратно в набор. Этот компонент располагает ся на вкладке Data Access.

Базовый механизм доступа к данным основывается на трех «китах»:

О компонентах-потомках класса TDataSet (наборах данных);

О компонентах TDataSource;

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

Эта схема показана на рис. 2.2.

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

Компоненты отображения данных Компоненты TDataSource Компоненты на основе класса TDataSet Рис. 2.2. Механизм доступа к данным Урок 2. Архитектура приложений баз данных Модуль данных Модуль данных (Data Module) представляет собой невизуальный контейнер, в котором размещаются компоненты доступа к данным. В модуле данных можно размещать только невизуальные компоненты. Модуль данных досту пен программисту на этапе разработки в виде формы, в которую он может положить компоненты и настроить их свойства. Модуль данных отличается от обычной формы, так как берет свое начало от класса TComponent.

7 DtMdi aa o u шe Baai ID s l b IH M ж IS el I Tbi Q y B url Bae l i "• Daore Daoc aSu l aSue lc li Рис. 2.З. Модуль данных Для создания модуля данных можно воспользоваться репозиторием объек тов, который активируется при выполнении команды меню New • Data Module.

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

nbieit IreeVlew m ;

• •• =• •• DataModule »5 DataSource. ' • • & *% ALT.FIO ЙООТаЫеЗ) ;

*;

^ Main{ADDTab!el) Й > 4 StalsUK lADOTable2) В <& Fields :

- й 0 • ID_KART {ADOTable2ID_KART} :

> | 1 -Nom«{ADOTable2Nom«l !• ~Щ 2 • 5lalra lADOTable2Sta(ia} • 3»| 3 -Auto (ADOTable2Auto) • * 5 4-PoleSvyazy(AD0Table2PoleSvya2ji} Рис. 2.4. Дерево объектов На рис. 2.4 показано «дерево объектов». Оно позволяет отображать в списке объекты, размещенные в модуле данных. Перетаскивая объекты из «дерева объектов» в рабочую область Diagram, можно легко настраивать их свойства, Общая структура приложения баз данных буквально соединяя объекты линиями связи. На рис. 2.5 показана модель некой базы данных. Для того чтобы создать подобную модель, потребуется совсем немного времени. При помощи кнопки Property connector легко связать табли цы с компонентом-провайдером. А кнопка Master\Detail connector позволяет установить связь «один-ко-многим» в диалоговом окне Field Link Designer.

0-|р_»АВТ|АО0Т«Ые2..

1 : Nme{400Table2«o.

2 - Statia !А00ГэЫей1в1.

3 -Auta tADOTabte2Auto} 4 • PdeSvyazy (АООТаЫ...

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

Это облегчает восприятие базы в целом.

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

Рассмотрим основные шаги, которые потребуются для подключения набора данных и получения информации из него:

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

2. Подключить к компоненту таблицу, используя свойство TableName.

Урок 2. Архитектура приложений баз данных 3. Активизировать связь, установить для компонента значение свойства Acti ve как True.

4. Разместить на форме компонент TDataSource. Он обеспечивает взаимодей ствие визуальных компонентов отображения данных с набором данных.

5. Связать набор данных и компонент TDataSource.

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

СОВЕТ Желательно присваивать объектам простые и осмысленные имена, отражающие их суть.

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

Листинг 2.1. Пример использования свойства State компонента TDataSource i f DataSourcel.Dataset <> n i l then PostButton.Enabled :- DataSourcel.State in [dsEdit, dslnsert];

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

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

Метод Edit переводит связанный набор данных в состояние редактирования.

Метод-обработчик OnDataChange вызывается при редактировании данных в свя занном визуальном компоненте.

Метод-обработчик события OnUpdateData вызывается перед тем, как изменен ные данные будут сохранены в наборе данных. Обработчик вызывается перед выполнением метода Post.

Метод-обработчик события OnStateChange вызывается, когда изменяется состо яние связанного набора данных.

Набор данных Массив записей, полученный приложением по собственному запросу, назы вается набором данных. Набор данных как объект ведет свое начало от клас са TDataSet и наследует его свойства.

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

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

Открыть набор данных можно двумя способами.

Можно присвоить свойству Active значение True либо вызвать метод Open. За вершение работы с набором данных производиться сходным образом. Либо свойству Active присваивается значение False, либо вызывается метод Close.

Перед открытием набора данных автоматически инициируется событие Before Open, а после открытия, когда в набор будут переданы данные, активируется событие AfterOpen.

Перед закрытием набора данных вызываются методы BeforeClose и AfterClose.

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

Листинг 2.2. Обработка события, возникающего при закрытии набора данных procedure TForml.CustTableVeri fyBeforeClose(DataSet: TDataSet):

begin i f (CustTable.State in [dsEdit, dslnsert]) then begin case MessageDlg('Желаете сохранить?'. mtConfirmation, mbYesNoCancel, 0) of mrYes: CustTable.Post;

{ Сохранение изменений} mrNo: • CustTable.Cancel;

'{ Отмена изменений} mrCancel: Abort: { Прекращение закрытия набора данных } end;

end;

end:

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

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

Для перемещения по набору данных используются методы Next, Prior, First и Last.

Методы Next и Prior перемещают курсор на следующую и предыдущую запись соответственно, методы First и Last — на первую и последнюю.

Свойство Eof булева типа показывает, достиг курсор набора данных послед ней записи или нет.

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

Для перемещения по набору данных обычно используется метод MoveBy. Па раметр метода Distance указывает число записей, на которое будет осуществ лен переход. Если параметр имеет отрицательное значение, курсор смещает ся назад.

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

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

Редактирование набора данных Перед тем как изменять набор данных, следует узнать, возможно ли его изме нение при помощи свойства CanModi fy, которое принимает значение True, если набор данных может быть изменен.

Метод Edit переводит набор данных в состояние редактирования. В некото рых случаях набор данных переводится в состояние редактирования автома тически, например при его изменении через связанные элементы редактиро вания или при использовании некоторых методов, таких как Insert или Append.

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

Для различных типов баз данных действие метода Post несколько различается:

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

О При использовании клиентских наборов изменения сохраняются в локаль ном кэше базы данных. Для их сохранения на сервере необходимо вызвать метод Appl yUpdates.

В некоторых ситуациях бывает необходимо отменить произведенные действия.

В этом случае вызывается метод Cancel. Метод возвращает набор данных в со стояние, которое было при последнем вызове метода Post.

Набор данных Для добавления новой записи по месту расположения курсора используется метод Insert. А если необходимо добавить запись в конец набора данных, сле дует вызывать метод Append.

Выбранная запись удаляется методом Delete. А метод Clear Fields очищает поля выбранной записи. Набор данных должен находиться в режиме ввода новой записи либо в режиме редактирования.

Поиск записей и фильтрация в наборах данных Метод Locate используется для поиска информации в базе данных. Он ищет первую запись, удовлетворяющую критерию поиска, и, если такая запись най дена, делает ее текущей. В случае «удачного» поиска метод возвращает True, в противном случае — Fal se.

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

В свойстве TLocateOption задаются необязательные дополнительные опции поиска:

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

О Значение ToPartialKey используется в том случае, если ключевые значения полей поиска могут включать только часть значения поля. Например, если в ключе поиска задано значение N, а поле содержится значение N O, то N NR метод остановит поиск на этой записи, так как она содержит в своем поле часть ключевого значения.

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

Листинг 2.3. Пример использования Locate var LocateSuccess: Boolean;

SearchOptions: TLocateOptions:

begin SearchOptions ;

[loPartialKey];

LocateSuccess := CustTab1e.Locate('Company, Vendor', VarArrayOf(['Sight Diver','Point']), SearchOptions);

end;

В примере, приведенном в листинге 2.3, производится поиск в наборе данных по полям Company и Vendor.

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

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

В листинге 2.4 приведен пример, в котором производится поиск по полю Company значения «Professional Divers, Ltd.». В результате возвращается вариантный массив, содержащий значения полей Company, Contact и Phone.

Листинг 2.4. Использование Lookup. Поиск по одному полю var LookupResults: Variant:

begin LookupResults := CustTable.Lookup('Company', 'Professional Divers. Ltd.'.

'Company;

Contact;

Phone');

end;

В листинге 2.5 приведен пример, аналогичный примеру, приведенному в лис тинге 2.4. Отличие заключается в том, что в данном примере поиск произво дится по нескольким полям.

Листинг 2.5. Использование Lookup. Поиск по нескольким полям var LookupResults: Variant;

begin with CustTable do LookupResults := LookupC'Company;

City'. VarArrayOf(['Sight Diver'.

'Company;

Addrl;

Addr2;

State;

Zip 1 );

'Christiansted']).

end:

В случае, если метод ничего не нашел, он возвращает значение null. Прове рить данное условие можно при помощи условного оператора if VarJypeCLook upResults) = varNull.

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

В условие фильтрации можно включать логические операторы and, or, not, <>i ( <=, >=.

Например:

1. ([size] > 20) and ([size] <= 40).

Набор данных 2. ( [ s i z e ] > 20) and ([weight] < 30).

3. ([name] <> 'Tetras') and ([size] < 10).

Как видно из приведенных примеров, сравнение заданного условия произво дится со значением поля.

При помощи свойства FilterOptions можно задать необязательные параметры фильтрации, как и для метода Locate.

Событие OnFilterRecord возникает, когда в свойстве Filtered устанавливается значение True. Метод-обработчик события TFilterRecordEvent имеет два пара метра. В параметре DataSet передается фильтруемый набор данных, а в пара метре Accept — переменная, в которую помещается значение True в случае, если текущая запись соответствует условиям фильтрации. Пример приведен в лис тинге 2.6.

Листинг 2.6. Пример использования события OnFilterRecord procedure TForml.TablelFilterRecord(DataSet: TDataSet;

var Accept: Boolean):

begin Accept:=((DataSet.FieldByName('Size').AsInteger+2)<10) and ((DataSet.FieidByNameC'Weight').AsFloat/2)<2);

end;

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

Состояния набора данных Набор данных может находиться в нескольких состояниях, в которые он пе реходит в процессе своего функционирования. Состояния меняются в резуль тате перемещения по набору данных, редактирования, ввода новых записей и т. д. Отслеживая текущее состояние набора данных, программист может предпринять какие-либо действия. Текущее состояние набора данных содер жится в свойстве State, значение которого принадлежит перечислимому типу TDataSetState. Возможные состояния указаны в табл. 2.1.

Таблица 2.1. Состояния набора данных Значение свойства Состояние набора данных dslnactive Набор данных закрыт dsBrowse • Набор данных находится в состоянии просмотра.

Редактирование невозможно. Данное состояние является «обычным», устанавливается по умолчанию dsEdit Выбранная запись может быть отредактирована dslnsert Запись «помещена» в набор, но не утверждена в нем методом Post. Запись может быть изменена, принята или отменена продолжение •& Урок 2. Архитектура приложений баз данных Таблица 2.1 (продолжение) Значение свойства Состояние набора данных dsSetKey Используется механизм поиска по ключу или по диапазонам dsCalcFields Устанавливается при возникновении события OnCalcFields dsFilter Устанавливается при возникновении события OnFilterRecord dsNewValue Устанавливается при обращении к свойству NewValue поля набора данных dsOldValue Устанавливается при обращении к свойству OldValue поля набора данных dsCurValue Устанавливается при обращении к свойству CurValue поля набора данных dsBlockRead Устанавливается в случае «ускоренного перемещения по набору данных». Переводится в данный режим вызовом метода DisableControls dsInternalCalc Устанавливается при расчете значений полей, для которых FieldKind имеет значение fklnternalCalc dsOpening Устанавливается в момент открытия набора данных Набор данных может переходить в состояния dsNewValue, dsOldValue, dsCurValue, dsInternalCalc только в том случае, когда доступ к базе данных осуществляет ся через компонент TCI i entDataSet или используется кэш данных.

Когда набор открывается, он находится в состоянии dsOpening. После того как он открылся, активируется состояние просмотра dsBrowse. Это состояние яв ляется основным для набора данных.

В листинге 2.7 приведен пример, в котором производится проверка того, на ходится ли набор данных в состоянии редактирования или вставки новой за писи, после этого выполняется сохранение изменений.

Листинг 2.7. Демонстрация использования сведений о состоянии набора данных with DataSet do begin i f state in [dslnsert. dsEdit] then Post:

end:

Работа с полями Любая запись набора данных представляет собой совокупность полей. Поля представляют собой объекты, производные от типа TField. Каждое поле име ет определенный тип данных и соответствующий ему объект. Свойство Fields содержит коллекцию полей набора данных.

Работа с полями Использование объектов-полей К полю набора данных можно обратиться по его имени, используя метод FieldByName, или через свойство Fields. В первом случае используется конст рукция DataSet.Fields[i].AsInteger, а во втором — DataSet.FieldByName(«Some Field»).Aslnteger.

Каждый объект имеет ряд свойств, определяющих структуру поля. Список этих свойств не так уж велик:

О название поля;

О тип данных поля;

О вид поля;

О размер поля;

О иные атрибуты, присущие полю конкретного типа.

Свойство FieldDefs содержит список параметров каждого поля из набора дан ных. В примере, приведенном в листинге 2.8, демонстрируется использование свойства FieldDefs. При помощи метода AddFieldDef добавляется несколько объектов полей с определенными свойствами.

Листинг 2.8. Использование FieldDefs procedure TForml.FormCreateCSender: TObject);

begin with ClientDataSetl do begin with FieldDefs.AddFieldDef do begin DataType':= ftlnteger;

Name :- ' F i e l d l ' :

end;

with FieldDefs.AddFieldDef do begin DataType :- f t S t n n g ;

Size :- 10:

Name := 'Field2':

end;

end;

end;

Как видно из примера, каждое поле имеет некоторый тип данных (DataType), размер (DataSize) и название (FieldName). Также каждое поле имеет какой-либо вид (FieldKind), определяющий его функциональное назначение.

Свойство FieldCount возвращает число полей, содержащихся в данном наборе данных. Конечно, одним количеством полей не обойтись. Чаще всего требу Урок 2. Архитектура приложений баз данных ется получить еще и дополнительную информацию о полях. Для этой цели используется метод GetFieldNames. В качестве параметра этому методу переда ется список. После отработки метода в переданном списке будут размещены названия всех полей данного набора данных.

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

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

Динамические поля создаются автоматически при каждом открытии набора данных, если ранее не были созданы объекты полей. Любой объект поля яв ляется наследником класса TField, а его конкретный тип зависит от типа дан ных, содержащихся в таблице.

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

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

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

На рис. 2.6 представлен вид редактора полей набора данных. В наборе опре делено несколько статических полей.

N M ' '" AE SE I Z WI H ETG AE RA BP M Рис. 2.6. Редактор полей Работа с полями Типы и виды полей Функциональное назначение поля определяется свойством FieldKind. В общем случае его назначение определяется автоматически на этапе создания поля.

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

Значение свойства TFi el dKi nd относится к перечислимому типу. Соответствен но, существует ограниченное количество значений этого свойства:

О fkData — иоле данных, имеющее то же тип, что и поле базы данных;

О fkCalculated — вычисляемое поле;

О fkLookup — поле синхронного просмотра;

О fklnternalCalc — внутреннее вычисляемое поле;

о fkAggregate — агрегатное поле.

Тип данных однозначно связан с конкретным полем таблицы базы данных.

Без этого поля само понятие типа данных не имеет практического смысла.

В Delphi свойства абстрактного поля инкапсулирует класс TField, который не имеет заранее определенного типа данных. Уже от этого класса порождено целое семейство классов для типизированных полей, каждый из которых умеет обращаться со своим типом данных.

Тип данных поля содержится в свойстве DataType. На основе приведенных типов полей и класса TField порождаются объекты полей определенного типа. Спи сок этих, классов приведен в табл. 2.2.

Таблица 2.2. Классы полей Класс Описание поля TADTField Поле абстрактного типа данных. Данное поле может содержать массивы полей, наборы данных и любые иные типы данных TAggregateField Агрегатное поле TArrayField Поле содержит массив TDateField Поле даты TDateTimeField Поле даты и времени TSmalllntField Целочисленное поле. Под хранение данных отводится по два байта TFloatField Поле для хранения вещественных чисел TSQLTimeStampField Поле даты и времени набора DBExpress TAutoIncFicld Автоинкрементное поле TFMTBCDField Форматированное двоично-десятичное поле TStringField Строковое поле продолжение & Урок 2. Архитектура приложений баз данных Таблица 2.2 (продолжение) Класс Описание поля TBCDField Двоично-десятичное поле TGraphicField Графическое поле TTimeField Поле времени TBinaryField Двоичное поле TGuidField Поле, хранящее уникальный идентификатор GUID TVarBytesField Байтовое поле переменной длины TBlobField ВЮВ-поле TIDispatchField Поле, хранящее указатель на интерфейс диспетчеризации TVariantField Вариантное поле TBooleanField Логическое поле TIntegerField Поле для хранения целочисленных данных длиной 32 бита TWideStringField Большое строковое поле TBytesField Байтовое поле фиксированной длины Tinterface Field Поле, хранящее указатель на интерфейс TWordFicld Поле для 16-разрядных целочисленных значений без знака TCurrencyField Поле для хранения информации в виде денежных сумм TLargeintField Поле для хранения целочисленных данных длиной 64 бита TDataSetField Поле, содержащее вложенный набор данных Memo-поле TMemoField Delphi поддерживает большое количество полей. Есть поля для работы с СОМ, специальные типы данных для работы с объектно-ориентированными БД, что позволяет разработчику проявлять потрясающую гибкость в вопросах плани рования собственной работы.

Стандартные компоненты, связываемые с набором данных Наиболее распространенным компонентом, без которого не обходится прак тически ни одна СУБД, является компонент, реализующий табличное пред ставление данных TDBGrid (рис. 2.7).

"ПЕГ" МАМЕ AE RA 2 Cm u r A u r m o pt q au s e i 2:

• Angel Fish 8 S uh A ec o t m ra i io[ Boa зо: 2 Sre Sv r 0 ce n aes Г Critters 10: 5[ Nw Oe n e ras l House Cat 40: 35;

AfricaandAsta Ocelot 5! 5 S uh A ec o t m ra i Parrot 2: 2 Fs B w ih o s l Tetras •M ••:?!:• Рис. 2.7. Компонент TDBGrid Стандартные компоненты, связываемые с набором данных Компонент TDBGrid используется для отображения содержимого набора дан ных в табличном виде, когда строки соответствуют записям набора данных, а столбцы — полям записи.

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

Для определения состава столбцов можно использовать редактор столбцов, реализованный диалоговым окном Column Editor. Он показан на рис. 2.8.

jWEISHT SIZE Площадь • Computer Aquariums South America Screen Savers New Orleans Africa and Asia [TAREA 1: N M AE South America 2 • SIZE Fish Bowls 3-WEIGHT Рис. 2.8. Редактор столбцов Если редактор столбцов не использовался, то используются поля, объявлен ные при помощи редактора полей набора данных. При этом все свойства столб цов и порядок их следования наследуются из редактора набора данных. В слу чае, когда производится динамическое формирование объектов TField, поря док следования полей и их характеристики соответствуют тем, что были за даны при определении структуры записи таблицы базы данных при создании.

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

Обратиться к конкретному столбцу компонента TDBGrid можно как к элемен ту индексированного массива TDBGrid.Columns.Items[i].

Также для отображения и редактирования данных используются элементы TDBEdit. Они представляют собой модифицированные компоненты TEdit. Связь с источником данных осуществляется при помощи свойства DataSource. Поле, с которым связывается данный компонент, указывается в свойстве DataField.

Компонент T B e o представляет собой многострочный редактор. Обычно свя D Mm зывается с memo-полями. С его помощью часто сохраняют обширные тексто вые массивы в соответствующих полях.

Компонент DBComboBox представляет собой список, связываемый с определен ным полем набора данных. Значения списка хранятся в свойстве Items. Зна чения в список можно добавлять, удалять из него, сохранять и загружать с по мощью методов Delete, Insert, LoadFromFile и SaveToFile.

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

Урок 2. Архитектура приложений баз данных Компонент TDBImage предназначен для отображения графической информации, хранящейся в связанном с ним BLOB-поле (binary large object). Связывается этот объект с набором данных через те же свойства, что и остальные компо ненты отображения данных. Изображение, получаемое из набора данных, хранится в свойстве Picture.

Компонент TDBRichEdit представляет собой многострочный редактор с возмож ностью отображать форматированный текст. Данный компонент^ идеально подходит для отображения различных примечаний или хранения отчетов.

Компонент TDBChart служит для построения графиков на основе данных, полу чаемых из набора данных. Иногда при помощи всего нескольких щелчков мы шью можно получать очень красивые объемные графики, отражающие различ ные зависимости. На рис. 2.11 приведен пример графика, построенного в TDBChart.

s s ВепизН Axis j Titles : Legends Panel i Paginal Wals { 3C \ Series Title • 3 :;

.

Рис. 2.9. Создание графика Для того чтобы построить график, надо выполнить команду контекстного меню Edit Chart. В результате будет активировано диалоговое окно Editing DBChart, показанное на рис. 2.9. Для создания новой серии данных необходимо нажать кнопку Add. В результате будет активировано следующее диалоговое окно TeeChart Gallery, в котором можно будет выбрать тип графика. Перейдя на вклад ку Series, можно получить доступ к настройкам данного графика. На этой стра нице расположены вкладки Format, General, Mark и Data Source. На вкладке Format можно задать различные параметры отображения графика. Вкладка General позволяет задать несколько свойств общего характера. На вкладке Mark мож но определить режим подписи графика — легенду, размещение пояснений к нему и другие параметры. А вкладка Data Source, показанная на рис. 2.10, по Стандартные компоненты, связываемые с набором данных зволяет задать источник данных и определить поля, по которым будет стро иться график.

Рис. 2.10. Выбор источника данных Из раскрывающегося списка можно выбрать тип источника данных строяще гося графика. В данном примере стоит остановиться на значении Dataset. Да лее из списка Dataset нужно выбрать конкретный набор данных. В списке Labels необходимо выбрать поле, значения которого будут подписываться под зна чениями графика. Поле, на основании которого будет построен график, вы бирается в списке Pie из доступных полей. Полученный график показан на рис. 2.11.

Рис. 2.11. График построенный в TDBChart УРОК Технологии доступа к данным Технологией доступа к данным называется система интерфейсов, обеспечи вающая взаимодействие между приложением и базой данных. Во многих си стемах управления базами данных имеются библиотеки, содержащие интер фейсы прикладного программирования {application programming interface — API), представляющие собой функции, при помощи которых можно выпол нять с данными те или иные действия.

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

Этот вопрос призваны решить различные технологии доступа к данным. Они являются прослойкой между API конкретного сервера и приложением пользо вателя, предоставляя программисту простой унифицированный механизм работы с данными. На сегодняшний день существует множество технологий доступа к данным, таких как BDE, OLE, ODBC, ADO, и до сих пор разраба тываются новые, более надежные, удобные в работе и более быстродейству ющие технологии.

BDE Фирма Borland разработала собственную технологию доступа к данным SQL Links, имеющую возможность взаимодействовать с ODBC через специальные «интерфейсы-мосты». Технология BDE является набором динамических биб лиотек, которые предоставляют интерфейсы, позволяющие передавать запросы на получение или модификацию данных из приложения в нужную базу дан ных и получать результат обработки. В процессе работы библиотеки исполь зуют вспомогательные файлы языковой поддержки и информацию о настрой ках среды.

BDE Для разработчика BDE предоставляет множество преимуществ:

О непосредственный доступ к локальным базам данных (dBase, Paradox, тек стовые файлы);

О доступ к SQL-серверам (Oracle, Sybase, MS SQL Server, InterBase, Informix, DB2) с помощью набора драйверов Borland SQL Links;

О доступ к любым источникам данных, имеющим драйвер ODBC (Open Data Base Connectivity), например к файлам электронных таблиц (Excel, Lo tus 1-2-3), и серверам баз данных, не имеющим драйверов SQL Links (на пример, Gupta/Centura);

О создание приложений «клиент—сервер», использующих разнородные данные;

О использование SQL (Structured Query Language — язык запросов к сервер ным СУБД), в том числе и при работе с локальными данными;

О изоляцию приложения от средств языковой поддержки.

На рис. 3.1 представлена схема, на которой показана связь приложений и BDE.

Инструменты формирования Приложения запросов Borland Database Engine (BDE) V. VI ODBC SQL Links драйверы i> t TCP/IP, special [ \r f /'Локальный, ! сервер ;

Серверные СУБД: Oracle, Informix, ч InterBase / DB2, MS SQL Server, Sybase Рис. З.1. Связь приложений с источниками данных при помощи ВОЕ Создание псевдонима базы данных При работе с таблицами локальных БД или СУБД сама база размещается либо в каталоге на диске и хранится в виде отдельного набора файлов, либо на удаленном сервере. Обращение к базе данных происходит по ее псевдониму {Database Alias). Псевдоним должен быть зарегистрирован на конкретной УрокЗ. Технологии доступа к данным машине, с которой будет производиться доступ к базе данных. Псевдонимы баз данных и другие настройки BDE хранятся в файле idapi32.cfg, располо женном в том же каталоге, что и файлы BDE.

Создание и работа с псевдонимами баз данных производится из утилиты B E D Administrator. Для того чтобы создать псевдоним, в главном меню утилиты надо выбрать пункт Object • New. В появившемся окне, показанном на рис. 3.2, бу дет предложено выбрать драйвер для доступа к базе данных.

D t b s. Dv f Nm aa ae re a e i ;

Cancel Help Рис. 3.2. Окно выбора драйвера В рассматриваемом случае надо оставить выбранным пункт STANDARD и нажать кнопку ОК. Созданный псевдоним базы данных можно переименовать по свое му вкусу. В примере псевдоним получил название TestAiias. В правой части окна в качестве значения свойства Path указывается путь к базе данных. Обычно тре буется создать каталог, в котором позже будет размещена эта база. В примере используется путь D:\TestDB (рис. 3.3). Путь к каталогу можно указать с помо щью диалогового окна, который активируется соответствующей кнопкой в по ле Path. После выполнения этих действий необходимо сохранить данные о соз данном псевдониме. Для этого следует выполнить команду меню Object • Apply.

Окно, демонстрирующее сказанное, показано на рис. 3.3.

ПИЛ Administrator •tolProgram> itesk omrui.i •. •. : • -,m «линии',./'.[u • 1. Г O e t E i Vw O t n Hp b c d e po s e j ti i l & /^. O O |< Oehr,«.-r Ы 5Т..!•.: ABD АЙ Database Aliases :f»MonJ Databases :;

Configualion ] i STANDARD Type Г-- 09 Databases > j DEFAULT DRIVER PARADOX ;

•!• CFSnippets 1 ENABLE BCD FALSE • ^g* Companylnfo | PATH D:\TestDB i : Ig DBDEMOS I.::.•!

: Sj DefaultDD f ) "g ExampleApps i "a fgfds i ?a IBLocal j ~Q Locals eiver i *e MQIS | :

| :

;

"Q Testik Рис. 3.3. Создание и настройка псевдонима Создание таблиц базы данных Для создания таблиц базы данных можно использовать утилиту Database Desktop. Сначала нужно задать рабочий каталог. Для этого следует выполнить BE D команду меню Object • Working Directory и из списка Aliases выбрать только что созданный псевдоним. Таким образом, при открытии диалога выбора таблиц (для локальных баз данных) будет открываться именно тот каталог, в кото ром они располагаются.

Для создания таблицы необходимо выбрать пункт меню Object • New • Table.

В появившемся окне необходимо выбрать тип таблицы. Для реализации тес тового примера нужно выбрать значение Paradox 7. В результате будет акти вировано диалоговое окно, показанное на рис. 3.4. Каждая строка соответствует определенному полю в создаваемой таблице.

Рис. 3.4. Определение структуры таблицы В столбце FieldName указываются имена полей создаваемой таблицы. Стол бец Туре задает их типы. Для строковых полей в столбце Size указывается их размер. А в столбце Key помечаются символом звездочки те поля, которые будут входить в состав первичного ключа.

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

Описание полей созданной таблицы базы данных приведено в табл. 3.1.

Таблица 3.1. Описание полей таблицы «Студенты» Примечание Type Size Key Field Name * STUDENT Поле типа Alfa A GROUP Поле типа Short S DATAPOSTUP Поле типа Data D Урок 3. Технологии доступа к данным Любому полю таблицы можно задать те или иные ограничения:

О Модификатор Required Field указывает, что поле должно быть обязательно заполнено данными.

О Ограничение Minimum Value определяет минимальное значение, которое может содержаться в поле.

О Maximum Value задает максимальное значение, которое может содержаться в поле.

О Параметр Default Value определяет значение, которое поле будет принимать по умолчанию.

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

Первичный ключ будет построен по полям STUDENT и GROUP.

№st.u..tuiePar«dox г Table: SiuclenU Ш Table properties:

F l r se e ot r id ;

Validity Checks k^...:...... ::::...„ J.^. w.. г '• • 1 Required Field 2 Minimum value:

Alpha Number i(Money) j 3. Maximum 4alue:

Short Long Integer *(BCD) 4. Detail value:

i —• lime "'"" 5. Picture:

Ш (Timestamp) Bight-dick oi press Spacebar lo choose a lie ;

Memo i Formatted Memo Assist.

'•' i !• ' Sraphic Рис. З.5. Таблица «Студенты» Для полей Student и Group следует установить ограничение Required Field. На рис. 3.5 показан один из этапов формирования таблицы.

Далее необходимо выбрать языковый драйвер для того, чтобы русский текст отображался в базе данных без искажений. Для этого в списке Table properties необходимо выбрать пункт Table Language, затем нажать кнопку Modify и вы брать в появившемся списке значение Pdox ANSY Cyrillic. Теперь таблицу мож но сохранить под именем Students при помощи кнопки Save/Save As.

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

BDE Таблица 3.2. Таблица «Оценки» Field Name Key Type Size Примечание AUTO Автоинкрементное поле + STUDENT A 30 Поле типа Alfa EXAM A 30 Поле типа Alfa GRADE S Поле типа Short DATAEXAM D Поле типа Data Для поля Grade, в котором будут храниться оценки, необходимо задать опре деленные ограничения. Следует выбрать параметр Required Field, для параметра Minimum Value установить значение, равное трем, а для Maximum Value — пяти.

Созданную таблицу нужно сохранить под именем GradeTab. В ней также по требуется создать индекс по полям STUDENT, GROUP и GRADE. Для этого в спис ке Table properties необходимо выбрать значение Secondary Indexes и нажать кнопку Define. В результате будет активировано окно, показанное на рис. 3.6.

Define Sccoiid.li у Index fields: indexed fields:

Ёхм iTUDENT GRADE DATAEXAM UDENT.i Change order:

Index options ? Unique Case sensitive I 'V Maintained Г** Descending Help Cancel ПГ21ГГ. I Рис. З.6. Создание индекса Вторичный индекс может обладать дополнительными возможностями и ог раничениями, которые налагаются на него при помощи флажков в диалого вом окне:

О Параметр Unique обязывает все значения, входящие в состав индекса, быть уникальными.

О Case sensitive указывает, что индекс будет учитывать регистр символов.

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

3 Зак УрокЗ. Технологии доступа к данным бб О Параметр Descending задает обратное направление сортировки значений, входящих в индекс. Если флажок не установлен, то сортировка произво дится в прямом направлении.

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

Теперь нужно определить ссылочную целостность. Таблицы Students и GradeTab находятся в отношении «один-ко-многим». Один студент может сдать несколь ко экзаменов на разные оценки. Теперь эту связь надо жестко прописать в про екте.

Нужно открыть таблицу GradeTab и выбрать пункт меню Table • Restructure.

Таблица откроется для внесения изменений. В списке Table properties нужно выбрать элемент Referential Integrity и нажать кнопку Define. В результате бу дет активировано диалоговое окно, показанное на рис. 3.7.

Tabli [STUDENT 1A30] НSTUDENT [А30| | ВВШШ Referential integrity name:

JTestReT CancelА.;

.;

„„.Н?|Р I;

!] :

• 1 : : Update rule • 1 I f*4 Cascade /~ Prohibft i Г" Strict referential integrity Canceli Help Рис. З.7. Определение ссылочной целостности В левой части окна показаны поля таблицы GradeTab. Необходимо создать связь по полям STUDENT и GROUP. Соответственно, их необходимо выбрать из дочер ней таблицы двойным щелчком мыши. Поля будут помещены в список Child fields. Далее необходимо выбрать таблицу Students, находящуюся в списке Table, который находится в правой части окна. Подходящие поля будут загружены в таблицу Parent's key и будет автоматически установлена связь.

Для созданной ссылочной целостности можно определить дополнительные параметры:

О Группа Update rule позволяет задавать правила модификации записей:

• переключатель Cascade указывает, что обновления данных производятся каскадно;

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

BE D о Флажок Strict Referential Integrity в активизированном состоянии запреща ет работать с таблицей Paradox из пакета Paradox for DOS.

Осталось лишь присвоить отношению имя TestRef и сохранить его, нажав на кнопку ОК.

Разработка простого приложения БД Теперь, когда база данных создана, можно перейти к созданию первого при ложения для работы с ней. Прежде всего в Delphi необходимо создать новый проект. Затем в него нужно добавить модуль данных командой главного меню File • New • Data Module. Модуль нужно сохранить под именем DataModule. В нем нужно расположить два компонента ТТаЫе, которые находятся на вкладке BDE, и два компонента TDataSource. Для обоих компонентов ТТаЫе в свойстве Database Name надо выбрать из списка значение TestAliace. Компонент Tablel надо пе реименовать в StudentsTbl при помощи свойства Name, а компонент ТаЫе2 — BGradeTbi. Также компоненту DataSourcel надо дать имя StudentsSrc, a Data Source2 — GradeSrc.

Теперь надо связать попарно компоненты таблиц и источников данных. При помощи свойства Dataset надо увязать StudentsTbl с StudentsSrc, a GradeTbl — с GradeSrc. На этом этапе уже можно определить отношения между таблица ми. Для этого в свойстве MasterSource компонента GradeTbl необходимо ука зать родительский источник данных, который будет связывать компонент с ро дительской таблицей. В данном случае это будет StudentSrc. Далее в свойстве MasterFields этого же компонента необходимо указать поля, по которым бу дет установлена связь. В правой части свойства необходимо нажать на кноп ку, и появится диалоговое окно, показанное на рис. 3.8.

Рис. 3.8. Окно редактора связей Оно содержит два списка — Master Fields и Detail Fields. В них перечислены поля, по которым можно создать связь. В обоих списках надо выбрать поля STUDENT, а потом нажать кнопку Add. Будет создана связь между таблицами. В списке 68 УрокЗ. Технологии доступа к данным Available Indexes перечислены доступные индексы, по которым тоже можно создать связь.

Затем на основной форме приложения нужно разместить два компонента TDBGrid, располагающихся на вкладке Data Controls палитры компонентов.

Модуль данных надо подключить к главному модулю приложения одной стро кой кода:

uses DataModule;

Теперь необходимо связать компоненты TDBGrid с компонентами TDatasource, расположенными в модуле данных, при помощи одноименного свойства Data Source. Также надо разместить на форме компонент TPopupMenu. Его надо свя зать с компонентами TDBGrid через их свойство PopupMenu.

Двойным щелчком на компоненте TPopupMenu нужно активировать редактор меню и определить несколько новых пунктов. Потребуется создать пункт Новая, для которого в свойстве Name указать значение NewRec. Также нужно будет соз дать пункты Принять (PostRec) и Удалить (DeieteRec). Реализация этих методов приведена в листинге 3.1.

Листинг 3.1. Реализация методов контекстного меню uses DataModule;

{$R *.dfm} {Удаление выбранной записи} procedure TForml.DeleteRecClick(Sender: TObject);

begin i f PopupMenul.PopupComponent = DBGridl then begin with DataModulel.StudentsTbl do begin i f State = dsBrowse then i f MessageDlg('Вы уверены в том, что хотите удалить запись?', mtConfirmation. [mbYes.mbNo], 0) = mrYes then Delete;

end;

end;

if PopupMenul.PopupComponent = DBGrid2 then begin with DataModulel.GradeTbl do begin if State = dsBrowse then if MessageDlg('Вы уверены в том, что хотите удалить запись?', mtConfirmation, [mbYes.mbNo]. 0) = mrYes then Delete;

end;

end;

end;

{Сохранение изменений} BDE procedure TForml.PostRecClick(Sender: TObject):

begin if PopupMenul.PopupComponent = DBGridl then begin with DataModulel.StudentsTbl do begin i f State in [dslnsert, dsEdit] then Post;

end:

end;

if PopupMenul.PopupComponent = DBGrid2 then begin with DataModulel.GradeTbl do begin if State in [dslnsert. dsEdit] then Post;

end;

end;

end;

{Добавление новой записи} procedure TForml.NewRecClick(Sender: TObject);

begin if PopupMenul.PopupComponent = DBGridl then begin with DataModulel.StudentsTbl do begin if State = dsBrowse then Insert;

end;

end;

if PopupMenul.PopupComponent = DBGrid2 then begin with DataModulel.GradeTbl do begin if State = dsBrowse then Insert;

end;

end;

end;

Двойным щелчком на каком-либо из компонентов TDBGrid нужно вызвать ре дактор полей. Командой Add AL Fields контекстного меню можно добавить все L поля. Лишние поля потом можно будет просто стереть. Данной командой определяются поля, которые будут отображаться в таблице. Вид окна пред ставлен на рис. 3.9.

Для выбранного поля можно указать тип шрифта столбца, тип шрифта за головка, цвет заголовка, название заголовка. Для изменения названия заго УрокЗ. Технологии доступа к данным ловков достаточно выбрать поле и в свойстве Title • Caption указать новый заголовок. В свойстве PickList можно указать список значений, которые будут доступны из таблицы в данном поле. Основное окно программы показано на рис. 3.10.

B to Sye iQ ctafadow u n t l cbsAuto i C o : or l Editing DBGridi. ou n Clms i Do D w R w rp o n o ?

Ep n e i False x add j Fd a e [ S T U D E N T e Nm il ElFont [(TFont) 1G O P -RU mM d iimOontCafe I e oe :. | D T P SU AA O T P mNm I ea e j PickList j (things) R a Q r "False e d nji | В Title j(TCoiumnTiHe) i Alignment UaLefUuslily Caption :Студент Color QclBtriFace ] Рис. 3. T Простая база данных. <.вя)ь один немногим 1 Студент | Группа | Дата поступления j j•|Васичкин 109.01. Петров I Рис. 3.10. Окно программы Настройка BDE Для доступа к параметрам драйвера в левой части окна Администратора нужно выбрать вкладку Configuration и требуемый драйвер. Система BDE взаимодей ствует с двумя типами драйверов. Это драйверы Native, являющиеся «родны ми» драйверами SQL Links, и драйверы ODBC.

При выборе нужного драйвера в правой части окна появляется окно с инфор мацией о его свойствах:

О Свойство T P указывает тип сервера баз данных. Значение FILE указыва YE ет, что используется локальный сервер Interbase или таблицы Paradox, BE D Dbase. Значение SERVER свидетельствует об использовании удаленного SQL сервера.

О Свойство L N DRIVER определяет драйвер языка, используемого для коди AG ровки символов.

О Свойство ENABLE B D указывает на необходимость перевода чисел в двоич C но-десятичный формат.

О Свойство OPEN M D определяет режим доступа к данным.

OE О Параметр M X R W определяет количество записей, включаемых в пакет A OS данных. Используется при работе с удаленными серверами.

О Свойство SERVER N M указывает имя удаленной базы данных и содержит AE путь к ней.

О Параметр SQLPASSTHRU M D регламентирует режим взаимодействия BDE OE с СУБД на уровне транзакций:

• значение SHARED AUTOCOMMIT означает, что транзакции выполняются автоматически, без соответствующей команды от клиентского приложе ния;

• значение SHARED NOAUTOCOMMIT указывает, что транзакция не выполня ется автоматически. За их выполнением следит клиентское приложение;

• значение NOT SHARED применяется, когда для каждого компонента, свя занного с БД, создается свое соединение с базой данных.

О Параметр SQLQRYMODE определяет политику выполнения запросов:

• значение L C L означает, что запрос выполняется локально;

OA • значение NULL указывает, что будет применяться смешанный механизм выполнения запросов. Сначала BDE отправляет запрос на сервер;

если результат не получен, то запрос повторяется в режиме LOCAL;

• значение SERVER указывает, что запрос выполняется на сервере.

О Свойство DLL32 содержит имя динамической библиотеки драйвера.

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

Установки по умолчанию доступны в разделе Configuration • System • Init:

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

О Свойство LANGDRIVER задает используемый по умолчанию драйвер языка.

О Параметр L C L SHARE определяет возможность разделения доступа к ло OA кальным базам данных между BDE и другими приложениями при одно временном обращении к ним.

Как уже отмечалось ранее, настройки BDE хранятся в файле idapi32.cfg.

УрокЗ. Технологии доступа к данным Компонент TDatabase Обычно при разработке приложений, использующих базы данных, с помощью утилит конфигурации BDE создаются псевдонимы, указывающие на тип и рас положение данных. Компоненты ТТаЫе, TQuery, TStoredProc обладают свойством DatabaseName, при установке которого на этапе проектирования можно выбрать необходимый псевдоним из выпадающего списка или явно указать каталог, в котором располагаются таблицы локальных баз данных. Однако иногда бывает необходимо создать псевдоним динамически или переопределить ка кие-либо параметры настройки драйвера базы. В этом случае обычно исполь зуется компонент TDatabase, помещаемый явно на форму или в модуль дан ных. Если определить свойство DatabaseName этого компонента, оно появится в списке псевдонимов при установке одноименного свойства DatabaseName ком понентов ТТаЫе, TQuery и TStoredProc. Если компонент не был размещен на форме, то он будет создан динамически, с настройками по умолчанию. Так как компонент отвечает за взаимодействие с BDE, его создание будет иницииро ваться компонентами ТТаЫ е, TQuery и TStoredProc.

Переопределить параметры псевдонима базы данных можно с помощью ин спектора объектов. В свойстве TTransIsolation можно определить уровень изо ляции транзакции.

Также параметры псевдонима базы данных можно изменять в редакторе свойств компонента TDatabase. Окно редактора показано на рис. 3.11. Вызывается ре дактор двойным щелчком мыши на компоненте.

formt > D t b s I D t b s.

aa a e aa a e • Dtbs " • aa ae Nm:

ae Prmtr oer e:

a e v rd s ae i P T = :Ts B AHD eD \l D f us j ea tl E AL BDFLE NBE C=AS DFUT DVRPRO X EA L RE=AA O I Ca j er l Oo s pn il W L g p mt.t r p on o p Ke i a t e c n e t n " ep n ci o n ci v o Рис. 3.11. Редактор свойств компонента TDatabase Нажав кнопку Defaults, можно установить стандартные настройки данного псевдонима. Обратиться к параметрам псевдонима можно через свойство Params.

Также компонент TDatabase используется для сокращения числа обращений к базе данных. К примеру, если на форме расположено несколько компонен BE D тов, взаимодействующих с базой данных, то каждый из них обращается к сер веру и передает ему параметры, идентифицирующие пользователя. На серве ре производится проверка и принимается решение о допуске пользователя к работе. Для того чтобы минимизировать число обращений к серверу, все ком поненты, предназначенные для работы с какой-либо базой данных, связыва ются через свойство Database с компонентом TDatabase, а тот, в свою очередь, связывается с базой данных. Если приложение должно работать с нескольки ми базами данных, то в модуле данных размещается несколько компонентов TDatabase.

Повлиять на выполнение серверных транзакций можно путем кэширования внесенных пользователем изменений вместо попытки немедленного сохране ния их в базе данных. В этом случае изменения, внесенные пользователем, со храняются в кэш данных методом Post и отсылаются на сервер методом Apply Updates. Для включения механизма кэширования измененных данных свойству CachedUpdates компонентов ТТаЫ е и TQuery присваивается значение True.

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

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

Компонент TSession Компонент TSession реализует текущий сеанс работы с базой данных и пред назначен для управления всеми соединениями с базами данных. Компонент создается автоматически при запуске приложения. Явное использование ком понента может быть продиктовано необходимостью создания многопоточных приложений баз данных. Компонент также может быть применен для управ ления настройками псевдонимов и драйверов.

Свойство SessionName определяет имя сеанса. Компоненты TTable, TQuery и TData base связываются с компонентом TSession через свойство Session, в котором указывается название сессии, определенной программистом. Свойства сессии, заданной компонентом TSession, действуют на все связанные с ним компоненты TDatabase.

Свойство Databases содержит массив связанных компонентов TDatabase. При помощи этого свойства можно получить доступ к активным базам данных, с которыми установлено соединение. А свойство DatabaseCount показывает ко личество связанных баз данных.

Методы GetDatabaseNames и GetAl iasNames возвращают списки драйверов и псев донимов баз данных. Метод GetAl i a sP a rams позволяет разработчику получить 74 УрокЗ. Технологии доступа к данным параметры данного псевдонима. А метод GetTabieNames возвращает имена таб лиц, содержащихся в обрабатываемой базе данных.

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

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

Имя базы данных, с которой связывается хранимая процедура, содержится в свойстве DatabaseName. А имя хранимой процедуры содержится в свойстве StoredProcName. При разработке в инспекторе объектов значение свойства вы бирается из списка хранимых процедур, получаемого с сервера при соедине нии с базой данных.

В свойстве Params содержится массив входных и выходных параметров дан ной хранимой процедуры. Метод ParamByName возвращает параметр процеду ры, если методу передано наименование этого параметра. А метод ЕхесРгос инициирует выполнение хранимой процедуры на сервере.

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

Стоит рассмотреть небольшой пример использования хранимых процедур.

В качестве сервера будет использован InterBase, поставляющийся вместе с Delphi. На форму нужно поместить компоненты TDatabase, TStoredProc, TMemo и кнопку TBitBtn. При установке InterBase создает псевдоним для доступа к ло кальному серверу — IBLocal. Он указывает на демонстрационную базу дан ных EMPLOYEE.GDB. Этот псевдоним надо выбрать в списке Al iasName компонента TDatabase. Свойству DatabaseName компонента TDatabase нужно присвоить зна чение MyTestDB. В свойстве Params потребуется ввести два параметра, как ука зано в табл. 3.3.

Таблица 3.3. Параметры, содержащие логин и пароль для доступа к серверу Interbase Key Value USER NAME SYSDBA PASSWORD masterkcy Указанные имя пользователя и пароль устанавливаются сервером по умолча нию и в дальнейшем могут быть изменены. Для свойства LoginPrompt нужно установить значение Fal se. В результате сервер не будет заправшивать логин и пароль при каждом соединении. Затем необходимо установить соединение BE D с базой данных. Для этого достаточно свойству Connected присвоить значение True.

Пришло время связать компоненты TDatabase и TStoredProc. Для этого в свой стве DatabaseName компонента TStoredProc нужно выбрать из списка значение MyTestDB. Теперь в свойстве StoredProcName надо выбрать из списка хранимую процедуру O G C A T В методе-обработчике кнопки останется ввести код, пред R _ HR.

ставленный в листинге 3.2.

Листинг 3.2. Использование компонента TStoredProc procedure TForml.ExecBtnClick(Sender: TObject);

var I : Integer;

begin with StoredProcl do begin StoredProcl.ExecProc;

Memol.Lines.Clear;

for I:= 0 to ParamCount - 1 do begin Memol.l_ines.Add(Params[I].AsString);

end;

end;

end;

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

Uorporate Headqi№t«s Bender, Oliver H.

CEO г Запрос Рис. 3.12. Пример вызова хранимой процедуры Компонент TUpdateSQL Компонент TUpdateSQL может быть использован для модификации (добав ления, изменения, удаления) данных на сервере с помощью операторов SQL.

Компонент содержит методы-обработчики, в которых можно определить на бор команд, выполняющихся при вызове методов Insert, Delete, Update компо нентов TQuery и ТТаЫе.

Компонент UpdateSQL может быть связан с компонентами TQuery и ТТаЫе через их свойство UpdateObject, в котором указывается имя компонента. Если исполь Урок 3. Технологии доступа к данным зуется кэширование данных, то в процессе выполнения транзакции, иниции рованной методом ApplyUpdates при выполнении вставки, удаления или изме нения записи, выполняется заранее определенная последовательность SQL операторов. Если кэширование не используется, то выполняется немедлен ная модификация данных при вызове метода Post.

Компонент содержит старые значения полей, которые имело поле до внесе ния в него изменений, в полях с приставкой «OLD». Например:

U D T "Country.db" P AE (Name, Capital. Continent) V L E (:Name, :Capital. :Continent) AU S W E E :OLD_Name = "Rangoon" HR Параметр O D Name содержит старое значение поля, по которому запись будет L обновлена.

Для управления каждым отдельным обновлением внутри транзакции, пере носящей данные из кэша на сервер, можно использовать событие OnUpdateRecord соответствующего компонента с помощью параметров UpdateKind и UpdateAction.

Рассмотрим пример использования данного компонента. Для начала потребу ется создать новый проект. В него нужно будет добавить модуль данных, и в мо дуле разместить компоненты TQuery, TUpdateSQL и TDataSource. Созданный модуль данных нужно сохранить с именем UpdateModul e. Компонент TQuery должен по лучить имя Modi fyQuery, a TDataSource — Modi fySource. В примере будет исполь зоваться созданная ранее база данных, содержащая информацию о студентах.

В свойстве DatabaseName компонента TQuery нужно выбрать из списка псевдоним TestAlias. В свойстве S L нужно ввести строку SELECT * F O Students.DB.

Q RM Затем для компонента нужно активировать режим кэширования. Компонент TQuery потребуется связать с компонентом TUpdateSQL через свойство Update Object. Двойной щелчок на компоненте TUpdateSQL активирует редактор SQL запросов (рис. 3.13).

DdiaMod.llpdateSQL (DdlaMDd.ModilyQuery) Options | SQL j : • SQL Generation • • Key Fields: Update E ;

Table Name:

I jstudents.db se GROUP DATAPOSTUP i Get Iabte Fields [Jalaset Detau&s i Ptmary Keys :] Select Pt generate SQL \ ' Quote Field Names Caned Рис. 3.13. Редактор запросов BE D Редактор имеет две вкладки — Options и SQL. На вкладке Options можно опре делить общие критерии и сгенерировать модифицирующий запрос. Кнопкой Select Primary Keys в поле Key Fields будут выбраны ключевые поля, по которым будут выбираться записи для внесения изменений. В списке Update Fields ука заны поля, изменения которых будут внесены в набор данных или в которые будут добавлены данные. При нажатии на кнопку Dataset Defaults будут вы браны все поля в обоих списках. Кнопкой Generate SQL будут сгенерированы соответствующие SQL-операторы. После генерации SQL-операторов нужно связать компонент TDataSource с компонентом TQuery через свойство DataSet.

Модуль данных надо подключить к форме. Для этого в секции Implementation надо добавить строку подключения uses UpdateModule;

Теперь на форме надо разместить компонент TDBGrid и связать его с компонен том TDataSource. Потребуется еще настроить заголовки таблицы и разместить на форме три кнопки. В них будут вызываться методы Delete, Post и ApplyUpdates.

В листинге 3.3 приведен код, содержащийся в методах-обработчиках.

Листинг 3.3. Код методов-обработчиков procedure TForml.DeleteBtnClick(Sender: TObject);

begin DataMod.Modi fyQuery.Delete;

end:

procedure TForml.PostBtnC1ick(Sender: TObject):

begin DataMod.Modi fyQuery.Post;

end;

procedure TForml.SaveBtnClick(Sender: TObject);

begin DataMod.Modi fyQuery.ApplyUpdates;

end;

На рис. 3.14 показано окно демонстрационного приложения.

Т Ир.имер использования компонент >даекг. j Группа j Дата поступления] Кузнецов 4 02.03. 1арнонов 35:12.02. Норбеков 3* 11.11. Петров Удалить | Принять ;

Сохранить < -.•...,.. ••..,....y..v~.~.,..,.wyy..y...y,>..y ••••—•—- ••-••••—>• Рис. 3.14. Использование компонента TUpdateSQL УрокЗ. Технологии доступа к данным Компонент TBatchMove Этот компонент обеспечивает копирование данных из одной таблицы в дру гую. Таблица-источник указывается в свойстве Source. Таблица, в которую копируются данные, указывается в свойстве Destination. Свойство Mode опре деляет тип перемещения данных:

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

Pages:     || 2 | 3 | 4 | 5 |   ...   | 8 |



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.