3. Depósitos de Datos

En esta sección vamos a considerar tres aspectos. El primero tiene que ver con conceptos básicos de bases de datos, necesarios para entender y manejar la información en el resto del curso. El segundo da unas nociones mínimas de SQL, un lenguaje estándar para manejar información en bases de datos y que usaremos en las aplicaciones hechas en PHP. El tercer y ultimo aspecto es el manejo de las bases de datos con el mini-motor de bases de datos miniSQL.

El objetivo es que al terminar con esta sección se entienda como se interactua con una base de datos en miniSQL. Posteriormente se usaran estos conceptos al crear una aplicación en PHP que use miniSQL como deposito de datos para producir contenido dinámico para el WEB.

Conceptos de Bases de Datos

Para darnos una idea de que es una base de datos, podemos pensar en una pasta de argollas. Allí podemos reunir hojas de diferentes tipos, conteniendo diferentes tipos de información.

Suponga que en una sección va a llevar una libreta de direcciones, que cada hoja de esa sección de la pasta de argollas contiene los datos de una persona, como nombre, dirección, teléfono etc. Esta libreta podría considerarse una base de datos, que se opera manualmente, es decir que se consulta y mantiene manualmente.

Lo que las bases de datos permiten es almacenar conjuntos de datos de forma ordenada facilitando su posterior consulta y mantenimiento.

En nuestro ejemplo es muy fácil manejar la información de 10, 20 o 50 personas, pero cuando este numero aumente la pasta de argollas será inconveniente. En cambio las bases de datos generalmente admiten grandes cantidades de información, permiten la consulta en segundos y permiten complejas consultas sobre los datos que serían muy engorrosas manualmente.

Siguiendo con el ejemplo de la libreta de direcciones examinaremos los conceptos básicos de cualquier sistema de base de datos relacional.

Registros

En cada hoja de la libreta tenemos la información de una persona. Esto es lo que corresponde a un Registro en una base de datos. Si lo miramos como un formulario que hay que llenar vemos que esta compuesto por unos Títulos y unos espacios en blanco.
Ej:

Nombre: 		_________________  
Apellidos: _________________
Telefono: _________________


A los espacios en blanco se les da el nombre de Campos y generalmente los Títulos corresponden a los Nombres de los Campos.

Un registro es entonces un conjunto de campos con información relacionada, en este caso con la información de una persona.




Tablas

Si reunimos todas las hojas con la información personal en una sección, tendremos el equivalente a una Tabla en una base de datos. Una tabla es entonces el conjunto de registros del mismo tipo.




Indices

Para facilitar la búsqueda de información se organizan los datos alfabéticamente por nombre o apellido, por ejemplo. Cuando esto se hace se crea un índice por el nombre o el apellido.

En cada tabla por lo general hay un índice que generalmente identifica de forma única al registro, como por ejemplo el NIT o la Cédula identifica a la persona. Cuando esto es así se le denomina Llave Primaria.




Consultas

Una parte fundamental de las bases de datos es su capacidad de hacer consultas o indagaciones sobre los datos que contienen.

Debe existir un mecanismo que permita decirle a la base de datos cosas como estas:


  • Seleccione todos los clientes que se visitaron este mes
  • Borre los datos de personas cuyos nombres empiecen por A
  • Aguegue un cliente de nombre Luis, Teléfono 3344555,...
  • Cambie el descuento para el cliente de nombre Pedro a 15%


Diferentes fabricantes han creado diversos lenguajes para hacer esto, pero finalmente se estableció un lenguaje como estándar. Este es el SQL (Structured Query Language) un lenguaje propuesto por el matemático de IBM, E.F.Codd a principios de los años 70.

En este curso usaremos algunas instrucciones del SQL que implementa el mini-motor de base de datos miniSQL.














Introducción al SQL

El SQL es un leguaje muy simple y poderoso que permite realizar con una instrucción tareas complejas dentro de una base de datos.

Su uso se extendió a tal punto que se convirtió en estándar y son muchos los manejadores de bases de datos comerciales y no comerciales que soportan este lenguaje o un subconjunto de el.

Para realizar las operaciones básicas de consultar, agregar, modificar y borrar datos de una base de datos usaremos las sentencias de SQL:

  • SELECT
  • INSERT
  • UPDATE
  • DELETE

En los ejemplos usaremos los datos de la tabla Persona que se muestran a continuación:

NombreDireccionTelefonoEmail
Alberto BuendiaCalle 23 # 12 a 343557678[email protected]
Jaime AndradeCalle 13 # 15 346577679[email protected]
Andrea SolarteKra 23 # 12 b 366444279[email protected]
Luis ValverdeKra 19 # 14 a 162466279[email protected]
Monica PérezKra 22 # 4 b 613366579[email protected]
Henry OrdoñezCalle 1a # 12 b 313344579[email protected]
Jorge AristizabalCalle 3a # 6 b 223246572[email protected]
Juan A. SolanoCalle 12 # 17-346456723[email protected]
Pilar GomezCalle 14 # 12-243335722[email protected]
Octavio RuizCalle 21 # 16-123435722[email protected]





