Apéndice B Introducción a las bases de datos y al lenguaje MySQL. Puesto que el presente proyecto está íntimamente relacionado con las bases de datos, en este apéndice se presenta una breve introducción a este método de almacenamiento y consulta de información y a uno de los lenguajes de gestión de bases de datos más relevantes hoy en día: el lenguaje MySQL. El apartado B.1 contiene una visión general sobre la teoría de bases de datos, mostrando los conceptos fundamentales de las mismas, mientras que el apartado B.2 contiene una introducción al lenguaje MySQL. B.1.- Bases de datos [5] Una base de datos no es más que un conjunto organizado de datos que es utilizado por determinadas aplicaciones para consultar y/o almacenar información. Una base de datos por sí sola carece de sentido si no está respaldada por un sistema que permita al usuario interactuar con dicha base de datos. 173 Proyecto Fin de Carrera B.1.1.- Sistema de bases de datos Una sistema de bases de datos es un sistema informatizado cuyo propósito es el almacenamiento y la consulta de datos. Está formado por cuatro componentes fundamentales: - Datos: es la información almacenada, que es compartida por todos los usuarios de la base de datos. - Hardware: está compuesto por las unidades de almacenamiento, en las que residen físicamente los datos almacenados, y por todos los dispositivos necesarios para llevar a cabo las operaciones de entrada/salida requeridas por los procesos de actualización y consulta de la base de datos. El hardware constituye la capa física del sistema de bases de datos. - Software: está compuesto por todas las aplicaciones que operan entre el usuario final y la capa física de la base de datos. El conjunto de aplicaciones del sistema de bases de datos es conocido como Sistema de Gestión de la Base de Datos (DataBase Management System – DBMS). Todas las peticiones de actualización y consulta de la base de datos que hacen los usuarios del sistema son manejadas por el DBMS. La función principal que proporciona el DBMS es, por tanto, posibilitar que el usuario del sistema pueda despreocuparse de cómo está estructurada la capa física y de cómo tiene que interactuar con ella para efectuar las operaciones que desea. En otras palabras, el DBMS proporciona al usuario una visión del sistema que está por encima del nivel hardware y que soporta las operaciones demandadas por él. - 174 Usuarios: existen tres tipos fundamentales de usuarios: - Programador de aplicaciones: este tipo de usuario escribe aplicaciones que interaccionan con la base de datos. Estas aplicaciones realizan todas las operaciones posibles que se pueden llevar a cabo con los datos: consultan, eliminan, agregan y actualizan información en la base de datos. Todas las operaciones mencionadas se implementan a través de instrucciones que realizan las peticiones oportunas al sistema de bases de datos. - Usuario final: este tipo de usuario interactúa con el sistema de bases de datos a través de las aplicaciones desarrolladas por el programador de aplicaciones o a través de lenguajes propios de los sistemas de bases de datos. Haciendo uso de estos lenguajes, el usuario final puede ejecutar comandos de alto Apéndice B. Introducción a las bases de datos y al lenguaje MySQL nivel como, por ejemplo, seleccionar determinados datos (mediante el comando SELECT) o insertar nuevos datos (mediante el comando INSERT). - Administrador del sistema de bases de datos: este tipo de usuario es el gestor principal del sistema de bases de datos. Entre sus tareas más relevantes están las siguientes: decidir la información que va a almacenar la base de datos, decidir la estructura de almacenamiento de la información y la estrategia de acceso a la misma, gestionar el acceso de los usuarios (usuarios autorizados y permisos de accesibilidad de cada usuario, fundamentalmente), definir la política de seguridad que se va a mantener frente a usuarios hostiles y definir la política que se va a seguir para asegurar la integridad de los datos. El administrador del sistema de bases de datos es comunmente conocido por su acrónimo inglés: DBA (DataBase Administrator). B.1.2.- ¿Por qué almacenar los datos en un sistema de bases de datos? Las ventajas que presenta un sistema de bases de datos frente a un sistema tradicional de almacenamiento de información son las siguientes: - Compactibilidad: para almacenar una determinada cantidad de información, el espacio físico que requiere un sistema de bases de datos es notablemente menor que el que requieren otros sistemas de almacenamiento. Esto es debido a que el sistema de bases de datos almacena la información de forma organizada. - Velocidad: el modo en que se encuentra almacenada la información en un sistema de bases de datos permite modificar o consultar dicha información con una rapidez considerablemete superior a la que se alcanza en otros sistemas de almacenamiento en los que la información se agrupa sin ninguna estructura. - Precisión: la información contenida en la base de datos está actualizada y puede ser consultada en cualquier momento. - Multiusuario: el sistema de bases de datos puede ser utilizado por varios usuarios simultáneamente. - Control centralizado: el control centralizado está representado por la persona o grupo de personas que ejercen las funciones de DBA. El control centralizado ofrece, fundamentalmente, las siguientes ventajas: 175 Proyecto Fin de Carrera - Posibilidad de reducir la redundancia de los datos: cuando no se utiliza un sistema de bases de datos, las aplicaciones que hacen uso de la misma información necesitan tener almacenada dicha información en ficheros particulares, empleándose parte de la capacidad de almacenamiento disponible en albergar exactamente los mismos datos. Sin embargo, si las aplicaciones acceden a un sistema de bases de datos común, la redundacia de información se eliminaría completamente, lo que supone, en la mayoría de los casos, un importante ahorro del espacio de almacenamiento disponible. Aún así, no siempre es deseable eliminar completamente la redundacia que pueda existir en la información almacenada. En algunas ocasiones existen motivos técnicos para mantener cierto nivel de redundancia, aunque ésta debe estar muy controlada. - Posibilidad de eliminar la inconsistencia de los datos: esta ventaja es derivada del anterior. Cuando existe redundancia en la información almacenada y esta redundancia no es controlada, puede suceder que una actualización afecte sólo a una parte de la información redundante, lo que daría lugar a que entradas de la base de datos que antes de llevar a cabo la actualización eran idénticas sean distintas una vez que dicha actualización se ha ejecutado. Esto es lo que se conoce como inconsistencia de la base de datos. Si finalizado el proceso de actualización se realiza una consulta a la base de datos, es probable que ésta suministre datos erróneos, ya que la información almacenada es inconsistente. Por tanto, si se elimina la redundancia en la base de datos, se elimina la posibilidad de que dicha base de datos pueda ser inconsistente. En el caso de que la redundancia existente en la base de datos esté controlada, es el DBMS el que asegura la consistencia de dicha base de datos. Un método para asegurar la consistencia de la base de datos en el caso de que exista redundancia en la información almacenada consiste en aplicar la propagación de actualizaciones (propagating updates), que se basa en actualizar todas las entradas redundantes cuando sea actualizada cualquiera de ellas. - 176 Posibilidad de compartir los datos: esto implica que las aplicaciones existentes pueden compartir la información almacenada en la base de datos y que las nuevas aplicaciones que se desarrollen pueden operar con esta misma información, eliminando la necesidad de que cada nueva aplicación cree Apéndice B. Introducción a las bases de datos y al lenguaje MySQL nuevos datos, lo que implica un importante ahorro en el espacio de almacenamiento disponible. - Posibilidad de aplicar restricciones de seguridad: debido a que el DBA tiene una jurisdicción completa sobre el sistema de bases de datos los datos, puede asegurar que sólo los usuarios autorizados acceden al contenido de la base de datos. - Posibilidad de mantener la integridad de los datos: la integridad de una base de datos consiste en la capacidad de la misma para almacenar datos precisos; por tanto, un ejemplo de falta de integridad en una base de datos es la existencia en la misma de varias entradas que almacenen los mismos datos. No obstante, la falta de integridad puede persistir incluso si se elimina completamente la redundacia de información en la base de datos, ya que es posible que se introduzca información errónea involuntariamente cuando se lleva a cabo un proceso de actulización. Para evitar la introducción de errores durante los procesos de actualización, el DBA establece determinados controles que se disparan cada vez que se ejecutan estos procesos. B.1.3.- Independencia de los datos Una de las características más relevantes de un sistema de bases de datos es la independencia de los datos almacenados frente al modo en que éstos son almacenados físicamente. En la actualidad, numerosas aplicaciones son dependientes de los datos que necesitan para ejecutarse. En dichas aplicaciones, el modo en el que se organizan los datos en las unidades de almacenamiento y las técnicas de acceso a los mismos están integrados en el código fuente. Se dice que la aplicación es dependiente de los datos porque no es posible alterar la estructura de almacenamiento de los datos (cómo se almacenan los datos físicamente) ni la estrategia de acceso a los mismos sin modificar el código fuente de la aplicación que utiliza dichos datos. En un sistema de bases de datos se evita a toda costa que las aplicaciones sean dependientes de los datos. Esto se debe a dos motivos fundamentales: - Las diferentes aplicaciones pueden necesitar diferentes visiones de los mismos datos. Es posible que en un entorno de trabajo existan aplicaciones que operen con los mismos datos pero en formatos distintos. 177 Proyecto Fin de Carrera Por ejemplo, pueden existir dos aplicaciones que utilicen los mismos datos pero que una de ellas opere con números en formato decimal y la otra, en binario. Si se quisiera eliminar la redundancia de los datos y para ello se decidieran integrar los dos conjuntos de ficheros utilizados por ambas aplicaciones en un único conjunto de ficheros, habría que modificar las aplicaciones para que todas operaran con los números en el mismo formato. En un sistema de bases de datos, el DBMS realiza todas las conversiones necesarias en el formato de los datos, evitándose de este modo que el código fuente de las aplicaciones que hacen uso de la información contenida en la base de datos sea dependiente del formato de esta información. - El DBA tiene libertad para modificar la estructura de almacenamiento y/o la estrategia de acceso a los datos. El DBA puede optar en cualquier momento por variar la estructura de almacenamiento debido a que, por ejemplo, se introduzcan nuevas clases de datos o se adopten nuevos estándares. También puede optar por variar la estrategia de acceso a los datos debido a que aparezcan en el mercado nuevos sistemas de almacenamiento. Estos factores hacen que, en caso de que las aplicaciones que se estén usando sean dependientes de los datos, haya que modificar el código fuente de todas las aplicaciones cuando se lleva a cabo alguna de las variaciones mencionadas. Por estos dos motivos, el lugar y el modo en que está almacenada la información en un sistema de bases de datos es transparente para las aplicaciones de dicho sistema, por lo que en estos sistemas se prefiere utilizar siempre aplicaciones independientes de los datos. B.1.4.- Los tres niveles de la arquitectura ANSI/SPARC La arquitectura de bases de datos propuesta por el Comité de Requisitos y Planificación de Sistemas del Instituto Nacional de Estándares Norteamericano (American National Standards Institute/Systems Planning And Requirements Committee - ANSI/SPARC) está dividida en tres niveles: 178 - El nivel interno: es el nivel más cercano al dispositivo de almacenamiento físico. Este nivel se ocupa del modo en el que se almacenan los datos. - El nivel externo: es el nivel más cercano a los usuarios finales. Este nivel se ocupa del modo en el que los datos almacenados son visualizados por cada uno de estos usuarios. Apéndice B. Introducción a las bases de datos y al lenguaje MySQL - El nivel conceptual: es el nivel intermedio entre los dos anteriores. Este nivel se ocupa de mostrar los datos almacenados mediante una representación común a todos los usuarios. La figura B.1 muestra gráficamente la distribución de los tres niveles anteriores. Figura B.1. Niveles de la arquitectura ANSI/SPARC. La figura B.2 muestra un ejemplo práctico en el que se pueden ver los tres niveles de la arquitectura ANSI/SPARC. PRODUCTION ACCOUNT Struct Withdraw{ Struct Worker{ char code[3] char id[3] int salary char Skill[20] } } Employee Employee_number character(6) Employee_skill character(20) Salary numeric(5) Stored_emp LENGTH=18 Prefix type=BYTE(6), OFFSET= 0 Emp# type=BYTE(6), OFFSET= 6, index=emp# Skill type=BYTE(20), OFFSET= 12 Pay type=FULLWORD, OFFSET=32 Æ Nivel externo Æ Nivel conceptual Æ Nivel interno Figura B.2. Niveles de la arquitectura ANSI/SPARC. Ejemplo práctico. Como se desprende de la observación de las dos figuras anteriores, pueden existir varias vistas externas de la información contenida en la base de datos, cada una de ellas constituida por una representación abstracta del fragmento de información que le sea útil a un determinado usuario. Sin embargo, sólo existe una vista conceptual de los datos, constituida por una representación abstracta del total de la información contenida en la base de datos. 179 Proyecto Fin de Carrera B.1.4.1.- El nivel externo El nivel externo es el primer nivel de la arquitectura ANSI/SPARC. En este nivel se localizan todos los lenguajes que utilizan los distintos usuarios para comunicarse con el sistema de bases de datos. Cada tipo de usuario, exceptuando el DBA, interactúa con este sistema a través de un lenguaje diferente: - El programador de aplicaciones: este usuario puede utilizar cualquiera de los lenguajes de programación existentes, como por ejemplo Java, PHP, C o C++, entre otros. - El usuario final: este usuario puede utilizar tanto lenguajes de consulta (query languages) como lenguajes basados en formularios o menús. Todos los lenguajes que utilizan los diferentes usuarios incluyen un sublenguaje para el tratamiento de datos (data sublanguage – DSL). Este subjeguaje es un subconjunto del lenguaje completo y está desarrollado específicamente para el tratamiento de bases de datos. El DSL es la combinación de otros dos lenguajes: - Lenguaje de definición de datos (data definition language – DDL): proporciona la capacidad necesaria para definir o describir objetos de la base de datos (por ejemplo, la definición de una nueva vista de los datos). - Lenguaje de manipulación de datos (data manipulation lenguaje – DML): proporciona la capacidad para dar soporte a la manipulación o procesamiento de los objetos de la base de datos (por ejemplo, la realización de una consulta a la base de datos). El DSL más extendido hoy en día es SQL (Structured Query Language). B.1.4.2.- El nivel conceptual El nivel conceptual es el segundo nivel de la arquitectura ANSI/SPARC. La vista conceptual es una representación de toda la información contenida en la base de datos. Esta representación es independiente de la forma en la que los datos están físicamente almacenados. La vista conceptual se describe a través del esquema conceptual (conceptual schema), formado por definiciones de cada una de las diferentes entidades conceptuales que componen la base de datos 180 Apéndice B. Introducción a las bases de datos y al lenguaje MySQL (tablas, campos que constituyen estas tablas y relaciones que existen entre las diferentes tablas). El esquema conceptual está escrito mediante un lenguaje especial de definición de datos: el DDL conceptual. Debido a que en los sistemas de bases de datos se mantiene la independencia de los datos1, las definiciones conceptuales establecidas a través el DDL conceptual sólo son definiciones de la información contenida en la base de datos y no tienen ninguna relación con la estructura de almacenamiento de dicha información o con las estrategias que se siguen para acceder a la misma. Según lo anterior, la vista conceptual es una visión del contenido total de la base de datos, mientras que el esquema conceptual es la definición de dicha vista. El esquema conceptual también establece restricciones de seguridad y de integridad de los datos almacenados en la base de datos. B.1.4.3.- El nivel interno El nivel interno es el tercer nivel de la arquitectura ANSI/SPARC. La vista interna es una representación a bajo nivel de la base de datos completa y está formada por múltiples ocurrencias de los diferentes tipos de entidades internas que componen dicha base de datos; en otras palabras, la vista interna es una representación de la estructura de almacenamiento de los datos. La vista interna está descrita a través del esquema interno (internal schema). Este esquema no sólo contiene definiciones de los diferentes tipos de entidades internas existentes, sino que también especifica cómo se representan dichas entidades y cuál es la secuencia física de almacenamiento de las mismas. El esquema interno está escrito mediante otro DDL especial: el DDL interno. B.1.4.4.- Mapeo Existen dos mapeos diferentes en una base de datos: uno entre el nivel conceptual y el interno y otro entre el nivel externo y el conceptual. 1 Para obtener información acerca de la independencia de los datos, véase el apartado B.1.3.- Independencia de los datos, pág. 177. 181 Proyecto Fin de Carrera El mapeo entre el nivel conceptual y el interno establece la correspondencia entre la vista conceptual y la vista interna, es decir, establece el modo en el que las entidades conceptuales son representadas en el nivel interno. Este mapeo tiene la misión de aislar el nivel conceptual del nivel interno y preservar de este modo la independencia de los datos. Así, si se realizara cualquier modificación en el nivel interno (por ejemplo, si se modificara la estructura de almacenamiento de datos), el mapeo entre los niveles conceptual e interno debería ser también modificado adecuadamente, permitiendo que el esquema conceptual permaneciera invariable. El mapeo entre el nivel externo y el nivel conceptual establece la correspondencia entre una vista externa particular y la vista conceptual. Al ¡gual que el mapeo entre los niveles conceptual e interno, este mapeo tiene la misión de aislar el nivel externo del nivel conceptual para preservar la independencia de los datos. B.1.5.- Arquitectura servidor/cliente En la actualidad, los sistemas de bases de datos están estructurados en arquitecturas servidor/cliente. En la máquina que actúa como servidor se encuentra alojada la base de datos y el DBMS, que gestiona todas las operaciones relacionadas con la base de datos. En la máquina que actúa como cliente se encuentran las aplicaciones que el usuario final utiliza para realizar las acciones que considere necesarias sobre la base de datos. Estas aplicaciones pueden ser proporcionadas por el propio DBMS, como generadores de informes sobre el estado de la base de datos o lenguajes de consulta, o pueden ser aplicaciones desarrolladas por terceros que hagan uso de la información contenida en bases de datos. La comunicación entre las máquinas servidor y cliente suele ser a través de redes locales o de internet. B.1.6.- El modelo relacional de datos El modelo relacional de datos, lanzado por IBM en la década de 1960, es el modelo de más aceptado actualmente para la representación y manejo abstracto (mediante tablas) de bases de datos, aunque poco a poco se están imponiendo los modelos orientados a objetos. Este modelo, que está construido sobre una sólida base matemática, se basa en los siguientes principios: 182 Apéndice B. Introducción a las bases de datos y al lenguaje MySQL - Los datos son representados como conjuntos de relaciones. - Cada relación es representada mediante una tabla. - Cada columna de una determinada tabla representa un atributo. - El conjunto de todos los valores posibles que puede tomar un determinado atributo constituye el dominio de dicho atributo. - Cada fila de una determinada tabla, también llamada tupla, representa una entidad. - Cada tabla posee un conjunto irreducible de atributos que referencian unívocamente cada entidad de dicha tabla. A este conjunto de atributos se le llama primary key. El modelo relacional de datos asegura la integridad de los datos imponiendo restricciones que deben cumplir dichos datos antes de ser insertados en cualquier tabla que forme parte de la base de datos. Este modelo dispone de dos lenguajes para operar con los datos: - Álgebra relacional: es el conjunto de operaciones posibles que se pueden realizar en las tablas. - Cálculo relacional: es el lenguaje de consulta que se utiliza para operar con la base de datos. La tabla siguiente muestra las expresiones formales propuestas en el modelo relacional y las expresiones informales equivalentes: Expresión formal Relacion Tupla, Entidad Cardinalidad Atributo Grado Primary Key Dominio Expresión informal Tabla Fila Número de filas Columna Número de columnas Identificador único Conjunto de valores posibles que puede tomar un determinado atributo Tabla B.1. Correspondencia entre las expresiones formales propuestas en el modelo relacional de datos y las expresiones informales equivalentes. Así mismo, la figura siguiente muestra un ejemplo práctico en el que se puede apreciar el uso de la terminología expuesta en la tabla B.1: 183 Proyecto Fin de Carrera Figura B.3. Terminología propuesta en el modelo relacional de datos. Ejemplo práctico. B.2.- El lenguaje MySQL [6] El lenguaje MySQL es una implementación basada en código abierto del lenguaje SQL. Este lenguaje permite realizar todas las operaciones que son posibles en una base de datos, es decir, permite crear y eliminar tablas, introducir y eliminar datos en tablas existentes y realizar consultas. En los siguientes subapartados se estudian brevemente las acciones más comunes que se pueden ejecutar sobre una base de datos mediante el lenguaje MySQL2. B.2.1.- Crear una tabla Para crear una tabla se utiliza el comando CREATE, cuya sintaxis básica es la siguiente: CREATE TABLE `table_name` ( `attribute_1_name` attribute_1_type [NULL|NOT NULL][UNIQUE] [DEFAULT 'default_value'] [PRIMARY KEY] [REFERENCES tableref_1_name(atributeref_1)], ... `attribute_n_name` attribute_n_type [NULL|NOT NULL][UNIQUE] [DEFAULT 'default_value'] [PRIMARY KEY] [REFERENCES tableref_n_name(atributeref_n)], [PRIMARY KEY (attribute_1_key,..., attribute_n_key)]) donde: 2 Para obtener información detallada acerca de todas las acciones que se pueden llevar a cabo en una base de datos mediante el lenguaje MySQL, veáse la página web oficial de MySQL en www.mysql.com. 184 Apéndice B. Introducción a las bases de datos y al lenguaje MySQL - NULL: si está presente en algún atributo, indica que dicho atributo puede tomar un valor nulo en alguna o en todas las tuplas. Está presente por defecto en todos los atributos de la tabla. - NOT NULL: si está presente en algún atributo, indica que dicho atributo no puede tomar un valor nulo en ninguna tupla. - UNIQUE: si está presente en algún atributo, indica que el sistema debe impedir que dos o más tuplas de la tabla contenga el mismo valor para dicho atributo. - PRIMARY KEY: indica los atributos de la tabla que constituyen la clave primaria de la misma. La clave primaria es obligatoriamente UNIQUE y NOT NULL. - DEFAULT: si está presente en algun atributo, indica el valor por defecto que toma dicho atributo en caso de que no se especifique ningún valor. B.2.2.- Insertar datos en una tabla Para insertar datos en una tabla se utiliza el comando INSERT INTO, cuya sintaxis básica es la siguiente: INSERT INTO table_name (atrribute_1, atrribute_n, ..., atrribute_n) VALUES (value_1, value_2, ..., value_n) B.2.3.- Eliminar datos de una tabla Para eliminar datos de una tabla se utiliza el comando DELETE, cuya sintaxis básica es la siguiente: DELETE FROM table_name WHERE <condition_1> [AND|OR <condition_2> [AND|OR <condition_3> ... [AND|OR <condition_n>]...]] Las condiciones que se establecen para seleccionar los datos tienen la siguiente sintaxis: attribute [=][!=][LIKE][<][<=][>][>=] value donde se especifica únicamente un operador que relacione el atributo con el valor. 185 Proyecto Fin de Carrera B.2.4.- Seleccionar datos de una tabla Para seleccionar datos de una tabla se utiliza el comando SELECT, cuya sintaxis básica es la siguiente: SELECT attribute_1, ..., attribute_n FROM table_name WHERE <condition_1> [AND|OR <condition_2> [AND|OR <condition_3> ... [AND|OR <condition_n>]...]] Las condiciones que se establecen para seleccionar los datos tienen la siguiente sintaxis: attribute [=][!=][LIKE][<][<=][>][>=] value donde se especifica únicamente un operador que relacione el atributo con el valor. En caso de que se deseen seleccionar todos los atributos de las tuplas que cumplan las condiciones especificadas, se puede sustituir la lista completa de atributos por el carácter asterisco. 186