viernes, 17 de febrero de 2017

La persistencia de datos



Introducción a la persistencia
  • Te preguntarás: Cuando apago la máquina donde corre mi programa, qué pasa con los datos? Como hago para seguir usando normalmente mi sistema una vez que prendo la computadora o el dispositivo? No quiero tener que volver a ingresar todos los datos nuevamente.
  • Esto se puede solucionar de muchas manera. En algunos programas sencillos, con pocos datos, los programadores guardan la información en archivos.
  • Y si es tan sencillo, por qué complicarnos la vida con otras soluciones? Porque nos traen algunos problemas:
    • Redundancia e inconsistencia de datos
    • Dificultad para acceder a los datos
    • Aislamiento de los datos
    • Múltiples usuarios
    • Problemas de confidencialidad
    • Problemas de integridad
Problemas con archivos
  • El primero de los problemas lo que significa es que al poder escribir cualquier cosa en un archivo, yo podría tener datos repetidos, dado que no hay un control real sobre lo que estoy escribiendo. Básicamente es como un cuaderno de hojas, yo puedo escribir lo que quiera. Y de igual manera podría estar escribiendo cosas que se contradicen entre si.
  • También tenemos el problema de que un archivo es simplemente una cadena muy larga de letras. Para buscar algo, tengo que recorrer todo el contenido hasta encontrarlo.
  • Por otro lado, al ser un archivo un espacio en memoria que se puede acceder de manera compartida, puede ocurrir que alguien quiera escribir en el archivo mientras otro está leyendo, o también el hecho de que no queremos que cualquiera acceda al mismo porque hay información confidencial, y cuidar esto con este tipo de datos es muy difícil.
  • Cuál es la solución? Los servidores de bases de datos
Qué es una base de datos?
  • Si vamos a lo formal, una base de datos es simplemente un conjunto de datos interrelacionados almacenados en un lugar. Con lo cual podría ser sencillamente una caja con papeles de datos que tengan alguna relación entre si, como por ejemplo las boletas de servicios de un hogar cualquiera.
  • Uno asocia el término base de datos a algo informático pero el mismo es mucho mas amplio y simplemente hace mención a una colección de datos almacenados. En nuestro caso específicamente, nos referiremos a un programa que brinda el servicio de guardar nuestra información de una manera que permita salvaguardar los problemas de eficiencia, seguridad y concurrencia(que varios accedan al mismo tiempo) en un formato particular
Datos persistentes
  • En nuestros programas, tendremos dos tipos de datos: los persistentes, que son aquellos que querremos seguir teniendo cuando prendamos nuevamente nuestro sistema, y los datos propios de la ejecución del programa, que desaparecerán de la memoria de la computadora apenas apaguemos nuestro sistema.
Arquitectura de la solución
  • De esa manera, separamos nuestra aplicación de lo que es el servidor de base de datos donde guardaremos la información, y por ello tendremos una estructura como la siguiente:


Arquitectura de la aplicación
  • Muchas aplicaciones hablarán con un programa llamado Sistema de Gestión de Bases de Datos que a la vez nos va a brindar acceso a los distintos datos que necesitemos para nuestro programa
  • Nosotros en particular, vamos a estar trabajando con bases de datos llamadas RELACIONALES. En este tipo de bases de datos, lo que se intenta modelar son precisamente las relaciones entre los mismos. Entonces, por ejemplo, una persona, es modelada como un conjunto de datos: número de documento, fecha de nacimiento, sexo, nombre, apellido y cualquier otro dato que yo crea que en su conjunto representan a una persona.
Estructura de relaciones
  • Cualquier elemento de nuestro sistema, será modelado como una relación de datos en lo que denominamos tablas de la base.
  • También podremos guardar en nuestra base relaciones entre los elementos de nuestro sistema. Por ejemplo, podremos tener una nueva tabla que me relacione una persona con uno o mas auto, en la relación TIENE (para describir que una persona puede tener ninguno, uno o mas autos).
  • Las tablas tendrán la siguiente forma
  • En la ilustración podemos ver como cada una de las columnas contendrá un tipo de dato (en el caso de las personas serán el número de Documento, la fecha, etc) y cada una de las filas representará la relación que conforma a cada una de las personas en mi modelo. En mi tabla, solo tendremos las relaciones que tengan sentido. Esto quiere decir, por ejemplo, que no puede haber dos personas con distinto nombre y apellido que tengan el mismo número de documento.
  • Para manejar este tipo de tablas, se pueden utilizar distintos tipos de programas. Nosotros en particular utilizaremos para nuestros proyecto el Microsoft SQL Express que se lo pueden descargar gratuitamente de internet.