Consulta

Para seleccionar todos los registros o un subconjunto de ellos se usa la instrucción SELECT.

SELECT tiene varias componentes que admiten muchas variantes, vamos a examinar mediante ejemplos unas cuantas.

Para seleccionar todos los campos de la tabla Persona la instrucción es:
SELECT * FROM Persona

Para seleccionar Nombre y Teléfono y ordenar alfabéticamente por Nombre:
SELECT Nombre, Teléfono FROM Persona ORDER BY Nombre

El resultado es:
+--------------------------------+--------------------------------+
| Nombre | Teléfono |
+--------------------------------+--------------------------------+
| Alberto Buendia | 3557678 |
| Andrea Solarte | 6444279 |
| Henry Ordoñez | 3344579 |
| Jaime Andrade | 6577679 |
| Jorge Aristizabal | 3246572 |
| Juan A. Solano | 6456723 |
| Luis Valverde | 2466279 |
| Monica Pérez | 3366579 |
| Octavio Ruiz | 3435722 |
| Pilar Gomez | 3335722 |
+--------------------------------+--------------------------------+


Por ejemplo para seleccionar todos los nombres que empiecen por A:
SELECT Nombre FROM Persona WHERE Nombre LIKE 'A%' ORDER BY Nombre
+--------------------------------+
| Nombre |
+--------------------------------+
| Alberto Buendia |
| Andrea Solarte |
+--------------------------------+




Adición

Para agregar registros a una tabla se usa la instruccion INSERT.

Para agregar un registro a la tabla Persona:
INSERT INTO Persona VALUES ('Luis Valverde','Kra 19 # 14 a 16','2466279','[email protected]')



Modificación

La instrucción para modificar datos es UPDATE.

Para cambiar por ejemplo el teléfono de Monica Pérez:
UPDATE Persona SET Telefono='5666672' WHERE Nombre = 'Monica Pérez'



Borrado

Para borrar un registro la instrucción es DELETE.
Para borrar el registro correspondiente a Pilar Gomez la instrucción es:
DELETE FROM Persona WHERE Nombre = 'Pilar Gomez'

Para borrar todos los registros de la tabla Persona:
DELETE FROM Persona



Bases de Datos MiniSQL

MiniSQL es un motor de base de datos de peso ligero disponible vía Internet. Aunque no es gratuito, si se permite su uso para instituciones educativas sin ningún costo.

Por la gran velocidad con que realiza sus operaciones, sus escasos requerimientos y la simplicidad de su implementación es ideal como soporte de base de datos para aplicaciones para el WEB.

Otra de las características interesantes es que está disponible en versiones para UNIX y Win 32, por lo que permite desarrollar aplicaciones usando el entorno Win 32 y luego pasarlas a UNIX para su operación, si se desea.

El costo de este motor es de +- U$300 licencia por servidor, por lo que es muy competitivo si se trata de hacer aplicaciones comerciales.

Aunque sus capacidades son limitadas en virtud de su simplicidad, las tareas que hace, las hace muy bien.

A continuación examinaremos algunos conceptos de manejo que se requieren para la creación de bases de datos usando este motor.




Administración

Para realizar la administración de la base de datos miniSQL provee la utilidad msqladmin.

Las posibilidades que ofrece esta utilidad son:
  • drop base_de_datos Borra la base de datos
  • create base_de_datos Crea la base de datos
  • shutdown Bajar el motor
  • reload Carga nuevamente la configuración
  • version Muestra la versión del motor


Una tarea a realizar es la creación de la base de datos donde estarán contenidas las diferentes tablas.

Para crear la base de datos Libreta que vamos a usar se usa el comando:


C:\msql>msqladm create libreta
Database "libreta" created.

C:\msql>


En caso querer eliminar una base de datos aparecera el siguiente mensaje de confirmación:


C:\msql>msqladm drop libreta

Dropping the database is potentially a very bad thing to do.
Any data stored in the database will be destroyed.

Do you really want to drop the "libreta" database? [Y/N] Y

Database "libreta" dropped
C:\msql>

Con esto se habrá eliminado la base de datos completamente.




Creación de Tablas

Luego de crear la base de datos es necesario crear las tablas. Para crear la tabla Persona podemos hacerlo de dos maneras, la primera consiste en hacerlo interactivamente usando la utilidad msql, la segunda que es la que vamos a usar consiste en escribir los comandos que daríamos al programa msql y luego pasárselos como entrada al msql en forma no interactiva.

El script de creación de la tabla es:

#
# Estructura para la tabla 'Persona'
#
CREATE TABLE Persona (
Nombre CHAR(30),
Direccion CHAR(50),
Teléfono CHAR(30),
Email CHAR(50)
) \g

Lo que esta después de # es un comentario y no genera una acción. Luego se le indica que cree la tabla Persona y se le dan los nombres de los campos, su tipo (texto) y su tamaño (30 o 50 en este caso). El \g significa que ejecute la instrucción anterior.

