В чем разница между уровнем абстракции базы данных и уровнем доступа к данным? - PullRequest
30 голосов
/ 15 мая 2010

Я на самом деле застрял в 3-х уровневой структуре. Я просмотрел Интернет и нашел две терминологии «Уровень абстракции базы данных» и «Уровень доступа к данным».

В чем различия между ними?

Ответы [ 3 ]

39 голосов
/ 15 мая 2010

Уровень доступа к данным = операции создания, чтения, обновления, удаления (CRUD) для вашего домена приложения

Уровень абстракции данных = выполняет общие операции с базой данных, такие как соединения, команды, параметры, изолирующие вас от библиотек данных конкретного поставщика и обеспечивающие один API высокого уровня для доступа к данным независимо от того, используете ли вы MySQL, Microsoft SQL Server, Oracle, DB2 и т. Д. ..

20 голосов
/ 15 мая 2010

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

Например, слои доступа к данным обычно имеют API, очень похожие на синтаксис SQL, которые все еще требуют знания структуры базы данных для записи:

$Users->select('name,email,datejoined')->where('rank > 0')->limit(10);

Уровни абстракции данных, как правило, представляют собой полноценные ORM (Object-Relational Mappers), которые теоретически исключают необходимость понимания какой-либо базовой структуры базы данных или каких-либо знаний SQL. Синтаксис может быть примерно таким:

Factory::find('Users', 10)->filter('rank > 0');

И все объекты могут быть полностью заполнены всеми полями, возможно, объединены с любыми родительскими или дочерними объектами, если вы установите его таким образом.

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

Если вы имеете в виду данные базовый уровень абстракции, то это будет нечто вроде PDO, так что ваш код можно будет использовать для большего числа поставщиков баз данных. Я полагаю, что PDO работает с MySQL, PostgreSQL и mysqli.

7 голосов
/ 19 января 2013

Из Wiki:

Уровень доступа к данным

Уровень доступа к данным (DAL) в компьютерном программном обеспечении - это уровень компьютерной программы, который обеспечиваетупрощенный доступ к данным, хранящимся в каком-либо постоянном хранилище, таком как объектно-реляционная база данных.

Например, DAL может возвращать ссылку на объект (в терминах объектно-ориентированного программирования) вместе с егоатрибуты вместо ряда полей из таблицы базы данных.Это позволяет создавать клиентские (или пользовательские) модули с более высоким уровнем абстракции.Модель такого типа может быть реализована путем создания класса методов доступа к данным, которые напрямую ссылаются на соответствующий набор хранимых процедур базы данных.Другая реализация может потенциально извлекать или записывать записи в или из файловой системы.DAL скрывает эту сложность базового хранилища данных от внешнего мира.

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

Короче говоря, ваши основные функции CRUD / логика на бизнес-объектах для перетаскивания / извлечения из уровня Persistance / Storage сюда попадает.В большинстве случаев вам может понадобиться именно это. ORM-отображение, интерфейсы бизнес-объектов Model и т. Д. попадают сюда.

Уровень абстракции базы данных

Уровень абстракции базы данных - это интерфейс прикладного программирования, который объединяет взаимодействие между компьютерным приложением и базами данных, такими как SQL Server, DB2,MySQL, PostgreSQL, Oracle или SQLite.Традиционно, все поставщики баз данных предоставляют свой собственный интерфейс, адаптированный к их продуктам, который оставляет программисту приложений возможность реализовывать код для всех интерфейсов баз данных, которые он или она хотели бы поддерживать.Слои абстракции базы данных сокращают объем работы, предоставляя разработчикам согласованный API и максимально скрывая специфику базы данных за этим интерфейсом.Существует множество уровней абстракции с различными интерфейсами на разных языках программирования.

По сути, это дополнительный уровень абстракции, так что вы CRUD против интерфейсов, независимых от поставщика, и меньше беспокоитесь о деталях реализации.различных поставщиков баз данных.Это понадобится вам только в том случае, если вы хотите поддерживать более одной базы данных. ORM, Micro ORM, обертки, универсальные классы драйверов, независимо от имени и т. Д. , которые занимаются установлением соединения, обработкой параметров, выполнением и т. Д.Это просто дополнительный слой перед слоем Persistance / Storage.В трехуровневой терминологии оба эти уровня подпадают под один, поскольку они не являются логически разделенными.


Подводя итог, DAL - это данные, DbAL - это база данных.DAL определяет операции, DbAL работает.DAL стоит за DbAL, который стоит за фактическим Db.DAL вызывает DbAL.DAL - это хорошая вещь, чтобы отделить бизнес-логику (в модели) от логики CRUD, в то время как DbAL редко требуется (но мне это нравится).DAL - это более высокоуровневое проектирование, DbAL - более низкоуровневая архитектура и реализация.Оба разделяют обязанности.ORM - это огромные структуры, которые делают и то, и другое для вас.Я не уверен, как вы разделяете их при использовании ORM.Вам не нужно, так как ORM все это обрабатывает для вас.В идеале, я бы в любом случае имел DAL в одном проекте, а DbAL в другом, который я бы просто назвал слоем постоянства, поскольку нет смысла разделять Db и операции над ним.

...