Уровень абстракции, или абстрактного представления, базы данных - это интерфейс, который предоставляет ряд функций для работы с различными базами данных независимо от способа их реализации. Изменив внутренний интерфейс уровня абстракции базы данных, можно легко перейти, например, с формата MySQL на формат Oracle. В языке Perl таким уровнем является DBI (DataBase Interface), а в библиотеке PHPLib - уровень абстрактного представления базы данных, организованный в классе DB_Sql.
Переносимость
Для профессионального программиста, создающего Web-приложения, возможность абстрактного представления базы данных может быть очень полезной и важной. Основой каждого приложения является некая модель данных - множество структур данных, ориентированных на решение наиболее общих задач. Модель данных во многих случаях реализуется непосредственно в базе данных. Пакет PHP поддерживает множество различных баз данных; каждая из них располагает своим интерфейсом прикладных программ. На основе такого программного интерфейса невозможно обеспечить разработку программ, независимых от конкретной базы данных и операционной системы. Если вы не будете использовать некий уровень абстракции, примером которого может служить библиотека PHPLib, то при переводе приложения с MySQL на Oracle вам придется проделать тяжелую работу. В табл. 6.1 представлены различия между программными интерфейсами баз данных в различных системах.
Конечно, вы не меняете СУБД каждую неделю, поэтому данный вопрос может иметь для вас не очень большое значение. Даже если вы работаете с библиотекой PHPLib, но изначально не предусмотрели возможность переноса базы данных в другую систему, переносимость останется для вас несбыточной мечтой. Как показывает опыт, проблема заключается не в переносе программного интерфейса, а в переносе специфических функций работы с базами данных. Вы можете написать по-настоящему переносимый код для работы с базой данных, только если полностью откажетесь от применения специфических функций реляционных СУБД, но в этом случае вы кончите тем, что самостоятельно напишете аналогичные функции, иначе ваша программа окажется невыносимо медлительной и из рук вон плохо управляемой.
Таблица 6.1. Интерфейсы прикладных программ, реализованные в СУБД MySQL и Oracle
Описание | MySQL | Oracle 7 |
---|---|---|
Соединить (connect) | mysql_connect() | ora_logon() |
Запрос (Query) | mysql_query() или mysql_db_query() | ora_parse(), затем ora_exec() |
Получить следующую строку в результирующем наборе записей | mysql_fetch_array() | Работает со смещениями: ora_columnname(), ora_getcolumn() |
Получить количество строк в результирующем наборе записей | mysql_num_rows() | Невозможно, потому что Oracle возвращать строки до того, как узнает общее количество строк в результирующем файле |
Получить ключевой идентификатор последней вставленной строки | mysql_insert_id() | Соответствующая функция в пакете PHP отсутствует |
Если вашей целью является создание переносимого кода, вы должны за километр обходить все специфические черты конкретных баз данных. Библиотека PHPLib может несколько упростить вашу задачу: в ней, к примеру, предусмотрены механизмы встроенной последовательной обработки записей и блокировки таблиц, которые не зависят от базы данных. Недавно разработчики библиотеки PHPLib добавили к ней класс Query, который предназначен для абстрагирования простых запросов (вставки, обновления, инструкций WHERE и некоторых других; такие запросы обычно составляют примерно 80 % общего числа запросов, адресованных базе данных), что позволяет сделать их независимыми от базы. В настоящее время данный класс работает только с СУБД MySQL и Oracle, начиная с версии 7.
Уровень абстракции базы данных библиотеки PHPLib предоставляет еще две возможности, которые не менее важны, чем экономия времени при выполнении повседневных операций и переносимость приложений. Эти возможности рассматриваются ниже.