SQL
  • Para poder realizar acciones en mi base de datos, tengo que conocer el lenguaje mediante el cual me comunico con el programa: el SQL.
  • El SQL es un lenguaje que nos permite hacer dos tipos de grupos de acciones: definición (crear una base, crear tablas, borrarlas, etc) y la manipulación, que nos permite insertar datos en las tablas, borrarlos, actualizarlos y listarlos.
  • Lo primero que tenemos que ver, una vez que creamos la base de datos, es como armamos las famosas tablas de las que vinimos hablando. Esto se hace mediante la sentencia CREATE
CREATE

CREATE TABLE <NOMBRE>
(
A1TIPO1[NULL | NOT NULL] [DEFAULT V1],
ANTIPON[NULL | NOT NULL] [DEFAULT Vn],
PRIMARY KEY (Ai,..,Aj),
FOREIGN KEY (Ai,..,Aj) REFERENCES <NOMBRE_FORANEA> (Ai,..,Aj)
)
Ejemplos de uso de CREATE son:
[ Cambia placa ]
CREATE TABLE PROVEEDOR
(
COD INT NOT NULL,
NOMBRE CHAR(50) NOT NULL,
TEL INT,
PRIMARY KEY (COD)
);
  • En estos ejemplos estoy creando primero una tabla de nombre PROVEEDOR, donde tendré tres tipos de datos. El primero será un número entero que no podrá tener datos vacíos con nombre COD. Luego tendremos una palabra, que no podrá estar vacía, de 50 caracteres máximo, de nombre NOMBRE. Y finalmente tendremos un números entero de nombre TEL, y definiré que la clave primaria será COD.
Claves
  • Que son las PRIMARY KEY y FOREIGN KEY que aparecen? La clave primaria es un subconjunto de los tipos de datos que tengo en la tabla que me identifican unívocamente a una fila de la tabla. Aun es complejo de entender? Básicamente piensen en como diferenciarían a dos PROVEEDORES con los datos que les dí. Si ya sabemos que solo con el número de código de proveedor podemos decir que dos proveedores son distintos, entonces nuestra clave primaria será ese dato. El nombre en general no nos sirve porque pueden existir dos proveedores con el mismo nombre.
  • En el caso de la clave foránea es un poco mas complejo y nos permite por ejemplo hacer algunos controles en nuestra base de datos. Si tengo la relación AUTO, y el mismo posee el número de documento de su dueño, al definirlo como clave foránea me obliga a que el número de documento que aparece en AUTO tenga que existir SI O SI en PERSONA. Es un control que nos brinda automáticamente el uso de la base de datos.
DROP
  • Luego, para borrar una tabla haremos sencillamente:
DROP TABLE <NOMBRE>
Ej: DROP TABLE PROVEEDOR

INSERT
  • Una vez que tenemos nuestras tablas, en este caso PROVEEDOR, queremos empezar a llenarla de datos, y para ello utilizaremos la instrucción INSERT:
INSERT INTO TABLE <NOMBRE> (A1,..,AK)
VALUES (V1,..,VK);

EJ: INSERT INTO ARTICULO (COD,NOMBRE,TEL)
VALUES (5, “JUAN PEREZ”,666)
  • Lo que estamos haciendo con esta instrucción es decirle a nuestra base de datos que inserte los datos 5, “JUAN PEREZ” y 666 en los campos COD, NOMBRE y TEL de la tabla ARTICULO en el orden indicado.
UPDATE
  • Luego, si queremos modificar los datos que ingresamos, utilizaremos la instrucción UPDATE:
