Построение РБД (1088287), страница 2
Текст из файла (страница 2)
Заполнение базы данных информацией
Когда база данных описана и для ее хранения выделено пространство на физическом носителе, можно начинать заполнение базы данных информацией. То, каким путем это делается, зависит от требования приложений и возможностей СУБД. В лучшем случае все данные уже находятся в формате, воспринимаемом компьютером, а в СУБД имеются возможности и средства, позволяющие упростить импорт данных с магнитных носителей. В худшем случае все данные должны вводиться вручную через клавиатуру с помощью прикладных программ, созданных разработчиками «с нуля». Большинство ситуаций, где необходимо конвертирование данных, находятся в промежутке между этими двумя крайними случаями.
Когда данные введены, необходимо проверить их корректность. Такая проверка утомительна и требует больших трудозатрат, однако она весьма важна. Зачастую, особенно в больших базах данных, есть смысл в написании специальных программ для проверки данных. Преимущества от использования этих программ вполне окупят время и деньги, затраченные командой разработчиков на их создание. Такие программы занимаются тем, что подсчитывают количество строк в различных категориях, вычисляют контрольные суммы, выполняют проверки допустимости значений данных и другие процедуры контроля.
Манипулирование реляционными данными
Мы обсудили проектирование реляционных баз данных и способы, при помощи которых структура базы данных описывается для СУБД. До сих пор, говоря об операциях с отношениями, мы рассуждали в обобщенной и интуитивной манере. Такая манера хороша, пока речь идет о проекте, но для реализации приложений нам нужен четкий и непротиворечивый язык, выражающий логику обработки. Такие языки носят название языков манипулирования данными (data manipulation languages, DML).
Категории языков манипулирования реляционными данными
На сегодняшний день предложено четыре стратегии манипулирования реляционными данными. Первая из стратегий, реляционная алгебра (relational algebra), определяет операторы, действующие на отношения (они подобны операторам высшей алгебры +, — и т. д.). Эти операторы позволяют манипулировать отношениями для достижения желаемого результата. Но реляционная алгебра трудна в использовании, отчасти потому, что она является процедурной. Это значит, что при использовании реляционной алгебры мы должны знать не только то, что мы делаем, но и то, как это делается.
Реляционная алгебра не используется в коммерческих системах обработки баз данных. Хотя ни одна коммерчески успешная СУБД не включает в себя инструментарий реляционной алгебры, мы будем обсуждать ее здесь, поскольку это поможет яснее представить себе манипулирование реляционными данными и заложит основу для изучения SQL.
Реляционное исчисление (relational calculus) — вторая стратегия манипулирования реляционными данными. Реляционное исчисление не является процедурным; оно представляет собой язык, выражающий то, что мы хотим сделать, без указания на то, как этого достичь. Вспомните переменную интегрирования в интегральном исчислении: эта переменная принимает значения из того диапазона, по которому происходит интегрирование. В реляционном исчислении есть подобная переменная. В кортежио-реляционном исчислении областью значений этой переменной являются кортежи отношения, а в доменно-реляционном исчислении — значения домена. В основе реляционного исчисления лежит область математики, называемая исчислением предикатов.
Если вы не собираетесь становиться теоретиком реляционной технологии, вам, скорее всего, не понадобится изучать реляционное исчисление. Оно никогда не используется в коммерческих системах обработки баз данных, и в его изучении для наших целей нет необходимости. Таким образом, мы не будем обсуждать его в этой книге.
Хотя реляционное исчисление трудно для понимания и использования, его непроцедурный характер является преимуществом. Поэтому разработчики СУБД начали поиск других непроцедурных стратегий, который привел к появлению третьей и четвертой категорий языков манипулирования реляционными данными.
Языки, ориентированные на преобразования (transform-oriented languages), — это класс непроцедурных языков, которые преобразуют входные данные, имеющие вид отношений, в результат, представляющий собой одно отношение. В этих языках имеются простые в использовании структуры, позволяющие указать действия, которые необходимо совершить с предоставленными данными. SQUARE, SEQUEL и SQL — это примеры языков, ориентированных на преобразования.
Четвертая категория языков манипулирования реляционными данными — это графические языки. К этой категории относятся запрос по образцу (Query-by-Example) и запрос из формы (Query-by-Form). В числе продуктов, поддерживающих эту категорию, можно упомянуть Approach (фирмы Lotus) и Access. Пользователю выдается графическое представление одного отношения или более. Представление может иметь вид формы для ввода данных, электронной таблицы или какой-либо другой структуры. СУБД преобразует представление в соответствующее отношение и формирует запросы (скорее всего, на SQL) от лица пользователя. После этого пользователи инициируют выполнение операторов DML, по они об этом не знают. Четыре категории языков манипулирования реляционными данными:
♦ реляционная алгебра;
♦ реляционное исчисление;
♦ языки, ориентированные на преобразования (например, SQL);
♦ запрос по образцу, запрос из формы.
Интерфейсы языков манипулирования данными
В этом разделе мы рассмотрим четыре вида интерфейсов, с помощью которых осуществляется манипулирование информацией в базе данных.
Манипулирование данными посредством форм
В большинстве реляционных СУБД имеются средства для создания форм. Некоторые формы генерируются автоматически при определении таблицы, другие должны создаваться разработчиком. Помощь в этом процессе может оказать интеллектуальный ассистент, присутствующий, например, в Access. Форма может иметь вид таблицы (электронной таблицы), в которой одновременно показываются несколько строк отношения. Есть и другой вид форм, где каждая строка отношения представляется отдельно. На рис. 4 и 5 приведены примеры обоих типов форм для таблицы PATIENT с рис. 1. Большинство продуктов обеспечивают некоторую гибкость в обработке форм и отчетов. Например, строки для обработки могут выбираться по значениям столбцов и могут быть отсортированы. Таблица па рис. 4 отсортирована по значению поля AccountNumber.
Рис.4. Пример табличной экранной формы.
Рис.5. Пример однострочной экранной формы.
Многие формы, генерируемые по умолчанию, содержат в себе данные только из одного отношения. Если нужно получить данные из двух или более отношений, тогда, как правило, нужно создавать специальные формы с помощью средств СУБД. Такие средства позволяют создавать как многотабличные, так и многострочные формы. Поскольку использование этих средств сильно зависит от конкретной СУБД, мы не будем рассматривать их далее.
Интерфейс языка запросов и обновлений
Второй тип интерфейса к базе данных — это язык запросов и обновлений (query/ update language), или просто язык запросов (query language). (Хотя большинство такого рода языков позволяют выполнять как запрос, так и обновление данных, их чаще всего называют языками запросов.) В этом случае пользователь вводит команды, которые указывают, какие действия необходимо произвести над базой данных. СУБД расшифровывает эти команды и выполняет предписанные действия. Рисунок 6 показывает, какие программы участвуют в обработке запроса.
Рис.6. Программы, участвующие в обработке запроса.
Важнейшим из всех языков запросов является SQL. Чтобы дать вам представление о языках запросов, рассмотрим следующий SQL-оператор, который обрабатывает отношение PATIENT, показанное на рис. 1:
Этот оператор извлекает из отношения PATIENT все строки, в которых атрибут Physician имеет значение 'Levy'. Значения атрибутов Name и DateOf Birth из этих строк он затем помещает во вторую таблицу.
Хранимые процедуры
Со временем пользователи и разработчики баз данных обнаружили, что некоторые последовательности команд SQL приходится выполнять регулярно. Единственное, что при этом меняется, — это значения, указываемые в предложении WHERE. Например, при ежемесячном начислении платежей выполняются одни и те же SQL-операторы, но с различной датой закрытия. Чтобы учесть эту потребность, производители СУБД ввели так называемые хранимые процедуры (stored procedures). Такая процедура представляет собой набор SQL-операторов, который хранится в файле и может быть запущен на выполнение одной командой. Параметры, указываемые в предложении WHERE и т. д., могут передаваться при вызове процедуры. Примером может служить следующее:
Эта строка запускает хранимую процедуру под названием BILLING со значением параметра BILLDATE, равным "9/1/2000".
По мере накопления разработчиками опыта выявилась одна проблема. SQL создавался как подъязык данных, и при этом не делалось попыток наделить его всеми элементами полноценного языка программирования. Однако некоторые из этих элементов были необходимы для написания хранимых процедур, и производители СУБД создали расширенные версии SQL, включив в них дополнительные возможности. Один такой язык, PL/SQL, был разработан для Oracle, а еще один, под названием TRANSACT-SQL, — для SQL Server.
Специальный тип хранимой процедуры — триггер (trigger) — вызывается СУБД при выполнении заданного условия. Например, в приложении, обрабатывающем заказы, разработчик должен создать триггер, который запускается в тех случаях, когда количество товара на складе оказывается ниже заданного предела (то есть пора заказывать товар у оптового поставщика).
Интерфейс прикладных программ
Четвертый тип интерфейса доступа к данным — это доступ через прикладные программы, написанные на таких языках программирования, как COBOL, BASIC, Perl, Pascal и С++. Кроме того, некоторые прикладные программы пишутся на встроенных в используемые СУБД языках. Из таких языков программирования наибольшей известностью пользуется dBASE.
Есть два стиля интерфейса между прикладными программами и СУБД. Первый из них характеризуется тем, что прикладные программы вызывают подпрограммы из библиотеки функций, поставляемой в комплекте с СУБД. Например, чтобы считать строку из таблицы, прикладная программа вызывает функцию чтения СУБД и передает ей параметры, которые указывают нужную таблицу, требуемые столбцы, критерии выбора строки и т. п.
В некоторых случаях вместо вызовов функций используется объектно-ориентированный синтаксис. В приведенном ниже коде Access объектный указатель db устанавливается на открытую в данный момент базу данных, а объектный указатель rs ссылается на строки таблицы PATIENT;
С помощью последнего указателя можно обращаться к свойствам открытого набора записей и запускать его методы. Например, с помощью свойства rs.AllowDeletions можно определить, могут ли быть удалены записи из набора записей PATIENT. Метод MoveFirst перемещает курсор на первую строку.
Второй, более старый тип интерфейса используется иногда в СУБД, предназначенных для больших ЭВМ и серверов. Здесь производителем СУБД определен набор высокоуровневых команд доступа к данным. Эти команды, которые относятся к обработке базы данных и не являются частью какого-либо стандартного языка, встраиваются в код прикладной программы.
Прикладная программа со встроенными командами передается на предварительный компилятор, входящий в комплект СУБД. Он транслирует операторы доступа к данным в корректные вызовы функций и определяет области данных, которые будут совместно использоваться прикладными программами и СУБД. Предварительный компилятор также вставляет в программу код, поддерживающий доступ к этим областям данных. Обработанная таким образом программа передается на языковой компилятор. На рис. 7 показано взаимодействие программ в этом процессе.
Рис.7. Обработка программы со встроенными операторами SQL.
Помимо использования в обработке запросов, SQL применяется в качестве языка доступа к данным в прикладных программах. В этом режиме операторы SQL встраиваются в программы и транслируются в вызовы функций предварительным компилятором. Тем самым уменьшается количество времени и денег, требуемое на обучение персонала, поскольку один и тот же язык может использоваться как для запросов, так и для доступа к данным в прикладных программах. Необходимо, однако, преодолеть одно неудобство. Язык SQL ориентирован на преобразования: он принимает на входе одно или несколько отношений, манипулирует ими и выдает на выходе результирующее отношение. Таким образом, за один прием обрабатывается одно отношение. Почти все прикладные программы ориентированы на работу со строками (записями), то есть они считывают одну строку, обрабатывают ее, считывают следующую строку и т. д. Программы, следовательно, обрабатывают по одной строке за прием. В результате имеется несоответствие н базовой ориентации SQL и языков, на которых пишутся прикладные программы. Чтобы компенсировать это несоответствие, прикладные программы предполагают, что результаты выполнения SQL-операторов являются файлами. Чтобы проиллюстрировать это, предположим, что в прикладную программу встроен приведенный ниже SQL-оператор (тот, который мы уже рассматривали ранее):