mario
Fundamentos de Bases de Datos
En este curso veremos una introducción a las bases de datos, cómo podemos crear y manipular nuestras bases. En el curso posterior a este, nos enfocaremos en las consultas a las bases de datos.
Introducción
Las bases de datos son el producto de almacenar información y se dividen en dos grandes grupos. Bases de datos relacionales y bases de datos no relacionales.
Las bases de datos relacionales es un tipo de base de datos que almacena y proporciona acceso a un punto de datos relacionados entre sí. Algunos ejemplos de bases de datos relacionales son: MySQL, SQL Server, PostgresSQL, entre otras varias.
Las bases de datos no relacionales no están diseñadas para modelos de datos específicos, tienen esquemas flexibles para crear aplicaciones modernas. Algunos ejemplos de ellas son Casandra, Elasticsearch, MongoDB, entre otras.
Entidades y atributos
Entidad: representa algo en el mundo real. Ejemplos de ellas son, un computador, un automóvil, etc.
Atributos: Son las cosas que posee una entidad y la hacen ser una entidad.Ejemplo de ellas considerando automóvil como entidad sería, volante, llantas, motor, etc. Dentro de los atributos tenemos:
- Atributos multivaluados, son aquellos que son más de uno
- Atributos compuestos, son aquellos que derivan de otro atributo
- Atributos inferidos, son aquellos que infieren a partir de la información de otro atributo
- Atributos únicos, representa de forma única a ese objeto en particular
Por convención al dibujarlas:
- Entidades se encierran en un rectángulo.
- Atributos se encierran con óvalos
- Los atributos multivaluados se representan con un doble óvalo
- Los atributos compuestos se representan con óvalo
- Los atributos inferidos se representan con óvalos con línea punteada
- Los atributos únicos o llaves se representan con un óvalo y abajo una línea
Por ejemplo:
- Entidad: Automóvil
- Atributos: volante, modelo, Motor
- Atributos compuestos: Pistones, bujias (derivan del motor)
- Atributos multivaluados: Llantas (son más de una)
- Atributos inferidos: Antigüedad (se infiere a partir del año que salió)
Los atributos llaves se dividen en 2 grupos:
- Atributos naturales, inherente al objeto por ejemplo el número de serie de un objeto
- Clave artificial, no es inherente al objeto y se le asigna por conveniencia de manera arbitraria
También tenemos 2 tipos de entidades:
- Entidades débiles: No puede existir sin una entidad débil. Se representan con el mismo cuadrado pero tienen doble línea. Por ejemplo una entidad fuerte es un libro, una débil serían los ejemplares, ya que no podemos tener un ejemplar de un libro que no tengo. Estas pueden ser débiles por 2 motivos:
- Por identidad: No se diferencia entre sí más que la clave de su identidad fuerte
- Por existencia
- Entidades fuertes: No dependen de ninguna otra entidad para existir
Relaciones
El diagrama ER, es un diagrama de entidad relación. Las relaciones, es la manera que empezamos a ligar las diferentes entidades con objetos. Estas se representan con un rombo. Por ejemplo, si tenemos la identidad Automóvil y Dueño, las relaciones se definen por un verbo, es decir el dueño tiene un automóvil.
Generalmente un atributo cuando es multivaluado, es decir que son varios, se convierte en una identidad, como es el caso de los discos duros en el ejemplo de laptops. Ya que tienen una vida separada y se pueden relacionar de varias maneras.
Una de las propiedades de las entidades, son la cardinalidad, las cuales son:
- Cardinalidad 1 a 1: Una persona tiene 1 dato de contacto y los datos de contacto solo pertenecen a una sola persona. Para sacar la cardinalidad de esta, basta con tomar el número mayor de ambos lados. De un lado tenemos 1 y del otro tenemos 1 por lo tanto decimos que tenemos una cardinalidad de 1 a 1. También lo podemos encontrar con otros conectores que quiere decir 1 a 1, más estricto, quiere decir que solo tiene 1 y solo puede tener 1 del otro, el cual se simboliza con la doble raya.
- Cardinalidad 0 a 1: Algunos la llaman 1 a 1 opcional, lo que quiere decir que puede haber la opción que no exista ninguno de los lados. Por ejemplo, la sesión actual tiene que tener un usuario pero el usuario puede no tener una sesión actualmente. En un diagrama físico puede ser representado por la misma línea anterior pero punteada que significa opcional.
- Cardinalidad 1 a N: De un lado tenemos 1 y del otro muchos. Por ejemplo, una persona puede tener muchos automóviles, pero un automóvil solo pertenece a una persona. Del lado de persona tenemos 1 y 1 y del lado de automóvil tenemos muchos (N) por lo tanto si tomamos los mayores queda de 1 a N. Por el lado del diagrama físico tenemos una línea que parte en 1 y termina en una línea que se parte en 3 y significa muchos. Pero también hay otras 2 formas de representarla pero son similares solo que indican que de un lado debemos tener siempre 1 y del otro siempre muchos.
- Cardinalidad 0 a N: Es parecido al ejemplo anterior donde es opcional. Por ejemplo, tenemos un paciente y una habitación de hospital. Un paciente siempre está asignado a una habitación de hospital pero una habitación de hospital puede haber varios pacientes o puede estar vacía. En el diagrama físico lo podemos representar con un círculo en el lado opcional o con línea punteada
- Cardinalidad N a N: Muchos a muchos. Por ejemplo alumnos y clase, un alumno puede estar inscritos a varias clases y una clase puede contener a varios alumnos. En los conectores de diagrama físico se ve con tres líneas por ambos lados o podemos tenerlo de forma estricta por ambos lados con una línea antes.
Diagrama ER
Un diagrama nos hará una especie de mapa, para que entendamos bien las entidades y sus relaciones.
Por ejemplo en un diagrama para un blog, tenemos post, usuarios, comentarios y categorías, pero vamos a añadir otra que es etiquetas, ya que era un atributo multivaluado y generalmente se convierten en entidades separadas. Esto tiene sentido porque cuando una etiqueta esta en mas de una noticia realmente tiene una vida propia porque ya no depende directamente de un blog post ya que puede estar asociado a diferentes entidades y blogpost.
- Un usuario puede escribir muchos post
- Un usuario puede escribir muchos comentarios
- Los post tienen una serie de comentarios
- Una categoría va a englobar varios post
- Los post pueden tener muchas etiquetas pero por el otro lado una etiqueta puede estar asociada a muchos post
También existen otras nomenclaturas para representar esto, pero en el fondo es lo mismo.
Diagrama físico
Para llevar estos diagramas a la práctica debemos agregar detalles. Para esto usamos el diagrama físico. Lo primero que revisaremos son los tipos de datos. En bases de datos dependiendo del manejador puede cambiar un poco pero tenemos datos que son básicos y los encontraremos en todos los manejadores.
Tipos de datos:
- Texto
- Char(n): Permite almacenar caracteres o cadena, toma un pedazo de memoria del número de caracteres que voy a ocupar y lo guarda en memoria
- Varchar(n): Permite almacenar cadenas, reserva el espacio de memoria de manera dinámica, reserva un mínimo de espacio de memoria y luego se va modificando según lo que declare que necesite (Límite de 255 caracteres)
- Text: Almacena cadenas muy grande
- Números
- Integer: Números enteros
- Begint: Numeros grandes
- Smallint: Números muy pequeños 99 o menos
- Decimal (n,s): recibe dos parámetros, el número y luego los números decimales
- Numeric (n,s)
- Fecha / Hora
- Date: Contiene la fecha
- Time: La hora del dia
- Datetime: El dia como la hora
- Timestamp: El dia como la hora
- Lógicos
- Boolean: Verdadero o falso, 1 o 0
El otro elemento que necesitamos para completar el diagrama son los constraints (restricciones), añadirle reglas:
- Not Null: Se asegura que la columna no tenga valores nulos, no acepta que la columna tenga valores nulos
- Unique: Se asegura que sea único en toda nuestra tabla, como por ejemplo el email
- Primary Key: Combina Not Null y Unique, nos ayuda a hacer la unión entre una tabla y otra
- Foreign Key: El otro lado de la Primary Key, se añade a la otra tabla para unir ambas tablas. Identifica de manera única una tupla en otra tabla
- Check: Se asegura que el valor en la columna cumpla una condición dada. Podemos crear cualquier regla que queramos
- Default: Coloca un valor por defecto cuando no hay un valor especificado. (Cuando no se especifica es NULL)
- Index: Se crea por columna para permitir búsquedas más rápidas (Esto tiene una desventaja que cada vez que añadimos una nueva columna se tiene que volver a indexar y todo se hace más lento)
Diagrama físico: Normalización
La normalización nos ayuda a dejar todo en una forma normal y obedece a las 12 reglas de Cobb. Lo vamos a entender mediante ejemplos:
Sin normalizar
Primera forma normal (1FN): Atributos atómicos (Sin campos repetidos). En la tabla sin normalizar ambos alumnos tienen Ramo 1 y Ramo2, sin embargo ambos son Ramos. Así quedaría al aplicar la primera forma normal. Solo una columna con Ramo.
Segunda forma normal (2FN): Cumple 1FN y cada campo de la tabla debe depender de una clave única. Así quedaría al aplicar la 2da forma normal, se separaría en 2 tablas ya que las claves anteriormente se estaban repitiendo.
Tercera forma normal (3FN): Cumple 1FN y 2FN y los campos que NO son clave NO deben tener dependencias. Ahora tenemos los cursos separados, a pesar que no se repetían, ya que Pedro puede tener más de una maestría y la maestría puede ser de cualquier alumno, no solo de Pedro.
Cuarta forma normal (4FN) Cumple 1FN, 2FN y 3FN los campos multivaluados se identifican por una clave única. Las materias las vamos a separar nuevamente porque MySQL y Python los teníamos repetidos nuevamente y finalmente tenemos una tabla que nos ayuda a unir las demás tablas.
Historia de SQL
SQL Structured, Query, Language. Se creó SQL para hacer un solo lenguaje que independiente del manejador de base de datos se haga estándar. SQL tiene una estructura muy clara y fija.
NOSQL Not Only Structured Query Language, hay manejadores que ya no usan SQL pero como base siguen teniendo SQL, como por ejemplo Cassandra o BigQuery.
DDL Create
El lenguaje SQL tiene dos grandes sublenguajes, el que veremos hoy es DDL Data Definition Language que básicamente se refiere a un lenguaje que nos ayuda a crear la estructura de una base de datos. Los comandos que principalmente se usan en el DDL son:
- Create: Que nos ayuda a crear una base de datos, tablas, una vista, un índice, etc.
- Alter: Nos ayuda a alterar o modificar entidades, como por ejemplo modificar una tabla como crear una columna
- Drop: Nos ayuda a borrar una columna, tabla, base de datos, etc.
Los grandes grupos de objetos que vamos a manipular con este lenguaje son:
- Database: base de datos
- Table: La traducción de las entidades
- View: La proyección de las tablas de una base de datos que son entendible para alguien
Las primeras sentencias que comenzaremos a ver:
CREATE DATABASE test_db;
Crea una base de dato llamada test_db
USE DATEBASE test_db;
Es para decirle con la base de datos que trabajaremos, en un ambiente gráfico no es necesario, pero en lineas de código si.
Si por ejemplo en nuestro ambiente gráfico creamos una base de datos de forma manual dando clic derecho y presionando create schema, le damos el nombre y le seleccionamos el carácter utf8, una vez que le damos apply nos saldra el codigo que se verá de la siguiente manera:
CREATE SCHEMA “blog” DEFAULT CHARACTER SET utf8 ;
Luego se habrá creado, para seleccionar la base de datos blog, el equivalente a use database, es presionar clic derecho en la base y seleccionar Set as Default Schema, que es básicamente que lo trate como default para cualquier consulta que hagamos de ahora en adelante.
Ahora para crear una tabla se hace de la siguiente manera mediante código:
CREATE TABLE people (
person_id int,
last_name varchar(255),
first_name varchar(255),
address varchar(255),
city varchar(255)
);
Pero para crear esto de forma gráfica le damos click en la flecha de la base de datos, le damos click derecho donde dice tabla y nos da la opción Create Table. Le ponemos un nombre, luego seleccionamos las columnas que queremos, por ejemplo person_id, en Datatype le decimos el tipo de dato que será esta columna, y seleccionamos PK que sería la llave primaria y NN que será Not Null y también podemos agregar AI que significa que sea Auto incremental , agregamos las demás columnas y le damos clic en el botón apply.
Create View y DDL Alter
Las vistas toman datos de la base de datos y las ponen en un forma presentable, para convertirlas en algo que podamos consultar de manera recurrente.
Por ejemplo:
CREATE VIEW v_brasil_customers AS
SELECT customer_name, contact_name
FROM customers
WHERE country = “brasil”;
Lo primero que ponemos luego de create view es el nombre de la vista, se suele poner una v pequeña adelante como convención para que se sepa que es una vista y no una tabla y luego lo demás del nombre, en este caso los clientes de brasil, luego ponemos AS que es como y luego toda la sentencia select que se verá en las próximas clases.
En el manejador visual podemos apreciar que tenemos nuestra base de datos y más abajo tablas, vistas y más. Nos vamos a la sección view y le damos clic derecho a Create View y creamos nuestro código. Finalmente le damos click en apply. Ahora dentro de vistas tenemos una vista con el nombre que creamos y le podemos dar doble clic y ver.
La ventaja es que estas vistas se mantienen en memoria por lo cual podemos tener estas vistas al día sin estar haciendo las consultas cada vez
Alter, es el comando que nos permitirá modificar.
ALTER TABLE people
ADD date_of_birth date;
Acá le estamos diciendo que a nuestra tabla, vamos a agregarle una columna que se llamará fecha de nacimiento y será de tipo fecha.
ALTER TABLE people
ALTER COLUMN date_of_birth year;
Acá le estamos diciendo que a nuestra tabla, en la columna recién creada, vamos a cambiarle el tipo de fecha por año.
ALTER TABLE people
DROP COLUMN date_of_birth;
Acá estamos alterando nuestra tabla para borrar una columna.
En el manejador visual podemos ir a la tabla y con el clic derecho seleccionar alter table y me dejará agregar una nueva columna, como también podemos ir a nuestra tabla nuevamente y seleccionar alter table para solo modificar el tipo de fecha. Por último también podemos alterar la tabla para después irnos a una columna y dando clic derecho seleccionar Delete Selected dando finalmente en Apply.
DDL Drop
Es la sentencia más peligrosa ya que DROP es borrar.
DROP TABLE people;
Borra la tabla people
DROP DATABASE test_db;
Borra la base de datos test_db
Para hacerlo en el manejador visual es fácil, ya que damos click derecho en la tabla y después Drop table. Y lo mismo con la base de datos, Drop Schema.
DML
DML, Data Manipulation Language. Los comandos de este lenguaje son los siguientes:
- Insert, inserta o agrega nuevos registros o tuplas a nuestra base de datos.
- Update, actualiza o modifica los datos que ya tenemos
- Delete, borra contenido
- Select, nos trae información de la base de datos
INSERT INTO people (last_name, first_name, address, city)
VALUES (“Hernandez”, “Laura”, “Calle 21”, “Monterrey”);
Primero seleccionamos donde lo vamos a insertar y luego los campos que insertamos, puedo insertar todo los campos o dejar campos vacíos o insertar múltiples renglones. Pero ojo que debemos conservar el orden.
UPDATE people
SET last_name =”chavez”, city=”Merida”
WHERE person_id = 1;
Acá le estoy diciendo actualiza la tabla people y actualiza el campo last_name por el valor chávez y cambia la ciudad por mérida, a la persona con el id 1
UPDATE people
SET first_name = “Juan”
WHERE city = “Merida”;
Acá le estoy diciendo actualiza la tabla people y actualiza el campo first_name por el valor Juan en todo los rows donde la ciudad sea Merida. Pero esto no me lo permitirá el manejador visual porque es algo peligroso, ya que son muchos registros modificados a la vez.
UPDATE people
SET first_name = “Juan”;
Aca le estoy diciendo actualiza la tabla people y actualiza el campo first_name por el valor Juan, pero no le estamos diciendo a qué registro quiero que lo haga por lo cual se los cambiara a todos. Pero esto no me lo permitirá el manejador visual porque es algo peligroso. (Todo esto lo podemos hacer con el código en la consola del manejador visual y dándole al rayo para aplicar)
DELETE FROM people
WHERE person_id = 1;
Borra de la tabla a la persona con el id 1
DELETE FROM people;
Borra toda la tabla.
Fundamentos de Bases de datos está basado en distintos cursos de Platzi y práctica personal.