Введение

Интерфейс прикладного программирования

Слой абстракции базы данных (DBAL или DAL) — это интерфейс прикладного программирования, который унифицирует взаимодействие между компьютерным приложением и базами данных, такими как SQL Server, IBM Db2, MySQL, PostgreSQL, Oracle или SQLite. Традиционно каждый производитель баз данных предоставляет собственный интерфейс, адаптированный к своим продуктам. Разработчику приложения необходимо самостоятельно реализовывать код для тех интерфейсов баз данных, которые будут поддерживаться приложением. Слои абстракции базы данных снижают объем работы, предоставляя разработчику единый API и максимально скрывая особенности конкретной базы данных за этим интерфейсом. Существует множество слоев абстракции с различными интерфейсами для различных языков программирования. Приложение, использующее такой слой, называется независимым от базы данных.

Физический уровень (наименьший уровень)

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

Концептуальный или логический уровень (средний или следующий за ним)

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

Внешний или уровень обзора

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

Абстракция базы данных в API

Библиотеки унифицируют доступ к базам данных, предоставляя разработчику приложений единый интерфейс программирования низкого уровня. Их основные преимущества – скорость и гибкость, поскольку они не привязаны к конкретному языку запросов (или его подмножеству) и для достижения цели требуется реализовать лишь тонкий слой. Поскольку все диалекты SQL во многом схожи, разработчики приложений могут использовать все возможности языка, возможно, предоставляя настраиваемые параметры для специфических случаев работы с базой данных, например, идентификаторы и учетные данные пользователей. Тонкий слой позволяет выполнять одни и те же запросы и операторы на различных СУБД с минимальными накладными расходами. Слои абстракции баз данных особенно популярны в объектно-ориентированных языках программирования, напоминая слои абстракции уровня API. В объектно-ориентированном языке, таком как C++ или Java, база данных может быть представлена в виде объекта, методы и члены которого (или их аналоги в других языках программирования) отражают различные функциональные возможности базы данных. Они также разделяют преимущества и недостатки интерфейсов уровня API.

Абстракция на языковом уровне

Примером слоя абстракции базы данных на уровне языка может служить ODBC — независимая от платформы реализация слоя абстракции базы данных. Пользователь устанавливает конкретное программное обеспечение драйвера, посредством которого ODBC может взаимодействовать с базой данных или набором баз данных. Затем пользователь получает возможность использовать программы для взаимодействия с ODBC, которая, в свою очередь, передает результаты между пользовательскими программами и базой данных. Недостатком этого уровня абстракции является увеличение накладных расходов, связанных с преобразованием запросов в конструкции, понятные целевой базе данных. В качестве альтернативы существуют тонкие обертки, часто описываемые как легковесные слои абстракции, такие как OpenDBX и libzdb. Наконец, крупные проекты могут разрабатывать собственные библиотеки, например, libgda для GNOME.

В пользу

Период разработки: разработчикам программного обеспечения достаточно знать только API слоя абстракции базы данных, а не все API тех баз данных, которые должно поддерживать их приложение. Чем больше баз данных требуется поддерживать, тем больше времени удается сэкономить. Расширенная потенциальная база пользователей: использование слоя абстракции базы данных означает, что для новых установок не требуется конкретная база данных, то есть новые пользователи, которые не желают или не могут переходить на другие базы данных, могут развертывать приложение на своей существующей инфраструктуре. Защита от устаревания: с появлением новых технологий баз данных разработчикам программного обеспечения не придется адаптироваться к новым интерфейсам. Тестирование разработчиками: для модульного тестирования на уровне разработчиков производственная база данных может быть заменена упрощенной, локальной реализацией данных. Дополнительные возможности базы данных: в зависимости от базы данных и слоя абстракции, DAL может добавлять функции в базу данных. DAL может использовать возможности программирования базы данных или другие методы для создания стандартной, но не поддерживаемой функциональности, или совершенно новой функциональности. Например, DAL в DBvolution реализует функцию стандартного отклонения для нескольких баз данных, которые не поддерживают ее изначально.

Против этого

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