Обсуждая вопрос практического написания приложений, взаимодействующих с реляционными базами данных (см. раздел 4.7.1), мы обнаружили один любопытный факт: для пользовательского приложения очень важна обработка не реляционного отношения в целом, как множества неупорядоченных строк, а именно каждой отдельной строки. Для этого служат функции DB_next, DB_prev и прочие, позволяющие перемещаться по строкам. При этом возможен доступ к значениям полей только одной строки, той которая является "текущей". Такой подход к манипулированию данными, при котором пользователь (или его программа) явно различает "предыдущие" и "последующие" строки и может управлять перемещением указателя от одной строки к другой, получил название навигационного (напомним, что навигационный подход типичен для сетевых и иерархических СУБД).
Ясно, что без навигационного подхода при создании клиентского приложения обойтись невозможно, в то же время для взаимодействия с сервером базы данных предлагается язык SQL как более эффективный. Однако, существует ряд СУБД, в которых навигационный подход распространен и на манипулирование хранимыми данными. Такие системы (dBase, FoxPro, Paradox) появились в начале 80-х годов и были предназначены для создания небольших однопользовательских приложений.
Рассмотрим кратко язык xBase, который поддерживается такими СУБД как dBase, FoxPro, Clipper и, возможно, некоторыми другими. Помимо собственно процедурных операторов (цикл, условие и т.п.) он включает операторы создания пользовательского интерфейса (меню, окна, экранные формы,...). Для работы с данными служит следующий набор команд:
USE AUTHORS /* Открыть таблицу authors */ GO TOP /* Перейти на первую запись */ DO WHILE .NOT.EOF() /* Выполнять цикл пока не будет достигнут конец таблицы */ PRINT AUTHOR /* Напечатать содержимое поля author */ SKIP /* Перейти на следующую запись */ ENDDO /* Конец цикла */ APPEND BLANK /* Добавить пустую запись. Она автоматически становится текущей */ REPLACE AU_ID WITH 90, AUTHOR WITH "L.Pinter" /* Изменить значения полей текущей записи */
Данные персональных СУБД хранятся в обычных файлах (как правило, каждая таблица в отдельном файле), средств описания ограничений целостности не существует. Следовательно, описание данных отделено от самих данных (находится в обрабатывающей программе), поэтому не гарантируется единый способ интерпретации данных для всех пользователей.
С развитием компьютерных сетей персональные СУБД стали переходить в разряд многопользовательских. При этом файлы данных размещались на разделяемом сетевом диске. Однако, создание достаточно больших приложений (10-20 одновременно работаюших пользователей) показало, что в этом случае резко снижается производительность и возникают проблемы с поддержанием целостности (точнее с изоляцией пользователей, подробнее см. следующий параграф). Поэтому, в настоящее время практически все персональные СУБД дополнены средствами доступа к SQL-серверам (как правило, с использованием ODBC). Теперь они могут служить не только средством для создания небольших локальных приложений, но и для разработки клиентских рабочих мест в архитектуре "клиент-сервер".