UPDATE <NOMBRE>
SET (A1 = V1,...,AN = VN)
WHERE <CONDICIÓN> ;
EJ: UPDATE PROVEEDOR P
SET (P.TEL = 0000)
EJ: UPDATE PROVEEDOR P
SET (P.TEL = 0000)
WHERE P.COD = 5
  • El UPDATE nos permite filtrar cuales serán los proveedores que queremos modificar. En el primer ejemplo estamos modificando a todos los proveedores seteándolesel teléfono en 000, mientras que en el ejemplo solo lo modifica en aquel proveedor cuyo código es 5.
DELETE
  • Luego, si nos dimos cuenta que queremos borrar algún dato en particular, simplemente lo hacemos utilizando la instrucción DELETE
DELETE FROM <NOMBRE>
WHERE <CONDICIÓN> ;

EJ: DELETE FROM PROVEEDOR P
WHERE P.COD = 5;
  • Aquí en particular estaremos borrando el registro en la tabla cuyo código sea igual a 5. En caso que queramos borrar toda la información de una tabla simplemente ejecutamos la instrucción DELETE FROM PROVEEDOR, aunque no es recomendable hacer este tipo de acciones.
SELECT
  • Finalmente tenemos la instrucción para listar información, la cual nos servirá para poder recuperar todo lo que fuimos guardando.
SELECT A1,A2,..,AN
FROM T1,T2,..,TN
WHERE p
  • En el select tenemos primero el listado separado por comas de A1, A2, …, AN que se refiere a cuales datos queremos traer. Por ejemplo, quiero que solo me traiga los códigos de proveedor y nombre, de la tabla PROVEEDOR, por lo cual pondremos:
SELECT COD, NOMBRE
FROM PROVEEDOR
  • Nos traerá todos los proveedores que hayamos guardado, pero solo su código y nombre. Si en cambio queremos que nos traiga todos los datos de cada proveedor, reemplazaremos la lista de atributos por un asterisco (*).
  • Podremos agregar filtros al igual que hicimos en el UPDATE o en el DELETE agregando condiciones en el WHERE. Por ejemplo:
SELECT *
FROM PROVEEDOR
WHERE COD=5
  • Y para terminar, debemos pensar como hacemos para relacionar datos entre tablas.
  • Si asumimos que aparte de la tabla de proveedores, tenemos una tabla artículos de la siguiente forma:
[ Inicia placa ]
CREATE TABLE ARTICULO
(
COD INT NOT NULL,
NOMBRE CHAR(50) NOT NULL,
CANTIDAD INT NOT NULL,
COD_PROV INT NOT NULL,
PRIMARY KEY (COD),
FOREIGN KEY (COD_PROV) REFERENCES PROVEEDOR (COD)
);
  • Asumamos que tenemos los siguientes datos en cada una (artículo, proveedor):

Select de varias tablas
  • Cuando nosotros hacemos SELECT * FROM ARTICULO, PROVEEDOR lo que nos devuelve es una combinación de todos los datos con todos:

  • Pero en realidad a nosotros solo nos interesan las filas que tengan sentido, y para ello utilizaremos el WHERE para solo ver lo que nos interesa, quedando:
SELECT *FROM ARTICULO A, PROVEEDOR P
WHERE A.COD_PROV = P.COD


Repaso
  • Con las bases de datos, puedo guardar información y tenerla siempre disponible cada vez que reinicio mi sistema, pudiendo acceder a los datos de manera sencilla.
  • Algunas de las ventajas que tienen estos servidores son:
    • Nos dan herramientas que garantizan evitar datos duplicados
    • Si hay datos que están relacionados, al eliminar un dato elimina todos los datos relacionados dependientes.
    • Nos ayuda a hacer nuestro modelo de datos mas comprensible, accesible y estandarizado.
  • Para trabajar con estos servidores, hemos visto algunas tareas que vamos a usar siempre en nuestro proyectos:
    • Creación de tablas
    • Inserción y actualización de datos.
    • Métodos para hacer consultas sobre los datos

Espero haber ayudado en algo. Hasta la próxima oportunidad!











  

No hay comentarios:

Publicar un comentario