3.2. Создание базы данных Visual FoxPro

В языке Visual FoxPro есть два основных пути доступа к данным и два способа их организации. Способами доступа являются: традиционная для Visual FoxPro навигация от записи к записи и более современные реляционные методы, основанные на SQL (Structured Query Language) - языке структурированных запросов. Организовать данные вы можете либо в автономные таблицы, либо в базу данных Visual FoxPro. Однако учтите: если вы оформляете их в виде автономных таблиц, то в значительной мере теряете контроль над управлением этими данными. Важно знать эти варианты, так как каждый из них имеет свои преимущества, и вы можете их сопоставлять и комбинировать. В данной книге будут использованы все четыре варианта, которые лежат в основе технологии разработки баз данных в Visual FoxPro.

Visual FoxPro объединяет в себе две основные парадигмы доступа в базах данных: навигационную и реляционную. Эти методы часто чередуют, поэтому полезно знать, что из себя представляет и в каких ситуациях подходит каждый из них. Навигационный доступ основывается на физическом или логическом порядке данных, проходя их от начала к концу или наоборот. Вы помещаете указатель где-нибудь в файле данных и получаете доступ к данным соответствующей записи. Чтобы работать с другими данными, вы переходите к той записи, где они расположены.

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

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

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

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

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

Многообразие программного обеспечения баз данных может слегка обескураживать. Его архитектура сильно варьируется в зависимости от времени его создания, а также от технических и программных платформ, на которых это программное обеспечение основано. Важно различать системы баз данных, берущие начало от больших ЭВМ или систем UNIX, и те, которые появились только на персональных компьютерах. В свою очередь, базы данных для персональных компьютеров ведут свое происхождение от программ баз данных, которые тогда существовали. Поэтому имеет смысл посмотреть, какие же базы данных имелись к тому времени, когда впервые появились базы данных для персональных компьютеров.

Когда персональные компьютеры стали повсеместно использоваться для хранения баз данных, было принято делить большие системы баз данных на три основные категории: иерархические, сетевые и реляционные. Четвертый тип, объектно-ориентированные базы данных, появился позднее.

В иерархических системах данные организованы в древовидную структуру, где каждый узел дерева содержит определенный тип данных. В иерархической базе данных, чтобы достигнуть любого узла, вы начинаете с корня, следуете указателю и спускаетесь до нужного уровня. Вы перемещаетесь по системе запись за записью, следуя включенным в них указателям, чтобы получить необходимые данные. Иерархические системы довольно эффективны, однако они часто содержат избыточные данные Кроме того, для получения доступа к любым данным надо проходить через корневой узел, а это не всегда удобно. Иерархические системы баз данных - такие, как IMS/VS, которая принадлежит IBM - представляют старейшее поколение систем баз данных и берут свое начало от больших ЭВМ.

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

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

Е.Ф. Кодд, создатель реляционной модели, основывался на прикладной теории множеств, что позволило ему подготовить для своей разработки солидную теоретическую основу. Реляционная модель быстро получила признание, поскольку по своим потенциальным возможностям превосходила все остальные. Правда, до 1980-х годов она не имела особого коммерческого успеха и редко применялась на практике. Однако впоследствии почти все новые программы баз данных создавались как реляционные - или, по крайней мере, претендовали на это. Так было вплоть до появления объектно-ориентированных баз данных в 1990-х годах. Подавляющее большинство баз данных, которые используются сегодня, построены по реляционной модели.

Visual FoxPro имеет сложную родословную. Он относится к семейству программных продуктов, которые, в свою очередь, ведут свое происхождение от dBASE II. Построенный по реляционной модели, dBASE II хранил данные в независимых таблицах, без видимых для пользователя указателей. Для файлов данных, где хранились эти таблицы, было выбрано расширение DBF - сокращение от DataBase File (файл базы данных). Однако для управления данными dBASE II использовал навигационные команды перемещения.

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

Вскоре фирма Nantucket представила компилятор Clipper, эффективно клонировав dBASE III+, a Fox Software произвела свой клон FoxBase+. Все эти продукты баз данных для персональных компьютеров сначала стали известны как «семейство dBASE», а позже - как «семейство xBase».

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

Следующий важный шаг вперед для разработчиков на языке Fox произошел в 1990-х годах, когда компания Fox Software ввела SQL-команду Select в версию FoxPro 2.O. Программисты и пользователи FoxPro наконец получили возможность выбирать между навигационным и реляционным доступом к данным. С тех пор была проделана большая работа по дальнейшему внедрению SQL в FoxPro.

Недавно в язык Visual FoxPro была включена концепция Контейнера базы данных. Это весьма значительное расширение реляционных функциональных возможностей для структуры файлов DBF. Контейнер базы данных дает разработчикам множество средств - таких, как ссылочная целостность и хранимые процедуры. Эти средства являются стандартными в реляционных базах данных.

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

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

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

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

Хотя Visual FoxPro является объектно-ориентированным языком программирования, его база данных прочно основывается на реляционной модели и не имеет особенностей объектно-ориентированной базы данных. Поэтому, чтобы лучше понять структуру и функции Контейнера баз данных Visual FoxPro, вам нужно иметь представление о реляционной модели.

Что, кроме названия, делает конкретную базу данных реляционной? Ее соответствие реляционной модели базы данных - вот наиболее часто применяемый критерий. Иногда возникают довольно упорные дебаты по поводу того, каким условиям должна удовлетворять база данных, чтобы ее можно было считать реляционной. Е.Ф. Кодд предложил набор из 12 правил, по которым должен оцениваться продукт. В результате комплексной оценки у Visual FoxPro 6,5 балла из 12. Замечу, что у Oracle – 8,5 баллов.

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

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

Перейдем к конкретным действиям по созданию базы данных. Запустите Microsoft Visual FoxPro на вашем компьютере и воспользуйтесь одним из трех способов.

·       В окне менеджера панели задач (Task Pane Manager) на его первой вкладке Start выберите ссылку New Database. На экране дисплея появится окно Create. Перейдите в папку DBF,  в которой мы будем хранить данные, задайте имя базы данных – Real Estate. Нажмите кнопку Сохранить. База данных получила свое название и законное место на жестком диске.

·       В главном меню Visual FoxPro щелкните пункт File и выберите команду New. В открывшемся окне щелкните радиокнопку Database и нажмите кнопку New file. На экране дисплея появится окно Create. Перейдите в папку DBF,  в которой мы будем хранить данные, задайте имя базы данных – Real Estate. Нажмите кнопку Сохранить.

·       Введите в командном окне (Command) команду Create Database. На экране дисплея появится окно Create. Перейдите в папку DBF, в которой мы будем хранить данные, задайте имя базы данных – Real Estate. Нажмите кнопку Сохранить.

Теперь в папке DBF появилось три файла – так называемый контейнер базы данных. Это файлы:

Real Estate.dbc

Real Estate.dct

Real Estate.dcx

Отличительной особенностью Microsoft Visual FoxPro является то, что один объект этой СУБД размещается в нескольких файлах (от одного до трех). Расширения других файлов, используемых Visual FoxPro, будут рассмотрены нами позднее в соответствующих главах.