Ahora para realizar la creación de la tabla damos el siguiente comando


C:\msql>msql libreta < creaPersona.sql

Welcome to the miniSQL monitor. Type \h for help.

mSQL > -> -> -> -> ->
Query OK.

mSQL >
Bye!

C:\msql>
La indicación Query OK nos muestra que todo salió bien y que se creo la tabla con éxito.




Alimentación

Para entrar datos en la tabla se usara la instrucción INSERT, en este caso mediante un script que se enviará vía msql:


#
# Datos para la tabla 'Persona'
#


INSERT INTO Persona VALUES ('Alberto Buendia','Calle 23 # 12 a 34','3557678','[email protected]')\g
INSERT INTO Persona VALUES ('Jaime Andrade','Calle 13 # 15 34','6577679','[email protected]')\g
INSERT INTO Persona VALUES ('Andrea Solarte','Kra 23 # 12 b 36','6444279','[email protected]')\g
INSERT INTO Persona VALUES ('Luis Valverde','Kra 19 # 14 a 16','2466279','[email protected]')\g
INSERT INTO Persona VALUES ('Monica Perez','Kra 22 # 4 b 61','3366579','[email protected]')\g
INSERT INTO Persona VALUES ('Henry Ordoñez','Calle 1a # 12 b 31','3344579','[email protected]')\g
INSERT INTO Persona VALUES ('Jorge Aristizabal','Calle 3a # 6 b 22','3246572','[email protected]')\g
INSERT INTO Persona VALUES ('Juan A. Solano','Calle 12 # 17-34','6456723','[email protected]')\g
INSERT INTO Persona VALUES ('Pilar Gomez','Calle 14 # 12-24','3335722','[email protected]')\g
INSERT INTO Persona VALUES ('Octavio Ruiz','Calle 21 # 16-12','3435722','[email protected]')\g












Vaciado

Es posible sacar todo el contenido de la base de datos con un solo comando. Esto permite hacer modificaciones a las tablas, modificar los datos o la estructura de la base de datos. Ademas de las modificaciones, también brinda una forma fácil de transportar la base de datos, aún entre diferentes sistemas operativos.

La instrucción es:
C:\msql>msqldump Libreta >Libreta.dmp

En esta instrucción se le indica que la salida (>) del vaciado de la base de datos Libreta la coloque en un archivo de nombre Libreta.dmp

En este caso el archivo Libreta.dmp contiene las instrucciones de creación de las tablas, así como las instrucciones para insertar los datos que existan en la base de datos al momento de realizar el vaciado. De modo que si se deseara construir de nuevo la base de datos en otro computador, bastaría con copiar el archivo Libreta.dmp y pasarlo como entrada al miniSQL.

El archivo que se uso para todos los ejemplos se lista a continuación:

# mSQL Dump (requires mSQL-1.0.6 or better)
#
# Host: localhost Database: Libreta
#--------------------------------------------------------

DROP TABLE Persona \g

#
# Table structure for table 'Persona'
#
CREATE TABLE Persona (
Nombre CHAR(30),
Direccion CHAR(50),
Telefono CHAR(30),
Email CHAR(50)
) \g


#
# Dumping data for table 'Persona'
#

INSERT INTO Persona VALUES ('Alberto Buendia','Calle 23 # 12 a 34','3557678','[email protected]')\g
INSERT INTO Persona VALUES ('Jaime Andrade','Calle 13 # 15 34','6577679','[email protected]')\g
INSERT INTO Persona VALUES ('Andrea Solarte','Kra 23 # 12 b 36','6444279','[email protected]')\g
INSERT INTO Persona VALUES ('Luis Valverde','Kra 19 # 14 a 16','2466279','[email protected]')\g
INSERT INTO Persona VALUES ('Monica Perez','Kra 22 # 4 b 61','3366579','[email protected]')\g
INSERT INTO Persona VALUES ('Henry Ordoñez','Calle 1a # 12 b 31','3344579','[email protected]')\g
INSERT INTO Persona VALUES ('Jorge Aristizabal','Calle 3a # 6 b 22','3246572','[email protected]')\g
INSERT INTO Persona VALUES ('Juan A. Solano','Calle 12 # 17-34','6456723','[email protected]')\g
INSERT INTO Persona VALUES ('Pilar Gomez','Calle 14 # 12-24','3335722','[email protected]')\g
INSERT INTO Persona VALUES ('Octavio Ruiz','Calle 21 # 16-12','3435722','[email protected]')\g


Modificaciones

Las modificaciones de estructura pueden hacerse sobre archivos de vaciado y luego se usan nuevamente para crear la base de datos.
En SQL existe la instrucción ALTER TABLE, en miniSQL no se implemento nada parecido, pero se pueden hacer modificaciones mediante pequeños scripts en formato texto, sacandolos de las instrucciones de un vaciado, por ejemplo.