Может кто-нибудь пролить свет на то, что такое DBI и DBD? Когда следует использовать один из них и преимущества использования одного над другим.
В чем разница между DBI и DBD?
Ответы (5)
DBI — это библиотека доступа к базе данных, тогда как DBD — это «драйверы», которые DBI использует для доступа к конкретной базе данных (например, один DBD для MySQL, другой для PostgreSQL и т. д.). Вы должны использовать DBI, а не DBD напрямую.
Из документов DBI:
│←−− Scope of DBI −−→│
┌───┐ ┌─────────────────┐ ┌─────────────────┐
┌─────────┐ │ ├──┤ XYZ Driver ├──┤ XYZ Engine │
│ Perl │ │ │ └─────────────────┘ └─────────────────┘
│ script │ │ A │ │ D │ ┌─────────────────┐ ┌─────────────────┐
│ using ├──┤ P ├──┤ B ├──┤ Oracle Driver ├──┤ Oracle Engine │
│ DBI │ │ I │ │ I │ └─────────────────┘ └─────────────────┘
│ API │ │ ├── ∙∙∙
│ methods │ │ ├── ∙∙∙ Other drivers
└─────────┘ │ ├── ∙∙∙
└───┘
Ячейки с метками XYZ Driver
и Oracle Driver
представляют собой модули DBD.
Итак, ваш код общается с DBI. DBI взаимодействует с соответствующим модулем DBD для вашей базы данных. Модуль DBD взаимодействует с вашей базой данных. Это приводит к единому согласованному интерфейсу к различным базам данных.
DBI — это интерфейс. DBD являются реализациями этого интерфейса.
DBI означает интерфейс базы данных. DBD означает драйвер базы данных.
Как программист, вы всегда должны использовать интерфейс (DBI). Интерфейс, в свою очередь, использует драйвер. Причина использования DBI вместо прямого использования DBD заключается в том, что он обеспечивает согласованный уровень абстракции для работы с базами данных. Существует множество модулей DBD, но вам нужно изучить только один интерфейс. Кроме того, это позволяет относительно легко изменить базу данных, используемую вашим приложением, просто изменив драйвер. Интерфейс такой же. (Синтаксис запроса может немного отличаться.)
Используйте их вместе. Например, с MySQL:
use DBI;
$dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
$dbh = DBI->connect($dsn, $user, $password);
$sth = $dbh->prepare("SELECT * FROM foo WHERE bla");
$sth->execute;
Если вместо этого вы обращаетесь к базе данных Oracle, вам может сойти с рук изменение только аргумента $data_source
на DBI::connect
а>:
$dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user, $password);