На рынке существует много систем управления базами данных (СУБД). Эти системы можно разделить на две группы: традиционные реляционные базы данных, использующие язык 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. Таблицы и взаимосвязь между ними. Один пост имеет много комментариев
На рынке реляционных баз данных довольно большое количество крупных представителей. Среди них: SQLite, MySQL, PostgreSQL, Oracle, Microsoft SQL Server и т.д.
У каждой из них есть свои собственные функции, которых нет у других СУБД. Так, например:
SQLite разработана как встроенное расширение PHP-движка и не требует установки, однако хорошо работает только с простыми сайтами.
MySQL - бесплатная система, очень проста в установке и администрировании. Подходит для использования в системах малого и среднего размера;
Коммерческая СУБД Oracle направлена, в основном, на крупномасштабные системы и имеет сложные инструменты администрирования;
PostgreSQL поддерживает БД любого размера и может считаться open source-аналогом Oracle.
Библиотека Doctrine предназначена для работы со всеми крупными базами данных с помощью унифицированного интерфейса программирования. Этот интерфейс программирования реализован на двух уровнях.
На нижнем уровне Doctrine предоставляет единый механизм для построения SQL-запросов к любой поддерживаемой реляционной БД и управления схемой БД. Этот механизм реализован в компоненте Database Abstraction Layer (DBAL, абстрактный уровень базы данных).
На высшем уровне компонент ORM (объектно-реляционный проектор) обеспечивает возможность запрашивать и управлять данными БД объектно-ориентированным способом, устанавливая соответствие между таблицами и PHP-классами. Этот компонент также предоставляет свой собственный язык запросов, DQL, позволяющий строить запросы в объектно-ориентированном стиле.
Как правило, используется API, предоставляемый компонентом ORM. В то же время вы вполне можете работать с компонентом нижнего уровня DBAL, если находите его более подходящим для ваших проектов.
Doctrine не зависит от конкретной базы данных. Теоретически, при использовании Doctrine вы абстрагируетесь от типов БД и переключаетесь между базами гораздо проще, чем при использовании зависимых от БД решений.
При использовании реляционной базы данных, как правило, используют язык 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 (not only SQL) системы - как следует из их названия - используют другие методы доступа к данным. Это значит, что каждая NoSQL система может иметь свои собственные методы и API для доступа к данным и управления ими. Формально NoSQL базы данных можно разделить на следующие группы:
Документные хранилища. Документо-ориентированная база данных использует понятие документов и их полей. Это полезно, например, если у вас есть иерархическое дерево документа в системе управления содержимым. Документы обращаются к базе через ключ, уникальный для каждого документа. Одна из других определяющих характеристик документо-ориентированных БД возможность - помимо простого поиска пар документ-ключ для извлечения документа - использовать API или язык запросов для извлечения документов, основываясь на их содержимом.
Колоночные хранилища. Часто используются в веб-индексировании. Колоночные (или столбцовые) СУБД - это системы управления базами данных, которые хранят данные по колонкам (столбцам), а не по строкам, как это делают большинство реляционных СУБД. Колоночные СУБД имеют преимущества для хранилищ данных, систем управления взаимоотношениями с клиентами (customer relationship management systems или CRM systems), библиотечных каталогов и других подобных справочных систем, где агрегаты вычисляются из большого количества похожих элементов данных.
Хранилища типа «ключ-значение». Эти хранилища самые простые. Они используют уникальные ключи для доступа к определенным данным. Такие системы БД предоставляют простой механизм поиска пар ключ-значение.
и другие.
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.