Bases de Datos.
2. Relación entre estructuras de datos, hojas de cálculo y Bases de Datos
1 Relación entre Calc, Listas de Diccionarios y Bases de Datos
1.1. Una misma información, distintas formas de representarla
Hasta este momento hemos trabajado con información utilizando diferentes herramientas.
En LibreOffice Calc almacenamos datos utilizando filas, columnas y celdas. Una hoja de cálculo permite manipular datos organizados en forma de tablas y realizar operaciones sobre ellos mediante fórmulas y funciones.
En Python, hemos visto que podemos utilizar diccionarios para almacenar varios datos relacionados entre sí y listas para almacenar varios diccionarios.
Por ejemplo (listas de diccionarios) :
alumnos = [ {"id_alumno": 1, "nombre": "Juan", "nota": 7}, {"id_alumno": 2, "nombre": "Ana", "nota": 8}, {"id_alumno": 3, "nombre": "Pedro", "nota": 4}]
También podemos almacenar esta información en una hoja de Calc:
| id_alumno | nombre | nota |
|---|---|---|
| 1 | Juan | 7 |
| 2 | Ana | 8 |
| 3 | Pedro | 4 |
Y podríamos encontrar una estructura visualmente muy parecida en una tabla de una Base de Datos:
| id_alumno | nombre | nota |
|---|---|---|
| 1 | Juan | 7 |
| 2 | Ana | 8 |
| 3 | Pedro | 4 |
Por lo tanto, estamos representando la misma información utilizando diferentes herramientas.
IMPORTANTE: una lista de diccionarios, una tabla de Calc y una tabla de una Base de Datos no son lo mismo. Sin embargo, presentan semejanzas que podemos aprovechar para comprender cómo se organizan los datos.
1.2. Filas, columnas y datos
Recordemos que en Calc una hoja está formada por filas y columnas, y una celda es la intersección de una fila con una columna. Hoja de Cálculo _ Aula Virtual
Supongamos la siguiente tabla:
| id_alumno | nombre | nota |
|---|---|---|
| 1 | Juan | 7 |
| 2 | Ana | 8 |
| 3 | Pedro | 4 |
La fila correspondiente a Juan contiene:
1 Juan 7
En Python podríamos representar esos mismos datos mediante un diccionario:
alumno = { "id_alumno": 1, "nombre": "Juan", "nota": 7}
Podemos observar la siguiente relación:
| Calc | Python |
|---|---|
| Encabezado de una columna | Clave del diccionario |
| Contenido de una celda | Valor asociado a una clave |
| Fila de datos | Diccionario |
| Conjunto de filas | Lista de diccionarios |
Por ejemplo, en Calc:
nombre
------
Juan
y en Python:
{"nombre": "Juan"}
En ambos casos estamos identificando un dato mediante un nombre y almacenando un valor asociado.
1.3. Una fila de Calc y un diccionario
Consideremos:
| id_alumno | nombre | nota |
|---|---|---|
| 1 | Juan | 7 |
Podemos representar esta fila mediante:
alumno = { "id_alumno": 1, "nombre": "Juan", "nota": 7}
Observemos que:
alumno["nombre"]
permite obtener:
Juan
De manera semejante, en Calc podríamos obtener el dato observando la celda correspondiente a la columna nombre y a la fila del alumno.
La principal diferencia es la forma de hacer referencia a la información.
En Calc podemos utilizar una referencia de celda:
B2
Mientras que en el diccionario utilizamos una clave:
alumno["nombre"]
1.4. Varias filas y una Lista de Diccionarios
Supongamos ahora que tenemos varios alumnos:
| id_alumno | nombre | nota |
|---|---|---|
| 1 | Juan | 7 |
| 2 | Ana | 8 |
| 3 | Pedro | 4 |
En Python podemos representarlos mediante:
alumnos = [ {"id_alumno": 1, "nombre": "Juan", "nota": 7}, {"id_alumno": 2, "nombre": "Ana", "nota": 8}, {"id_alumno": 3, "nombre": "Pedro", "nota": 4}]
Tenemos entonces:
Lista
|
+-- Diccionario
|
+-- Diccionario
|
+-- Diccionario
Cada diccionario representa los datos de un alumno.
Podemos recorrerlos:
for alumno in alumnos: print(alumno)
La salida sería:
{'id_alumno': 1, 'nombre': 'Juan', 'nota': 7}
{'id_alumno': 2, 'nombre': 'Ana', 'nota': 8}
{'id_alumno': 3, 'nombre': 'Pedro', 'nota': 4}
También podemos mostrar solamente algunos datos:
for alumno in alumnos: print(alumno["nombre"], alumno["nota"])
Resultado:
Juan 7
Ana 8
Pedro 4
1.5. Tabla de Calc, Lista de Diccionarios y tabla de Base de Datos
Podemos establecer ahora una comparación conceptual:
| Concepto | Calc | Python | Base de Datos |
|---|---|---|---|
| Conjunto de información | Tabla o rango | Lista de diccionarios | Tabla |
| Una entidad | Fila | Diccionario | Registro o fila |
| Característica de la entidad | Columna | Clave | Campo o columna |
| Dato almacenado | Celda | Valor | Valor del campo |
Por ejemplo:
{"id_alumno": 2, "nombre": "Ana", "nota": 8}
representa conceptualmente algo semejante a:
id_alumno | nombre | nota
-----------+--------+-----
2 | Ana | 8
Pero debemos volver a remarcar:
Esta comparación sirve para comprender la organización de los datos. Una hoja de cálculo, una estructura de Python y una Base de Datos poseen características y mecanismos diferentes.
1.6. El índice de la Lista no es el identificador del alumno
Este punto es particularmente importante.
Supongamos:
alumnos = [ {"id_alumno": 10, "nombre": "Juan", "nota": 7}, {"id_alumno": 25, "nombre": "Ana", "nota": 8}, {"id_alumno": 38, "nombre": "Pedro", "nota": 4}]
La posición del primer diccionario en la lista es:
alumnos[0]
pero el valor de:
alumnos[0]["id_alumno"]
es:
10
Por lo tanto:
0
es el índice o posición dentro de la lista, mientras que:
10
es un identificador almacenado como dato.
No debemos confundirlos.
Esta diferencia será particularmente importante cuando trabajemos con Bases de Datos.
1.7. Filtrar información
En Calc ya vimos que podemos aplicar filtros para visualizar solamente las filas que cumplen determinadas condiciones. Hoja de Cálculo _ Aula Virtual
Por ejemplo, en el material de Calc se utiliza un filtro para mostrar solamente calificaciones mayores o iguales a 5. Hoja de Cálculo _ Aula Virtual
Supongamos:
| nombre | nota |
|---|---|
| Juan | 7 |
| Ana | 8 |
| Pedro | 4 |
| María | 3 |
| Luis | 6 |
Si queremos visualizar solamente los alumnos con:
nota >= 5
en Calc podemos utilizar un filtro.
En Python podemos resolver conceptualmente el mismo problema mediante:
for alumno in alumnos: if alumno["nota"] >= 5: print(alumno["nombre"], alumno["nota"])
Obtendríamos:
Juan 7
Ana 8
Luis 6
Cuando estudiemos Bases de Datos veremos que también poseen mecanismos para seleccionar registros que cumplen determinadas condiciones.
Por ejemplo:
SELECT *
FROM alumnos
WHERE nota >= 5;
Lo importante en este momento es observar que el problema es el mismo:
Tenemos muchos registros
|
v
Aplicamos una condición
|
v
Seleccionamos solamente algunos
Podemos resumir:
| Herramienta | Mecanismo |
|---|---|
| Calc | Filtro |
| Python | if |
| Base de Datos | WHERE |
1.8. Ordenar datos
Calc permite ordenar las filas según el contenido de determinadas columnas. En el material se muestra cómo seleccionar una tabla y ordenarla según una columna.
Por ejemplo:
| nombre | nota |
|---|---|
| Pedro | 4 |
| Juan | 7 |
| Ana | 8 |
Podemos solicitar que Calc ordene las filas según la nota.
Resultado:
| nombre | nota |
|---|---|
| Pedro | 4 |
| Juan | 7 |
| Ana | 8 |
Las Bases de Datos también permiten ordenar registros, con mecanismos que son solo informativos en esta materia, llamados SQL.
Son expresiones como:
SELECT *
FROM alumnos
ORDER BY nota;
Nuevamente, no pretendemos estudiar SQL en este momento, sino observar que diferentes herramientas permiten realizar operaciones semejantes sobre conjuntos de datos.
1.9. Dos conjuntos de datos relacionados
Hasta ahora utilizamos una única estructura:
Alumnos
Supongamos ahora que queremos almacenar la carrera que estudia cada alumno.
Podríamos escribir:
| id_alumno | nombre | carrera |
|---|---|---|
| 1 | Juan | Ing. Civil |
| 2 | Ana | Ing. Electrónica |
| 3 | Pedro | Ing. Civil |
Sin embargo, también podemos separar la información en dos conjuntos.
Carreras
| id_carrera | nombre_carrera |
|---|---|
| 1 | Ing. Civil |
| 2 | Ing. Electrónica |
| 3 | Ing. Industrial |
Alumnos
| id_alumno | nombre | id_carrera |
|---|---|---|
| 1 | Juan | 1 |
| 2 | Ana | 2 |
| 3 | Pedro | 1 |
Ahora el valor:
id_carrera = 1
permite relacionar:
Juan
con:
Ing. Civil
y también:
Pedro
con:
Ing. Civil
Gráficamente:
ALUMNOS CARRERAS
id_alumno id_carrera
nombre nombre_carrera
id_carrera ------------------> id_carrera
1.10. Las mismas dos estructuras en Python
En Python podemos crear:
carreras = [ {"id_carrera": 1, "nombre_carrera": "Ing. Civil"}, {"id_carrera": 2, "nombre_carrera": "Ing. Electrónica"}, {"id_carrera": 3, "nombre_carrera": "Ing. Industrial"}]
y:
alumnos = [ {"id_alumno": 1, "nombre": "Juan", "id_carrera": 1}, {"id_alumno": 2, "nombre": "Ana", "id_carrera": 2}, {"id_alumno": 3, "nombre": "Pedro", "id_carrera": 1}]
Nuevamente podemos observar la semejanza:
Hoja Carreras de Calc
|
v
Lista carreras en Python
|
v
Tabla Carreras de una Base de Datos
y:
Hoja Alumnos de Calc
|
v
Lista alumnos en Python
|
v
Tabla Alumnos de una Base de Datos
1.11. Relacionando información en Calc mediante BUSCARV
En Calc ya vimos la función BUSCARV.
Esta función busca un determinado valor en la primera columna de una matriz y permite obtener otro dato ubicado en la misma fila. Hoja de Cálculo _ Aula Virtual
Esto nos permite construir un ejemplo interesante.
Supongamos que tenemos la hoja:
Carreras
A B
id_carrera nombre_carrera
1 Ing. Civil
2 Ing. Electrónica
3 Ing. Industrial
Y otra hoja:
Alumnos
A B C
id_alumno nombre id_carrera
1 Juan 1
2 Ana 2
3 Pedro 1
Podríamos utilizar BUSCARV para buscar el id_carrera de cada alumno dentro de la tabla Carreras y obtener el nombre correspondiente.
Conceptualmente:
Juan
|
id_carrera = 1
|
v
buscar 1 en Carreras
|
v
Ing. Civil
De esta manera estamos utilizando un dato común:
id_carrera
para relacionar dos conjuntos de información.
Más adelante veremos que las Bases de Datos están especialmente diseñadas para trabajar con este tipo de relaciones.
No debemos interpretar que
BUSCARVsea equivalente a una operación de una Base de Datos. Lo importante aquí es observar que estamos utilizando un identificador para encontrar información relacionada almacenada en otro conjunto de datos.
1.12. ¿Por qué utilizar un identificador?
Podría surgir la siguiente pregunta:
¿Por qué almacenar el número 1 en lugar de escribir directamente Ing. Civil?
Por ejemplo:
Juan Ing. Civil
Pedro Ing. Civil
Laura Ing. Civil
José Ing. Civil
En este caso estamos repitiendo varias veces:
Ing. Civil
En cambio:
Juan 1
Pedro 1
Laura 1
José 1
y mantenemos la descripción completa en otro lugar:
1 Ing. Civil
Esto permite que el identificador establezca la relación entre ambos conjuntos de información.
Es una idea fundamental que encontraremos nuevamente cuando estudiemos Bases de Datos.
1.13. Archivo CSV como forma de intercambio de datos
Calc permite guardar una hoja en diferentes formatos, entre ellos CSV, que almacena los datos separados por delimitadores. Hoja de Cálculo _ Aula Virtual
Por ejemplo, nuestra tabla:
| id_alumno | nombre | nota |
|---|---|---|
| 1 | Juan | 7 |
| 2 | Ana | 8 |
| 3 | Pedro | 4 |
podría almacenarse en un archivo CSV de forma semejante a:
id_alumno,nombre,nota
1,Juan,7
2,Ana,8
3,Pedro,4
Al guardar como CSV perdemos características propias de la hoja de cálculo, tales como formatos visuales, pero conservamos los datos en una estructura sencilla de filas y columnas.
Esto permite utilizar CSV como un medio de intercambio entre diferentes programas.
Por ejemplo:
Calc
|
v
CSV
/ \
v v
Python Base de Datos
Por esta razón es habitual encontrar archivos CSV cuando diferentes aplicaciones necesitan intercambiar información.
1.14. Una misma información recorriendo diferentes herramientas
Podemos resumir todo el proceso.
Partimos de:
id_alumno | nombre | nota
1 | Juan | 7
2 | Ana | 8
3 | Pedro | 4
En Calc
Visualizamos los datos mediante filas y columnas.
En Python
Los podemos representar mediante:
alumnos = [ {"id_alumno": 1, "nombre": "Juan", "nota": 7}, {"id_alumno": 2, "nombre": "Ana", "nota": 8}, {"id_alumno": 3, "nombre": "Pedro", "nota": 4}]
En una Base de Datos
Podemos almacenarlos en una tabla:
ALUMNOS
id_alumno | nombre | nota
----------+--------+-----
1 | Juan | 7
2 | Ana | 8
3 | Pedro | 4
Lo importante no es memorizar las equivalencias, sino comprender que:
Los datos pueden ser representados, procesados y almacenados utilizando diferentes herramientas.
- Calc nos permite trabajar con ellos visualmente.
- Python nos permite procesarlos mediante un programa.
- Una Base de Datos nos permitirá almacenarlos, consultarlos y relacionarlos de manera organizada.
1.15. Cuadro comparativo final
| Concepto | Calc | Python | Base de Datos |
|---|---|---|---|
| Conjunto de datos | Tabla/rango | Lista de diccionarios | Tabla |
| Elemento individual | Fila | Diccionario | Registro |
| Característica | Columna | Clave | Campo/columna |
| Contenido | Celda | Valor | Valor |
| Seleccionar por condición | Filtro | if |
WHERE |
| Ordenar | Ordenar | Operación sobre la lista | ORDER BY |
| Relacionar información | BUSCARV puede ayudar |
Buscar en otra estructura | Relaciones entre tablas |
| Intercambiar datos | CSV | Puede leer/escribir CSV | Puede importar/exportar datos |
Nuevamente:
La tabla anterior muestra semejanzas conceptuales y no equivalencias exactas entre las herramientas.