Estructura de una base de datos.
Resumen.
Con este artículo ya entramos en materia sobre las bases de datos (BD ó DB -data base-), veremos como crear una con phpMyAdmin, hablaremos de las tablas, conoceremos las claves primarias, únicas… y los tipos de campos, por qué es importante tener en cuenta que vamos a guardar para saber que tipo de campo debemos elegir a la hora de crear una estructura de datos coherente, ligera y ágil.Artículo.
Para comenzar, diremos que una base de datos en una estructura compuesta de un conjunto de tablas, relacionadas o no. Estas tablas a su vez están formadas por un conjunto de campos que recogen los diferentes datos precisos para realizar una tarea concreta.
Las tareas que podemos desempeñar con una base de datos son muy amplias, desde la identificación de usuarios, pasando por el catálogo de productos de nuestra tienda online, la cesta de la compra de nuestros clientes, o las facturas de cada compra, por poner unos ejemplos.
De esto puede imaginarse que los datos que se van a guardar en cada tabla van a ser muy variopintos. Por un lado guardaremos datos, como la marca de un producto, que usualmente los guardaremos como campo tipo VARCHAR, o los precios de estos, que usualmente los guardaremos en campos tipo DOUBLE. La cantidad de artículos que compra un determinado cliente podríamos guardarla en un campo tipo INT. Todos estos datos podríamos guardarlos en un campo donde cupieran todos estos tipos de datos, por supuesto que sí, pero la ventaja de cada tipo de campo es que cada uno almacena información con un determinado número de bits, por tanto, usar un campo tipo TEXT, por ejemplo, el que usaríamos para la descripción de un producto, es contraproducente para guardar el sexo de una persona o el precio de un artículo. Este tipo de campo usa mas bits que el campo INT, por tanto, la base de datos se hará mas pesada, y por tanto, menos eficiente.
Dado que este es un curso introductorio a las bases de datos, no vamos a entrar a describir la adecuación o no de tipos de campos para ciertos tipos de datos. Pero si que es muy importante comprender esta importancia.
Datos tipo numérico.
En este tipo de campos solo pueden almacenarse números, positivos o negativos, enteros o decimales, en notación hexadecimal, científica o decimal.
Los tipos numéricos de tipo integer admiten los atributos SIGNED, los cuales pueden tener valor negativo y UNSIGNED por lo que este solo tienen valor positivo.
Además los tipos numéricos pueden usar el atributo ZEROFILL, en cuyo caso los números se completarán hasta la máxima anchura disponible con ceros (INT(5) zerofill => valor 69 se almacenará como 00069).
BIT o BOOL.- Para un número entero que puede ser 0 ó 1.
TINYINT.- Es un número entero con rango de valores válidos desde -128 a 127. Si se configura como unsigned (sin signo), el rango de valores es de 0 a 255.
SMALLINT.- para números enteros, con rango desde -32.768 a 32.767. Si se configura como unsigned, 0 a 65.535.
MEDIUMINT.- para números enteros; el rango de valores va desde -8.388.608 a 8.388.607. Si se configura como unsigned, 0 a 16.777.215.
INT.- para almacenar números enteros, en un rango de -2.147.463.846 a 2.147.483.647. Si configuramos este dato como unsigned, el rango es 0 a 4.294.967.295.
BIGINT.- Número entero con rango de valores desde -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Unsigned, desde 0 a 18.446.744.073.709.551.615.
FLOAT (m,d).- Representa números decimales. Podemos especificar cuantos dígitos (m) pueden utilizarse (término también conocido como ancho de pantalla), y cuantos en la parte decimal (d). Mysql redondeará el decimal para ajustarse a la capacidad.
DOUBLE.- Número de coma flotante de precisión doble. Es un tipo de datos igual al anterior cuya única diferencia es el rango numérico que abarca.
DECIMAL.- Almacena los números como cadenas.
Datos tipo string o cadenas.
CHAR.- Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1 a 255 caracteres.
VARCHAR.- Al igual que el anterior se utiliza para almacenar cadenas, en el mismo rango de 1-255 caracteres, pero en este caso, de longitud variable. Un campo CHAR ocupará siempre el máximo de longitud que le hallamos asignado, aunque el tamaño del dato sea menor (añadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la longitud del dato, permitiendo que el tamaño de la base de datos sea menor. Eso si, el acceso a los datos CHAR es mas rápido que VARCHAR.
No pueden alternarse columnas CHAR y VARCHAR en la misma tabla. Mysql cambiará las columnas CHAR a VARCHAR. Tambien cambia automaticamente a CHAR si usamos VARCHAR con valor de 4 o menos.
TINYTEXT, TINYBLOB.- Para un máximo de 255 caracteres. La diferencia entre la familia de datatypes text y blob es que la primera es para cadenas de texto plano (sin formato) y case-insensitive (sin distinguir mayúsculas o minúsculas) mientras que blob se usa para objetos binarios: cualquier tipo de datos o información, desde un archivo de texto con todo su formato (se diferencia en esto de el tipo Text) hasta imágenes, archivos de sonido o video.
TEXT y BLOB.- Se usa para cadenas con un rango de 255 - 65.535 caracteres. La diferencia entre ambos es que TEXT permite comparar dentro de su contenido sin distinguir mayúsculas y minúsculas, y BLOB si distingue.
MEDIUMTEXT, MEDIUMBLOB.- Textos de hasta 16.777.215 caracteres.
LONGTEXT, LONGBLOB.- Hasta máximo de 4.294.967.295 caracteres.
Otros tipos de datos.
DATE.- Para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a 9999 12 31.
DATETIME.- Combinación de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de año-mes-dia horas:minutos:segundos.
TIMESTAMP.- Combinación de fecha y hora. El rango va desde el 1 de enero de 1970 al año 2037. El formato de almacenamiento depende del tamaño del campo.
TIME.- Almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a 838, 59 minutos y 59 segundos. El formato de almacenamiento es de HH:MM:SS.
YEAR.- Almacena un año. El rango de valores permitidos va desde el año 1901 al año 2155. El campo puede tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con dos o cuatro dígitos.
SET.- Un campo que puede contener ninguno, uno ó varios valores de una lista. La lista puede tener un máximo de 64 valores.
ENUM.- Es igual que SET, pero solo se puede almacenar uno de los valores de la lista.
La única diferenciación entre los campos, no es su tipo, como la hemos definido hasta ahora. También podemos hablar de una precedencia en su importancia, importancia relativa a como se realiza las consultas respecto a estos campos, nos referimos a las claves o índices de los campos. Los índices o claves más significativos se enumeran a continuación.
Clave primaria (PRIMARY).- Cuando se realiza una búsqueda sobre la clave primaria, la búsqueda resulta altamente eficiente, y se detiene en el momento en que encuentra el valor, dado que la clave primaria no puede repetirse. Los valores con esta clave son los que se deben usar, por ejemplo, para identificar un usuario, o dar acceso a un artículo concreto de nuestro blog o artículo de nuestra tienda online. En una tabla solo puede haber una clave primaria.
Clave única (UNIQUE).- Se puede decir que las claves únicas solo se diferencian de las primarias en que puede haber varias claves únicas. Por ejemplo, el nombre de usuario o la dirección de e-mail en una tabla de registro no tiene sentido que pueda repetirse, por tal motivo, estos campos normalmente se guardan como claves únicas, por supuesto, si su uso es el indicado. Si tuviéramos una tabla de comentarios, el nombre de usuario no podría ser único, ya que entonces cada usuario solo podría hacer un comentario, cuando lo normal es que pueda emitir comentarios varios, ya sea sobre un artículo o sobre diferentes artículos. Es decir, el tipo de dato no implica el tipo de clave, es el uso que se le da a cada dato. Mala tienda online tendríamos si en la tabla de la cesta de la compra el campo e-mail fuera de tipo único.
Clave index (INDEX).- Este tipo de índice o clave está orientado a facilitar las búsquedas, hacerlas ágiles, por ejemplo, si tenemos en nuestra tienda online un conjunto de palabras y frases cortas que describen un producto, asignar este tipo de índice a ese campo hará que las búsquedas sean mas fluidas.
Clave de búsqueda “semántica” (FULLTEXT).- Este tipo de clave es similar al anterior, y básicamente lo que hace es comparar una búsqueda con la mayor similaridad en un texto, de esta forma devuelve un conjunto de resultados por orden de similaridad con el criterio buscado. Solo pueden usarse en tablas MyISAM pueden ser creados desde columnas CHAR, VARCHAR, o TEXT. El resultado de este tipo de búsquedas es muy interesante, da algo muy parecido a lo que te daría Google en un resultado de búsqueda sobre un texto.
Por último, y no menos importante haremos referencia a la codificación de nuestra base de datos, y sus respectivas tablas. Existen muchas directivas de codificación, cada una adecuada para tipos de lenguaje o tipografía (imaginemos una Web que dedicada a la enseñanza de griego clásico) de caracteres que se representan. No es lo mismo una Web por completo en ingles, que en español, en español existe la “ñ” y las tildes, cosas que no existen en el inglés, esto nos puede dar muchos dolores de cabeza cuando se trabaja con bases de datos. Desde aquí recomendaremos la codificación UTF8, tanto de los documentos que se crean, como de las indicaciones en la cabecera de nuestra Web, así como la codificación de nuestra base de datos y tablas.
Las tareas que podemos desempeñar con una base de datos son muy amplias, desde la identificación de usuarios, pasando por el catálogo de productos de nuestra tienda online, la cesta de la compra de nuestros clientes, o las facturas de cada compra, por poner unos ejemplos.
De esto puede imaginarse que los datos que se van a guardar en cada tabla van a ser muy variopintos. Por un lado guardaremos datos, como la marca de un producto, que usualmente los guardaremos como campo tipo VARCHAR, o los precios de estos, que usualmente los guardaremos en campos tipo DOUBLE. La cantidad de artículos que compra un determinado cliente podríamos guardarla en un campo tipo INT. Todos estos datos podríamos guardarlos en un campo donde cupieran todos estos tipos de datos, por supuesto que sí, pero la ventaja de cada tipo de campo es que cada uno almacena información con un determinado número de bits, por tanto, usar un campo tipo TEXT, por ejemplo, el que usaríamos para la descripción de un producto, es contraproducente para guardar el sexo de una persona o el precio de un artículo. Este tipo de campo usa mas bits que el campo INT, por tanto, la base de datos se hará mas pesada, y por tanto, menos eficiente.
Dado que este es un curso introductorio a las bases de datos, no vamos a entrar a describir la adecuación o no de tipos de campos para ciertos tipos de datos. Pero si que es muy importante comprender esta importancia.
Datos tipo numérico.
En este tipo de campos solo pueden almacenarse números, positivos o negativos, enteros o decimales, en notación hexadecimal, científica o decimal.
Los tipos numéricos de tipo integer admiten los atributos SIGNED, los cuales pueden tener valor negativo y UNSIGNED por lo que este solo tienen valor positivo.
Además los tipos numéricos pueden usar el atributo ZEROFILL, en cuyo caso los números se completarán hasta la máxima anchura disponible con ceros (INT(5) zerofill => valor 69 se almacenará como 00069).
BIT o BOOL.- Para un número entero que puede ser 0 ó 1.
TINYINT.- Es un número entero con rango de valores válidos desde -128 a 127. Si se configura como unsigned (sin signo), el rango de valores es de 0 a 255.
SMALLINT.- para números enteros, con rango desde -32.768 a 32.767. Si se configura como unsigned, 0 a 65.535.
MEDIUMINT.- para números enteros; el rango de valores va desde -8.388.608 a 8.388.607. Si se configura como unsigned, 0 a 16.777.215.
INT.- para almacenar números enteros, en un rango de -2.147.463.846 a 2.147.483.647. Si configuramos este dato como unsigned, el rango es 0 a 4.294.967.295.
BIGINT.- Número entero con rango de valores desde -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. Unsigned, desde 0 a 18.446.744.073.709.551.615.
FLOAT (m,d).- Representa números decimales. Podemos especificar cuantos dígitos (m) pueden utilizarse (término también conocido como ancho de pantalla), y cuantos en la parte decimal (d). Mysql redondeará el decimal para ajustarse a la capacidad.
DOUBLE.- Número de coma flotante de precisión doble. Es un tipo de datos igual al anterior cuya única diferencia es el rango numérico que abarca.
DECIMAL.- Almacena los números como cadenas.
Datos tipo string o cadenas.
CHAR.- Este tipo se utiliza para almacenar cadenas de longitud fija. Su longitud abarca desde 1 a 255 caracteres.
VARCHAR.- Al igual que el anterior se utiliza para almacenar cadenas, en el mismo rango de 1-255 caracteres, pero en este caso, de longitud variable. Un campo CHAR ocupará siempre el máximo de longitud que le hallamos asignado, aunque el tamaño del dato sea menor (añadiendo espacios adicionales que sean precisos). Mientras que VARCHAR solo almacena la longitud del dato, permitiendo que el tamaño de la base de datos sea menor. Eso si, el acceso a los datos CHAR es mas rápido que VARCHAR.
No pueden alternarse columnas CHAR y VARCHAR en la misma tabla. Mysql cambiará las columnas CHAR a VARCHAR. Tambien cambia automaticamente a CHAR si usamos VARCHAR con valor de 4 o menos.
TINYTEXT, TINYBLOB.- Para un máximo de 255 caracteres. La diferencia entre la familia de datatypes text y blob es que la primera es para cadenas de texto plano (sin formato) y case-insensitive (sin distinguir mayúsculas o minúsculas) mientras que blob se usa para objetos binarios: cualquier tipo de datos o información, desde un archivo de texto con todo su formato (se diferencia en esto de el tipo Text) hasta imágenes, archivos de sonido o video.
TEXT y BLOB.- Se usa para cadenas con un rango de 255 - 65.535 caracteres. La diferencia entre ambos es que TEXT permite comparar dentro de su contenido sin distinguir mayúsculas y minúsculas, y BLOB si distingue.
MEDIUMTEXT, MEDIUMBLOB.- Textos de hasta 16.777.215 caracteres.
LONGTEXT, LONGBLOB.- Hasta máximo de 4.294.967.295 caracteres.
Otros tipos de datos.
DATE.- Para almacenar fechas. El formato por defecto es YYYY MM DD desde 0000 00 00 a 9999 12 31.
DATETIME.- Combinación de fecha y hora. El rango de valores va desde el 1 de enero del 1001 a las 0 horas, 0 minutos y 0 segundos al 31 de diciembre del 9999 a las 23 horas, 59 minutos y 59 segundos. El formato de almacenamiento es de año-mes-dia horas:minutos:segundos.
TIMESTAMP.- Combinación de fecha y hora. El rango va desde el 1 de enero de 1970 al año 2037. El formato de almacenamiento depende del tamaño del campo.
TIME.- Almacena una hora. El rango de horas va desde -838 horas, 59 minutos y 59 segundos a 838, 59 minutos y 59 segundos. El formato de almacenamiento es de HH:MM:SS.
YEAR.- Almacena un año. El rango de valores permitidos va desde el año 1901 al año 2155. El campo puede tener tamaño dos o tamaño 4 dependiendo de si queremos almacenar el año con dos o cuatro dígitos.
SET.- Un campo que puede contener ninguno, uno ó varios valores de una lista. La lista puede tener un máximo de 64 valores.
ENUM.- Es igual que SET, pero solo se puede almacenar uno de los valores de la lista.
La única diferenciación entre los campos, no es su tipo, como la hemos definido hasta ahora. También podemos hablar de una precedencia en su importancia, importancia relativa a como se realiza las consultas respecto a estos campos, nos referimos a las claves o índices de los campos. Los índices o claves más significativos se enumeran a continuación.
Clave primaria (PRIMARY).- Cuando se realiza una búsqueda sobre la clave primaria, la búsqueda resulta altamente eficiente, y se detiene en el momento en que encuentra el valor, dado que la clave primaria no puede repetirse. Los valores con esta clave son los que se deben usar, por ejemplo, para identificar un usuario, o dar acceso a un artículo concreto de nuestro blog o artículo de nuestra tienda online. En una tabla solo puede haber una clave primaria.
Clave única (UNIQUE).- Se puede decir que las claves únicas solo se diferencian de las primarias en que puede haber varias claves únicas. Por ejemplo, el nombre de usuario o la dirección de e-mail en una tabla de registro no tiene sentido que pueda repetirse, por tal motivo, estos campos normalmente se guardan como claves únicas, por supuesto, si su uso es el indicado. Si tuviéramos una tabla de comentarios, el nombre de usuario no podría ser único, ya que entonces cada usuario solo podría hacer un comentario, cuando lo normal es que pueda emitir comentarios varios, ya sea sobre un artículo o sobre diferentes artículos. Es decir, el tipo de dato no implica el tipo de clave, es el uso que se le da a cada dato. Mala tienda online tendríamos si en la tabla de la cesta de la compra el campo e-mail fuera de tipo único.
Clave index (INDEX).- Este tipo de índice o clave está orientado a facilitar las búsquedas, hacerlas ágiles, por ejemplo, si tenemos en nuestra tienda online un conjunto de palabras y frases cortas que describen un producto, asignar este tipo de índice a ese campo hará que las búsquedas sean mas fluidas.
Clave de búsqueda “semántica” (FULLTEXT).- Este tipo de clave es similar al anterior, y básicamente lo que hace es comparar una búsqueda con la mayor similaridad en un texto, de esta forma devuelve un conjunto de resultados por orden de similaridad con el criterio buscado. Solo pueden usarse en tablas MyISAM pueden ser creados desde columnas CHAR, VARCHAR, o TEXT. El resultado de este tipo de búsquedas es muy interesante, da algo muy parecido a lo que te daría Google en un resultado de búsqueda sobre un texto.
Por último, y no menos importante haremos referencia a la codificación de nuestra base de datos, y sus respectivas tablas. Existen muchas directivas de codificación, cada una adecuada para tipos de lenguaje o tipografía (imaginemos una Web que dedicada a la enseñanza de griego clásico) de caracteres que se representan. No es lo mismo una Web por completo en ingles, que en español, en español existe la “ñ” y las tildes, cosas que no existen en el inglés, esto nos puede dar muchos dolores de cabeza cuando se trabaja con bases de datos. Desde aquí recomendaremos la codificación UTF8, tanto de los documentos que se crean, como de las indicaciones en la cabecera de nuestra Web, así como la codificación de nuestra base de datos y tablas.
Tags: Campos || índices || PRIMARY || UNIQUE || INDEX || tablas