Código básico en MySQL (base de datos) para catálogo personal de libros

Código básico en MySQL (base de datos) para catálogo personal de libros

Serie un poco odd de tutoriales básico relacionados con software libre.

José Pérez de Lama

Hacía mucho que quería aprender los rudimentos de MySQL. Creo que incluso ya no se usa (tanto?)… Pero era el programa de bases de datos de software libre que estaba debajo – back end – de muchísimas cosas durante los años buenos de Internet… Pero de picar código en consola, más que , de bonitas aplicaciones GUI. Alguna vez en alguna bronquilla con colegas activistas hackers, había dicho picado que algún día aprendería a programar para no depender de ellos… Los calentones pasajeros… 🙂

Andaba en fin un poco confundido, y me encontré no se cómo con un tutorial que me pareció muy accesible; y como en realidad lo que tenía que hacer era ordenar y tratar de colocar un montón de libros que estaban por el suelo, se me ocurrió escribir una base de datos – por lo menos boceto. Más o menos iba bien, hasta que llegó una cosa más complicada de conectar varias listas… Y finalmente, encontré a alguien como yo a quien le habían explicado en stack overflow cómo tenía que hacerlo.

Cómo (1) algunas cosas estaban explicadas un poco demasiado esquemáticamente para aficionados y (2) la parte de llamar valores de unas tablas a otras no es del todo trivial, pues pego aquí mi adaptación y unos esquemas de cómo funcionan esta unión de listas (anidadas?) con los comandos SELECT … FROM … LEFT JOIN … ON …

Igual le sirve a alguien… O por lo menos dejo constancia que lo he pasado bien. Ahora yengo que ver como sacarlo en una página web con PHP, y con eso me quedaría satisfecho con mi “promesa” de hace 15 años. 🙂 A la vez que aumentan mi admiración por mis amigos programadores!!

Los diagramitas creo que me han quedado muy claros. Más o menos se pueden parecer a las diferentes formas de conectar listas en Grasshopper, aunque no exactamente:

Las fuentes originales son:

* Tutorial de introducción a MySQL, de Derek Banas: https://www.youtube.com/watch?v=yPu6qV5byu4

* La cuestión específica del LEFT JOIN en stack overflow, respuesta de Vyktor:  https://stackoverflow.com/questions/9554560/mysql-inner-join-from-two-or-more-variables

Many thanks to both of them!!!


Entonces aquí estaría el código (para MySQL server, version 5.5.62-0ubuntu0.14.04.1).

En la terminal, abrir el MySQL, e introducir a continuación el password correspondiente:

~$ mysql -u usuario -p

Una vez ahí habría que crear la base de datos, por ejemplo:

mysql> CREATE DATABASE catalogo;

A continuación hay que ubicarse en esa base de datos que hemos creado:

mysql> USE catalogo;

A partir de ahí creamos tres tablas.  Ahí es donde me había atrancado, porque si se quiere construir con tablas independientes es necesario atomizarlas bastante.

La primera tabla es la de los libros (mantengo los nombres en inglés de stackoverflow):

mysql> CREATE TABLE books (
    -> book_title VARCHAR(255) NOT NULL,
    -> book_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);

La siguiente tabla es de los autores. Puede haber autores de varios libros, o varios autores en un mismo libro. Por esto e hace así aquí. La tercera tabla se usa para relacionar los libros con los autores; parece un poco complicado, pero es lo que permite llamar a varios autores para un mismo libro, como veremos a continuación:

mysql> CREATE TABLE authors (
    -> name VARCHAR(255) NOT NULL,
    -> author_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);
 mysql> CREATE TABLE book_authors (
     -> book_id INT UNSIGNED NOT NULL,
     -> author_id INT UNSIGNED NOT NULL,
     -> PRIMARY KEY (book_id, author_id));

Lo que queremos ahora es generar unas tablas en que salgan el título del libro junto con sus autores – un poco básico, pero por algo se empieza. El flujo de información que queremos va a ser así (la figura del inicio; la repito de nuevo). Para relacionar datos de dos tablas diferentes se usa el concepto de foreign key, que sería un campo en una tabla que es igual (matches) a otro campo de una tabla diferente. Es lo que permite referenciar los datos de una tabla desde otra. Puede ser una columna o un conjunto de columnas, que sería el caso de la tabla book_authors en este caso.

A continuación subí (distribuidos en las tres tablas) los datos de cinco libros para probar el funcionamiento. Se ven en la imagen algo más abajo. La típica orden para subir datos es así. Aquí concretamente estaría haciendo tres entradas a la vez en la lista books.

mysql> INSERT INTO books VALUES
     -> ('Título 1', NULL),
     -> ('Título 2', NULL),  
     -> ('Título 3', NULL);

En las lista book_authors tendremos que mirar los id-s de las otras listas. Supongo que habrá alguna forma de automatizarlo, pero de momento lo hice a mano; tipo así:

mysql> INSERT INTO book_authors VALUES
    -> (1, 1),
    -> (1, 2),  
    -> (2, 3);

(Para ver las variables y más detalles de cómo se introducen los valores en la tabla, puede verse el vídeo-tutorial enlazado).

Las llamadas de una tabla a otra se hacen de forma que, al menos a mí, me han resultado poco triviales. El código es el siguiente:

mysql> SELECT books.book_id AS ID, books.book_title AS Título, 
    -> GROUP_CONCAT(authors.name SEPARATOR ', ') AS Autores 
    -> FROM books
    -> LEFT JOIN book_authors ON book_authors.book_id = books.book_id
    -> LEFT JOIN authors ON authors.author_id = book_authors.author_id
    -> GROUP BY books.book_id;

El resultado, prompt, que aparece en la consola al ejectuar el script es el siguiente:

SELECT dice las variables / campos que se quieren mostrar: en este caso el identificador del libro, el título, y el nombre del autor o de los autores. GROUP_CONCAT … AS es un comando para especificar cómo van a aparecer.

LEFT JOIN …  define la lista complementaria de la que se traerán datos y ON… las keys por las que ambas listas se van a conectar.

FROM … LEFT JOIN … ON…  se repite dos veces porque tenemos tres listas como se vio antes.

LEFT JOIN es la orden que determina que se busquen todos los matches entre la lista FROM (a la izquierda) y la segunda lista. (Una fórmula más básica como FROM … WHERE … creo que se limitaría  a un matching más sencillo en el que sólo aparecería un autor por libro.

El flujo de datos de LEFT JOIN se representa en el diagrama siguiente, así como el resultado que sale en la consola (parece que conviene pinchar en la imagen para verla más grande y poder apreciar bien que ocurre):

Hasta aquí llega lo que quería contar.


Espero seguir completando la base de datos con más campos / tablas para cubrir los datos relativamente convencionales cuando se citan libros. El siguiente paso, como comentaba, es tratar de desarrollar un interfaz web, con PHP, tanto para la entrada de datos como para la salida. Eso sería, así en plan simplificado, una web interactiva que podría haber sido típica del principio de la década de 2000, al principio de la llamada web social, que luego se llamaría web 2.0; – bueno, no con el PHP a pelo, sino con algún CSS (sistemas de plantillas).

Vale.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.