Download Clase teórica 13 (Introducción a las bases de datos relacionales)

Document related concepts

Modelo de base de datos wikipedia , lookup

Modelo relacional wikipedia , lookup

SQLite wikipedia , lookup

Base de datos relacional wikipedia , lookup

Transcript
Introducción a la Computación
Bases de Datos Relacionales I
Esteban E. Mocskos ([email protected])
Facultad de Ciencias Exactas y Naturales, UBA
CONICET
4/06/2013
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
1 / 16
¿Por qué?
Vamos a perder un poco el tiempo suponiendo que, con lo que saben hasta ahora,
tenemos que hacer un programa que implemente una agenda de contactos y un
calendario con citas a esos contactos... ¿cómo harı́amos?
Espero que hayamos llegado a empezar a ver la necesidad de que exista una herramienta
que nos ayude:
Un RDBMS (por relational database management system) es un sistema de
administración de bases de datos (conocido como DBMS) que se basa en el modelo
relacional.
Introducido por E. F. Codd (IBM) en los 70’s.
el muchacho se ganó el premio Turing por esto.
Hoy en dı́a la mayor parte de los sistemas de bases de datos que se utilizan, se basan
en el modelo relacional.
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
2 / 16
Modelo relacional
Un modelo relacional estructura los datos en forma de tabla.
Una base de datos relacional es un conjunto de tablas con nombre único.
Un esquema relacional define
Nombres de las tablas en la base de datos.
Las columnas de cada tabla: nombre, tipo de datos y tamaño.
Condiciones de integridad: los datos ingresados las deben satisfacer en cada una de
las tablas.
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
3 / 16
Ejemplo sencillo
Ejemplo clásico de la literatura: se tiene una empresa con empleados en distintos
departamentos ubicados en regiones geográficamente distribuidas.
Se quiere modelar esta situación usando el modelo relacional... ¿Cómo harı́amos?
Empecemos con la tabla DEPT que contendrá la información básica de cada
departamento.
Se busca capturar la información que nos resulta relevante:
Tabla DEPT
DEPTNO
10
20
30
40
E. Mocskos (UBA–CONICET)
DEPT
DNAME
ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
NEW YORK
DALLAS
CHICAGO
BOSTON
Clase 13: Introducción a las Bases de Datos I
4/06/2013
4 / 16
Entiendo el ejemplo sencillo
Las tres columnas de la tabla DEPT tiene asociados los siguientes tipos de datos:
1
DEPTNO: es de tipo NUMERIC(2), es decir, el atributo puede tener los valores enteros
en el rango −99 . . . 99. Se podrı́a plantear una condición de integridad para
asegurarse de excluir números negativos, pero ¿Cómo funcionarı́a esto?
2
DNAME: es de tipo VARCHAR(14). Las entradas corresponden a cadenas de carácteres
de longitud variable, pero con un máximo de 14 caracteres.
3
LOC: es similar al anterior, pero tiene 13 caracteres como máxima, es de tipo
VARCHAR(13).
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
5 / 16
Más sobre el modelo relacional
El estado de una base de datos relacional (o instancia de un esquema relacional)
define para cada tabla un conjunto de filas.
Dicho de otra manera, el estado esta definido por las filas de cada una de las tablas
que constituyen la base de datos.
En el ejemplo que pusimos, la tabla DEPT tiene cuatro (4) filas o registros.
El modelo relacional no predefine un orden dado para almacenar los registros. Es
decir, no dice nada acerca de cuál tiene que ser la primer fila, cuál la segunda, etc.
Sin embargo, las filas sı́ pueden ordenarse cuando se necesiten para algo (ya vamos a
ver cómo).
Cada fila o registro contiene valores para cada una de las columnas de la tabla.
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
6 / 16
Terminologı́a
Esto lo van a encontrar cada vez que miren sobre este tema:
Relación: tabla
Tupla: una fila (también se lo conoce como registro)
Cardinalidad: la cantidad de filas
Atributo: una columna (también se lo conoce como campo)
Grado: Número de columnas
Clave primaria: identificador único
Dominio: el conjunto de valores que puede tomar un atributo
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
7 / 16
Claves
En el ejemplo que vimos, el campo (o atributo) DEPTNO se lo marca o denomina como la
clave de la tabla DEPT.
Claves relacionales
Una clave identifica unı́vocamente una fila de una tabla.
Por ejemplo, en la tabla DEPT del ejemplo, hay una fila con clave DEPTNO=10.
¿Qué pasarı́a si se trata de agregar otro registro con el valor 10 para DEPTNO?
¡¡¡No se puede!!!
¿Quién reporta el error?
El DBMS es el encargado de impedirte romper con esta condición (es parte del
modelo relacional).
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
8 / 16
Claves II
Las claves son un ejemplo de restricciones (constraints): son condiciones que deben
satisfacer los contenidos de una tabla adicionalmente a las impuestas naturalmente
por los tipos asociados a cada columna.
Las constraints se declaran como parte del esquema relacional.
Se puede definir más de una clave para cada tabla.
¿Más claves?
Por ejemplo, se podrı́a pensar en que el campo DNAME podrı́a servir como clave. ¿Qué se
lograrı́a con esto?
En este caso, que no haya más de un departamento con el mismo nombre.
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
9 / 16
Haciendo algo
SQLite es una biblioteca que implementa un motor de SQL que:
1
Soporta transacciones.
2
Es auto-contenido (un solo archivo).
3
No necesita un servidor, corre directamente en la misma máquina usamos.
4
No necesita configuración.
5
Se usa mucho.
6
El código fuente es de dominio público.
Funciona en las siguientes plataformas:
Linux
Mac OS X
Windows
Windows Phone 8
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
10 / 16
SQLite - Detalles I
Autocontenido: requiere un soporte mı́nimo de bibliotecas externas y del sistema
operativo. Es multi-plataforma, por lo que está bueno para ser usado en aplicaciones
que necesitan correr en diferentes ambientes y condiciones. Una base de datos se
puede copiar y usar directamente entre múltiples máquinas (Linux y Windows, 32
bits y 64 bits), simplemente se copia el archivo y listo.
No necesita un servidor: normalmente, los motores de base de datos se
implementan como un servidor independiente. Cuando se quiere acceder a la base de
datos, hay que establecer algún tipo de comunicación (muchas veces usando una
red). Con SQLite, cuando se quiere acceder a la base de datos, directamente se lee o
se escribe en un archivo (mediado por una biblioteca, no lo hace uno directamente).
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
11 / 16
SQLite - Detalles II
Acceso múltiple: a pesar de estar basado en un archivo, SQLite es el único (o uno
de los pocos) que permite que múltiples aplicaciones accedan simultáneamente a la
misma base de datos.
No necesita configuración (Zero-Configuration): SQLite no necesita ser instalado,
no hay procedimiento de setup, no hay servidor para iniciar, parar o configurar. No
se necesitan privilegios de administrador para crear una nueva instancia de base de
datos. No usa archivos de configuración, no hay nada para indicar o configurar en el
sistema para decirle que SQLite está ejecutando. No hay que hacer nada para
recobrar de una colgada fulera de la máquina o de un corte de luz (salvo que se
rompa el disco, pero ahı́ va a haber muchas cosas por las que preocuparse).
Soporta transacciones: significa que todos los cambios y consultas se suponen
Atómicos, Consistentes, Aislados y Durables (ACID). SQLite implementa
transacciones serializables que cumplen con ACID aún en el caso de ser
interrumpidas por error de programa, caı́da de sistema operativo o corte de luz (al
menos en todos los casos de test que hicieron los desarrolladores).
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
12 / 16
Creando una base de datos - Live demo
Vamos a usar una herramienta para administrar la base de datos SQLite. Se podrı́a hacer
a mano desde la consola, pero para empezar, está bien usar algo que nos ayude y
simplifique el proceso, SQLite Studio, http://sqlitestudio.pl/?act=download:
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
13 / 16
Accediendo a los datos desde Python
Lo primero que tenemos que saber es si la versión de Python que tenemos instalado tiene
soporte para SQLite (podrı́a no tenerlo). Eso lo hacemos con el siguiente programita:
import s q l i t e 3
p r i n t ( ” V e r s i o n de B i b l i o t e c a : ” + s t r ( s q l i t e 3 . v e r s i o n ) )
p r i n t ( ” V e r s i o n de motor : ” + s t r ( s q l i t e 3 . s q l i t e v e r s i o n ) )
En mi compu (la de casa) me tiró esto:
Version de Biblioteca: 2.6.0
Version de motor: 3.7.16.2
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
14 / 16
Veamos cómo traer datos, supongamos que existe una tabla que se llama personas:
#Abro l a c o n e x i o n a l a t a b l a
#E l p a r a m e t r o debe s e r un a r c h i v o que s e pueda l e e r .
con = s q l i t e 3 . c o n n e c t ( ” p r u e b a i n t r o . db ” )
#No m u e s t r a mucho , s o l o que e x i s t e .
p r i n t ( con )
c u r = con . c u r s o r ( )
c u r . e x e c u t e ( ’ SELECT ∗ FROM p e r s o n a s ’ )
data = cur . fetchone ()
p r i n t ( data )
con . c l o s e ( )
Si esto anda bien, deberı́a mostrar un registro de los que hay en la tabla.
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
15 / 16
Tarea
Lo que hay que hacer es:
Definir una base de datos usando SQLite Studio (deberı́a estar ya bajado en su
home).
Definir una tabla que contenga los campos necesarios para una agenda de contactos
(al menos Apellido, Nombre, Calle, Número, Piso, Teléfono, email, Celular,
Cumpleaños). Elegir el tipo de datos de cada uno de los atributos.
Determinar qué campo o campos conformarán la clave primaria.
Llenar con registros de prueba la/s tabla/s de modo tal que haya una cantidad de
información sufiente para probar (más de 15 registros).
Hacer un programa en Python que levante los datos de la tabla de prueba
recientemente creada (para traer todos los datos, pueden usar cur.fetchall() y
luego mostrarlos.
Mejorar el código anterior protegiéndolo contra distintas excepciones (las que crean
interesantes), asegurarse que en cualquier caso, antes de terminar, la conexión con la
base de datos quede cerrada (con.close()).
E. Mocskos (UBA–CONICET)
Clase 13: Introducción a las Bases de Datos I
4/06/2013
16 / 16