Поиск

Использование текстовых файлов в качестве базы данных

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

Начнем с хорошего. Использование текстовых файлов для хранения баз данных имеет несколько неоспоримых преимуществ перед более сложными альтернативами, такими как DBM-файлы или системы управления большими базами данных типа Oracle и Sybase. Ниже перечислены некоторые из основных преимуществ текстовых файлов.

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

А теперь, как вы могли догадаться, настала очередь поговорить о плохом. Чтобы разобраться в истоках проблемы, давайте рассмотрим традиционный метод организации баз данных в текстовых файлах. В каждой строке текстового файла обычно хранится одна запись, которая состоит из столбцов данных, называемых полями. Для операционной системы текстовый файл базы данных ничем не отличается от обычного файла — потока текстовых символов, разбитого на строки. Давайте рассмотрим пример простейшей текстовой базы данных.

Этот файл базы данных хранится на диске в виде непрерывного потока символов:

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

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

  • В середину текстового файла нельзя вставить новые данные. При вставке новых записей файл нужно полностью или частично обновлять. Поэтому вставка данных в начало или середину файла автоматически вызывает перезапись расположенных следом данных. Предположим, например, что после записи Борис 555-1212 необходимо вставить запись Сергей 555-613. В результате данные Мария[пробел]555-0912[новая строка] ... нужно сдвинуть к концу файла так, чтобы после записи Борис 555-1212 образовалось место для новой записи Сергей 555-613:

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

  • Приведенные выше замечания справедливы также и для операции удаления записей, которая является обратной вставке данных. Удалить данные из начала или середины файла непросто, поскольку при этом нужноперезаписать оставшуюся часть файла на новое место и удалить образовавшееся свободное место. Предположим, например, что мы хотим удалить запись Мария 555-0912 из исходного файла базы данных. При этом нам нужно сдвинуть к началу файла записи о Павле и Ольге:

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

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

и сохранена в текстовом файле под именем phone.txt, то написать на Perl короткую программу, загружающую содержимое файла в массив, совсем несложно. Вот один из вариантов программы:

В этом примере функция readdata() предназначена для считывания файла phone.txt и помещения его содержимого в массив @DATA. При этом из элементов массива удаляются символы конца строки. Если добавить еще одну функцию, writedata(), записи базы данных можно будет и читать, и модифицировать. Текст функции writedata() выглядит так:

А теперь, чтобы вставить в базу данных новую запись, сначала нужно вызвать функцию readdata(), которая загрузит содержимое файла в указанный массив. После этого для работы с массивом можно использовать функции push, unshift или splice. Завершив все операции с массивом, для сохранения информации в файле вызовите функцию writedata(), как показано в следующем примере:

Чтобы удалить записи из базы данных, примените одну из функций splice, pop или shift к массиву @PHOKELIST, а затем запишите содержимое этого массива в файл. Кроме того, содержимое массива можно отредактировать, например с помощью функции grep, выполнив перебор элементов в цикле:

В этом примере все записи базы данных сначала копируются с помощью функции readdata() из файла в массив @PHONELIST. Затем с помощью функции grep проверяется, не содержат ли элементы массива строку Анн. Те элементы, в которых такая строка не найдена, снова присваиваются массиву &PHONELIST. И в конце этот массив записывается в файл с помощью функции writedata().