Existen muchos sistemas administradores de base de datos en el mercado. Estos sistemas se pueden dividir en dos grupos: las tradicionales bases de datos relacionales que usan el lenguaje SQL para consultar y manipular datos, y el segundo grupo, las bases de datos NoSQL que no solo usan SQL como método para acceder y administrar los datos. En cada proyecto particular podemos preferir determinado DBMS por sus capacidades y ventajas competitivas.
En una base de datos relacional tenemos una colección de tablas (relaciones) que están constituidas por filas. Una fila puede tener una o varias columnas. Una o varias filas de una tabla pueden estar enlazadas a una o varias filas de otra tabla formando una relación entre datos.
Por ejemplo, suponiendo un sitio web para un blog cuya base de datos tiene
dos tablas: la tabla post
y la tabla comment
. La tabla post
tendría las
columnas id
, title
, content
, author
y date_created
y la tabla comment
tendría las columnas id
, post_id
, author
, content
y date_created
.
La tabla post
se relaciona con la tabla comment
de uno-a-muchos porque
una publicación tiene cero o más comentarios (muchos) mientras que un determinado
comentario pertenece a una sola publicación.
Las tablas mencionadas arriba con sus columnas y relaciones se muestran abajo en la figura D.1.
En el marcado existe un número mayor de base de datos relacionales. Entre ellas están: MySQL, PostgreSQL, Oracle, Microsoft SQL Server, etc.
Cada sistema de base de datos tiene sus características específicas que no tienen otros DBMS. Por ejemplo:
SQLite está diseñado como un extensión incluida en el motor de PHP y no necesita instalación pero solo trabaja bien en sitios simples.
MySQL es un sistema libre que es muy simple de instalar y administrar. Es bueno para sistemas de pequeña y mediana escala.
Commercial Oracle DBMS tiene como objetivo principal sistemas de gran escala y tiene herramientas de administración sofisticadas.
PostgreSQL soporta grandes bases de datos y se puede considerar como un reemplazo de software libre y código abierto de Oracle.
La biblioteca Doctrine se diseñó para trabajar con las principales bases de datos mediante el uso de un interfaz de programación unificada. Esta interfaz de programación se implementa en dos niveles:
A bajo nivel, Doctrine provee un mecanismo unificado para construir consultas SQL para cualquiera de las bases de datos relacionales soportadas y manipular el esquema de la base de datos. Este mecanismo se implementa en el componente Database Abstraction Layer (DBAL).
A alto nivel, el componente Object Relacional Mapper (ORM) de Doctrine provee la capacidad de consultar y administrar bases de datos de una manera orientada a objetos asociando las tablas a clases PHP. Además, este componente provee un lenguaje de consulta a base datos propio llamado DQL que permite construir consultas con el estilo orientado a objetos.
Generalmente usamos la API que provee el componente de alto nivel ORM. Al mismo tiempo podemos fácilmente usar el componente de bajo nivel DBAL si consideramos que es necesario para nuestras necesidades particulares.
Doctrine es independiente de la base de datos. En teoría cuando usamos Doctrine somos capaces de abstraernos del tipo de base de datos y cambiar entre bases de datos más fácilmente que cuando usamos una solución dependiente de una base de datos.
Cuando usamos un sistema de base de datos relacional generalmente usamos el lenguaje SQL como una manera estándar para acceder a los datos de la base de datos y administrar el esquema de base de datos. Sin embargo, cada DBMS generalmente tiene una extensión específica del lenguaje SQL (dialecto).
La biblioteca Doctrine se diseño para trabajar con todos los principales sistemas de bases de datos relacionales que usan el lenguaje SQL, pero es obvio que solo soporte un subconjunto de su funcionalidad y de las capacidades del lenguaje SQL.
Doctrine se construye sobre la principal extensión PDO de PHP (y otras extensiones
de PHP para base de datos como sqlite
, mysqli
, oci8
, etc.) Estas extensiones
proveen controladores para todos los principales sistemas de base de datos
relacionales. Especificamos el controlador adecuado a usar cuando configuramos
la conexión a la base de datos.
Si no estamos familiarizados con SQL, un buen lugar para aprender su sintaxis es W3Schools Tutorials.
53) La extensión PHP Data Objects (PDO) define una interfaz ligera y consistente para acceder a la base de datos con PHP. Para hacerlo de una manera independiente de la base de datos PDO usa el concepto de controladores de base de datos. Cada controlador de base de datos que implementa una interfaz PDO puede proveer las características específicas de la base de datos como funciones regulares de la extensión.
Como el componente Object Relational Mapper de Doctrine se diseñó para trabajar con objetos en lugar de tablas, este provee su propio lenguaje de consulta "orientada a objetos" llamada DQL 54. Es similar a SQL en el sentido de que permite escribir y ejecutar consultas en la base de datos pero el resultado del la consulta es un arreglo de objetos en lugar de un arreglo de columnas de tabla.
54) DQL significa Doctrine Query Language.
En contraste con los sistemas de base de datos relacionales un sistema de base de datos NoSQL, como su nombre lo sugiere, usa no solo métodos SQL para acceder a los datos. Esto significa que cada sistema NoSQL puede proveer sus propios métodos y API para acceder y manipular datos. Técnicamente, las bases de datos NoSQL se pueden dividir en los siguientes grupos:
Base de datos documental. Una base de datos de documentos funciona con el concepto documentos y sus campos. Por ejemplo, esto es útil si tenemos un árbol de documentos jerárquico en un sistema de gestión de contenidos (CMS). Los documentos se asocian en la base de datos por medio de una llave única que representa al documento. Otra característica que define a una base de datos documental, más allá de la llave de búsqueda que se usa para recuperar el documento, es que la base de datos ofrece una API o lenguaje de consulta que permite recuperar el documento basado en su contenido.
Base de datos en columna. Frecuentemente se usan para indexar en la web. Una sistema de gestión de base de datos orientada a columnas guarda los datos de una tabla en secciones de una columna y no en filas. En contraste con los principales sistemas de gestión de base de datos que guardan los datos en filas. Los SGBD en columna ofrecen ventajas para los sistemas de almacén de datos (data warehouses), customer relationship manager (CRM), catálogos de biblioteca y otras sistemas de información ad hoc donde el total se calcula en base a un gran número de datos similares.
Base de datos llave-valor. Este es el más simple almacenamiento de datos y usa una llave única para acceder a un dato determinado. Tales sistemas de base de datos proveen para el mecanismo de busque un simple par: llave-valor.
Entre otros.
Doctrine provee soporte solo para el subconjunto de Bases de Datos Documentales de entre los sistemas de base de datos NoSQL. Los sistemas de almacenamiento en columnas y el llave-valor tienen un campo específico de aplicación y no son cubiertas por Doctrine.
Doctrine soporta algunas bases de datos documentales NoSQL: MongoDB, CouchDB, OrientDB y PHPCR.
Por ejemplo en un sitio web para un blog tendríamos un documento llamado post
y un documento llamado comment
. El documento post
tendría los campos id
,
title
, content
, author
y date_created
; y el documento comment
tendría
los campos id
, author
, content
y date_created
. Esto es muy similar a las
tablas que tendríamos in una base de datos relacional.
En este libro no discutiremos sobre la API que provee Doctrine para las bases de datos NoSQL. Si queremos aprender sobre estas características debemos revisar las secciones correspondientes de la documentación de Doctrine.