A free and open-source book on ZF3 for beginners


Doctrine и системы управления базами данных

На рынке существует много систем управления базами данных (СУБД). Эти системы можно разделить на две группы: традиционные реляционные базы данных, использующие язык SQL для обработки запросов и управления данными, и NoSQL базы данных ("not only SQL" - не только SQL), использующие ряд других подходов. В каждом отдельном проекте можно выбрать оптимальную для него СУБД вследствие ее возможностей и конкурентных преимуществ.

Реляционные базы данных

Реляционная база данных (от англ. relation - «отношение», «зависимость», «связь») содержит набор таблиц (отношений), состоящих из строк. Строка в свою очередь может иметь один или несколько столбцов. Строка (или строки) может быть связана со строкой (или строками) другой таблицы, тем самым формируя взаимосвязь между данными.

Например, предположим, что у вас есть сайт в виде блога, и его БД содержит две таблицы: таблицу post и таблицу comment. У таблицы post будут столбцы с именами id, title, content, author, date_created; у таблицы comment - id, post_id, author, content и date_created. Эти таблицы связаны по типу "один-ко-многим", так как один пост может иметь ноль или больше (гораздо больше) комментариев, в то время как комментарии могут принадлежать лишь одному посту.

Эти таблицы, а также их столбцы и взаимосвязь показаны ниже на рисунке Г.1.

Рисунок Г.1. Таблицы и взаимосвязь между ними. Один пост имеет много комментариев Рисунок Г.1. Таблицы и взаимосвязь между ними. Один пост имеет много комментариев

На рынке реляционных баз данных довольно большое количество крупных представителей. Среди них: SQLite, MySQL, PostgreSQL, Oracle, Microsoft SQL Server и т.д.

У каждой из них есть свои собственные функции, которых нет у других СУБД. Так, например:

Библиотека Doctrine предназначена для работы со всеми крупными базами данных с помощью унифицированного интерфейса программирования. Этот интерфейс программирования реализован на двух уровнях.

  1. На нижнем уровне Doctrine предоставляет единый механизм для построения SQL-запросов к любой поддерживаемой реляционной БД и управления схемой БД. Этот механизм реализован в компоненте Database Abstraction Layer (DBAL, абстрактный уровень базы данных).

  2. На высшем уровне компонент ORM (объектно-реляционный проектор) обеспечивает возможность запрашивать и управлять данными БД объектно-ориентированным способом, устанавливая соответствие между таблицами и PHP-классами. Этот компонент также предоставляет свой собственный язык запросов, DQL, позволяющий строить запросы в объектно-ориентированном стиле.

Как правило, используется API, предоставляемый компонентом ORM. В то же время вы вполне можете работать с компонентом нижнего уровня DBAL, если находите его более подходящим для ваших проектов.

Doctrine не зависит от конкретной базы данных. Теоретически, при использовании Doctrine вы абстрагируетесь от типов БД и переключаетесь между базами гораздо проще, чем при использовании зависимых от БД решений.

SQL против DQL

При использовании реляционной базы данных, как правило, используют язык SQL, как стандартный способ доступа к данным БД и управления ее схемой. Однако, каждая СУБД обычно имеет свои собственные расширения языка SQL-запросов (диалекты).

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

Doctrine построена на основе PDO 53, расширения PHP (и других расширений для работы с БД, таких как sqlite, mysqli, oci8, и др.). Эти расширения предоставляют драйвера для всех крупных систем реляционных БД. Вы указываете, какой драйвер использовать, при настройке подключения к базе данных.

Если вы еще не знакомы с SQL, хороший способ изучения его синтаксиса это руководства W3Schools.

53) PDO (PHP Data Objects - объекты данных PHP) - это расширение, определяющее простой и согласованный интерфейс для доступа к базам данных в PHP. Чтобы не зависеть от конкретной БД, PDO использует концепцию драйверов баз данных. Каждый драйвер, реализующий интерфейс PDO, позволяет использовать особенности БД как обычные функции расширения.

Так как компонент ORM предназначен для работы с объектами, а не таблицами, он предоставляет свой собственный "объектно-ориентированный" язык запросов, который называется DQL 54. Он схож с SQL в том, что позволяет писать и выполнять запросы к БД, но результатом запроса в нем является не не массив табличных строк, а массив объектов.

54) DQL расшифровывается как Doctrine Query Language (язык запросов Doctrine).

NoSQL БД

В отличие от реляционных систем БД, NoSQL (not only SQL) системы - как следует из их названия - используют другие методы доступа к данным. Это значит, что каждая NoSQL система может иметь свои собственные методы и API для доступа к данным и управления ими. Формально NoSQL базы данных можно разделить на следующие группы:

Doctrine обеспечивает поддержку только подмножества документных хранилищ систем БД NoSQL. Системы колоночных хранилищ и хранилищ типа «ключ-значение», как правило, используют специфические приложения и не охватываются Doctrine.

Документо-ориентированные базы данных

Doctrine поддерживает большое количество документных хранилищ: MongoDB, CouchDB, OrientDB и PHPCR.

Например, на сайте, где вы ведете блог, у вас будут документы с именами post и comment. У документа post будут поля id, title, content, author, date_created; у документа comment - id, author, content and date_created. Это очень похоже на те таблицы, которые мы рассматривали ранее в реляционной базе данных.

В этой книге мы не будем обращаться к API, предоставляемому Doctrine для документо-ориентированных NoSQL-баз. Если вы хотите узнать об этих возможностях, обратитесь к соответствующим разделам документации проекта Doctrine.


Top