Unidad 1

Gestión de Base de Datos

Indice

INTRODUCCIÓN

Ventajas

Que es una base de datos

Lenguaje de consulta SQL

Diferencia entre una base de datos y Hojas de calculo

Tipos de bases de datos

Tipos de datos

Atributos de campo

Diseño de tablas en las bases de datos.

Normalización

Definición de las relaciones

Base de datos ejemplo tienda

Ejercicio de Base de datos

Anexo 1 Código de barras

Evaluación Diagnostica de Base de Datos

Evalucion
          Diagnostica de Base de Datos

1.-    INTRODUCCIÓN

Que es PhpMyAdmin

Es un software de código abierto diseñado para administrar y gestionar bases de datos con SQL (lenguaje de consulta estructurada), con una interface gráfica usando PHP (Hypertext Preprocessor: es un lenguaje de código abierto muy popular especialmente adecuado para el desarrollo web y que puede ser incrustado en HTML.)

Se pueden crear bases de datos, tablas, consultas, búsquedas de datos.

PhpMyAdmin fue iniciado en 1998, pesando en una red administrativa, fue tomando forma para que sea lo mas simple posible, en 2001, fue concedido a SourceForge.org, actualmente esta en 55 idiomas.

En este curso se trabaja bajo LINUX, usando LAMP, sin embargo podemos instalar PhpMyAdmin en Windows 10 x64, que tiene por nombre wampserver3.3.2.exe

en este video se ve el proceso de instalación en windows 10

descargar para Windows 10 tamaño de archivo descarga 591.5 Mb win10.zip dentro de este archivo encontraras todas las actualizaciones de visual c, para redistribución npp.7.9.1.installer.exe (notepad ++) wampserver3.2.2_x64.exe, y el url donde se obtuvieron los programas, excepto notepad++, con una salvedad, ya no es necesario especificar immodb para MariaDB, ya lo tiene por defecto, a comparación de versiones anteriores, el proceso del video anteriormente es lo mismo, la instalación para Windows 8-8,1 es igual solo que cambian algunos archivos para Visual C++, y el instalador de PhpMyAdmin tiene por nombre wampserver2.2e-php5.4.3-httpd-2.4.2-mysql5.5.24-x64.exe  la descarga para Windows 8-8.1 tamaño del archivo descarga 177.75 Mb win8.1.zip

para windows 7 use el siguiente enlace que explica la instalación  wamp_windows7

para realizar nuestras pruebas esta bien pero para un entorno de producción, debemos de tener en consideración la seguridad para ello los usuarios de windows (cualquier versión) deberán de consultar esta pagina de PhpMyAdmin

Aquí otra pagina de configuración PhpMyAdmin (en ingles)

es indispensable tenerlo instalado para poder seguir con el curso

Realiza el siguiente Test 1 Unidad 1

Test 1 Unidad
          1

Ventajas

Usa 10 MB de espacio en disco, por lo que es muy ligero en espacio de disco, y tiene todos los idiomas disponibles.
Es opensource (GNU)
Es por default PhpMyAdmin en los hostings de la nube.
Es muy popular y fácil de usar

la tendencia es muy interesante con sistemas de sistemas abiertos (open source)  Trend Google

¿Qué es una base de datos?


Una base de datos es una recopilación organizada de información o datos estructurados, que normalmente se almacena de forma electrónica en un sistema informático. Normalmente, una base de datos está controlada por un sistema de gestión de bases de datos (DBMS). En conjunto, los datos y el DBMS, junto con las aplicaciones asociadas a ellos, reciben el nombre de sistema de bases de datos, abreviado normalmente a simplemente base de datos.

Los datos de los tipos más comunes de bases de datos en funcionamiento actualmente se suelen utilizar como estructuras de filas y columnas en una serie de tablas para aumentar la eficacia del procesamiento y la consulta de datos. Así, se puede acceder, gestionar, modificar, actualizar, controlar y organizar fácilmente los datos. La mayoría de las bases de datos utilizan un lenguaje de consulta estructurada (SQL) para escribir y consultar datos.

¿Qué es el lenguaje de consulta estructurada (SQL)?

El SQL es un lenguaje de programación que utilizan casi todas las bases de datos relacionales para consultar, manipular y definir los datos, además de para proporcionar control de acceso. El SQL se desarrolló por primera vez en IBM en la década de 1970 con Oracle como uno de los principales contribuyentes, lo que dio lugar a la implementación del estándar ANSI SQL. El SQL ha propiciado muchas ampliaciones de empresas como IBM, Oracle y Microsoft. Aunque el SQL se sigue utilizando mucho hoy en día, están empezando a aparecer nuevos lenguajes de programación.

¿Cuál es la diferencia entre una base de datos y una hoja de cálculo?

Tanto las bases de datos como las hojas de cálculo (como Microsoft Excel) son modos cómodos de almacenar información. Las principales diferencias entre los dos son:

Cómo se almacenan y se manipulan los datos

Quién puede acceder a los datos

Cuántos datos pueden almacenarse

Las hojas de cálculo se diseñaron originalmente para un usuario y sus características así lo reflejan. Son perfectas para un único usuario o para un pequeño número de usuarios que no necesiten hacer una gran manipulación de datos increíblemente complicada. Las bases de datos, por otro lado, están diseñadas para contener recopilaciones mucho más grandes de información organizada, a veces en cantidades masivas. Las bases de datos permiten que muchos usuarios accedan y consulten los datos de forma rápida y segura al mismo tiempo mediante una lógica, y un lenguaje muy complejos.

Tipos de bases de datos (1)

Existen muchos tipos diferentes de bases de datos. La mejor base de datos para una organización específica depende de cómo pretenda la organización utilizar los datos.


Bases de datos relacionales

Las bases de datos relacionales se hicieron predominantes en la década de 1980. Los elementos de una base de datos relacional se organizan como un conjunto de tablas con columnas y filas. La tecnología de bases de datos relacionales proporciona la forma más eficiente y flexible de acceder a esta información.

Bases de datos orientadas a objetos

La información de una base de datos orientada a objetos se representa en forma de objetos, como en la programación orientada a objetos.

Bases de datos distribuidas

Una base de datos distribuida consta de dos o más archivos que se encuentran en sitios diferentes. La base de datos puede almacenarse en varios ordenadores, ubicarse en la misma ubicación física o repartirse en diferentes redes.

Almacenes de datos

Un repositorio central de datos, un data warehouse es un tipo de base de datos diseñado específicamente para consultas y análisis rápidos.

Bases de datos NoSQL

Una base de datos NoSQL, o base de datos no relacional, permite almacenar y manipular datos no estructurados y semiestructurados (a diferencia de una base de datos relacional, que define cómo se deben componer todos los datos insertados en la base de datos). Las bases de datos NoSQL se hicieron populares a medida que las aplicaciones web se volvían más comunes y complejas.

Bases de datos orientadas a grafos

Una base de datos orientada a grafos almacena datos relacionados con entidades y las relaciones entre entidades.
Bases de datos OLTP. Una base de datos OLTP es una base de datos rápida y analítica diseñada para que muchos usuarios realicen un gran número de transacciones.

Estos son solo algunos de las varias docenas de tipos de bases de datos que se utilizan hoy en día. Otras bases de datos menos comunes se adaptan a funciones científicas, financieras o de otro tipo muy específicas. Además de los diferentes tipos de bases de datos, los cambios en los enfoques de desarrollo tecnológico y los avances considerables, como la nube y la automatización, están impulsando a las bases de datos en direcciones completamente nuevas. Algunas de las bases de datos más recientes incluyen

Bases de datos de código abierto

Un sistema de base de datos de código abierto es aquel cuyo código fuente es de código abierto; tales bases de datos pueden ser bases de datos SQL o NoSQL.

Bases de datos en la nube

Una base de datos en la nube es una recopilación de datos, estructurados o no estructurados, que reside en una plataforma de cloud computing privada, pública o híbrida. Existen dos tipos de modelos de bases de datos en la nube: el modelo tradicional y el de base de datos como servicios (database as a service, DBaaS). Con DBaaS, un proveedor de servicios realiza las tareas administrativas y el mantenimiento.

Base de datos multimodelo

Las bases de datos multimodelo combinan distintos tipos de modelos de bases de datos en un único servidor integrado. Esto significa que pueden incorporar diferentes tipos de datos.

Bases de datos de documentos/JSON

Diseñadas para almacenar, recuperar y gestionar información orientada a los documentos, las bases de datos de documentos son una forma moderna de almacenar los datos en formato JSON en lugar de hacerlo en filas y columnas.

Bases de datos de autogestión

El tipo de base de datos más nuevo e innovador, las bases de datos de autogestión (también conocidas como bases de datos autónomas) están basadas en la nube y utilizan el machine learning para automatizar el ajuste de la base de datos, la seguridad, las copias de seguridad, las actualizaciones y otras tareas de gestión rutinarias que tradicionalmente realizan los administradores de bases de datos.

Realiza el siguiente Test 2 Unidad 1

Test 2 Unidad
          1



Tipos de Datos (2)

Los tipos de datos que puede haber en un campo, se pueden agrupar en tres grandes grupos:

Tipos numéricos
Tipos de Fecha
Tipos de Cadena

1 Tipos numéricos:

Existen tipos de datos numéricos, que se pueden dividir en dos grandes grupos, los que están en coma flotante (con decimales) y los que no.

TinyInt:
Es un número entero con o sin signo. Con signo el rango de valores válidos va desde -128 a 127. Sin signo, el rango de valores es de 0 a 255

Bit ó Bool:
Un número entero que puede ser 0 ó 1

SmallInt:
Número entero con o sin signo. Con signo el rango de valores va desde -32,768 a 32,767. Sin signo, el rango de valores es de 0 a 65,535.

MediumInt:
Número entero con o sin signo. Con signo el rango de valores va desde -8,388,608 a 8,388,607. Sin signo el rango va desde 0 a 16,777,215.

Integer, Int:
Número entero con o sin signo. Con signo el rango de valores va desde -2,147,483,648 a 2,147,483,647. Sin signo el rango va desde 0 a 4,294,967,295

BigInt:
Número entero con o sin signo. Con signo el rango de valores va desde -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807. Sin signo el rango va desde 0 a 18,446,744,073,709,551,615.

Float:
Número pequeño en coma flotante de precisión simple. Los valores válidos van desde -3.402823466E+38 a -1.175494351E-38, 0 y desde 1.175494351E-38 a 3.402823466E+38.

xReal, Double:
Número en coma flotante de precisión doble. Los valores permitidos van desde -1.7976931348623157E+308 a -2.2250738585072014E-308, 0 y desde 2.2250738585072014E-308 a 1.7976931348623157E+308

Decimal, Dec, Numeric:

Número en coma flotante desempaquetado. El número se almacena como una cadena

Tipo de Campo
Tamaño de Almacenamiento
TINYINT
1 byte
SMALLINT
2 byte
MEDIUMINT
3 byte
INT
4 bytes
INTEGER
4 bytes
BIGINT
8 bytes
FLOAT(X)
4 ú 8 bytes
FLOAT
4 bytes
DOUBLE
8 bytes
DOUBLE PRECISION
8 bytes
REAL
8 bytes
DECIMAL(M,D)
M+2 bytes sí D > 0,
M+1 bytes sí D = 0
NUMERIC(M,D)
M+2 bytes if D > 0,
M+1 bytes if D = 0

Realiza el siguiente Test 3 Unidad 1

Test 3 Unidad
          1

2 Tipos fecha:

A la hora de almacenar fechas, hay que tener en cuenta que Mysql no comprueba de una manera estricta si una fecha es válida o no. Simplemente comprueba que el mes esta comprendido entre 0 y 12 y que el día esta comprendido entre 0 y 31.

Date:
Tipo fecha, almacena una fecha. El rango de valores va desde el 1 de enero del 1001 al 31 de diciembre de 9999. El formato de almacenamiento es de año-mes-dia

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:

Tamaño
Formato
14
AñoMesDiaHoraMinutoSegundo
 aaaammddhhmmss
12
AñoMesDiaHoraMinutoSegundo
aammddhhmmss
8
AñoMesDia
aaaammdd
6
AñoMesDia
aammdd
4
AñoMes
aamm
2
Año
aa


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.


Tipo de Campo Tamaño de Almacenamiento
DATE 3 bytes
DATETIME 8 bytes
TIMESTAMP 4 bytes
TIME 3 bytes
YEAR 1 byte

Realiza el siguiente Test 4 Unidad 1

Test 4 Unidad
          1

3 Tipos de cadena:

Char(n):

Almacena una cadena de longitud fija. La cadena podrá contener desde 0 a 255 caracteres.

Comencemos por el tipo de dato alfanumérico mas simple: CHAR (character, o carácter). (3)

Este tipo de dato permite almacenar textos breves, de hasta 255 caracteres de longitud como máximo en caracteres que le definamos, aunque no lo utilicemos.

Por ejemplo, si definiéramos un campo "nombre" de 14 caracteres como CHAR, reservará (y consumirá en disco) este espacio.

1    2    3    4    5    6    7    8    9    10    11    12    13    14
J    u    a    n           P    e    r    e     z                   
C   a    r     l     o    s           G   a    r    c    i    a     
J    o    s     e          R    a    m   i    r    e    z          
L    u    i     s          F     e    r    n    a   n    d    e    z
P    e    p    e         L     o    p    e    z

Por lo tanto, no es eficiente cuando la longitud del dato que se almacenará en un campo es desconocida a priori (típicamente, datos ingresados por el usuario en un formulario, como su nombre, domicilio, etc.)

¿En qué casos usarlo, entonces? Cuando el contenido de ese campo será completado por nosotros, programadores, al agregarse un registro y, por lo tanto, estamos seguros de que la longitud siempre será la misma.   

VarChar(n):

Almacena una cadena de longitud variable. La cadena podrá contener desde 0 a 255 caracteres. (3)

Complementario, el tipo de dato VARCHAR (varying character, o caracteres variables) es útil cuando la longitud del dato es desconocida, cuando depende de la información que el usuario escribe en campos o áreas de texto de un formulario.

La longitud máxima permitida era de 255 caracteres hasta MySQL 5.0.3. pero desde esta versión cambio a un máximo de 65.535 caracteres.

Este tipo de dato tiene la particularidad de que cada registro puede tener una longitud diferente, que dependerá de su contenido; si en su registro el campo "nombre" (supongamos que hubiera sido definido con un ancho máximo de 20 caracteres) contiene solamente el texto: "Pepe", consumirá sólo cinco caracteres, cuatro para las cuatro letras, y uno más que indicará cuántas letras se utilizaron.

Si luego, en otro registro, se ingresa un nombre de 15 caracteres, consumirá 16 caracteres (siempre uno más que la longitud del texto, mientras la longitud no supere los 255 caracteres; si no los supera, serán dos los bytes necesarios para indicar la longitud).

Por lo tanto, será más eficiente para almacenar registros cuyos valores tengan longitudes variables, ya que si bien "gasta" uno o dos caracteres por registro para declarar la longitud, esto le permite ahorrar muchos otros caracteres que no serían utilizados.

Dentro de los tipos de cadena se pueden distinguir otros dos subtipos, los tipo Test y los tipo BLOB (Binary Large Object)

La diferencia entre un tipo y otro es el tratamiento que reciben a la hora de realizar ordenamientos y comparaciones. Mientras que el tipo test se ordena sin tener en cuenta las Mayúsculas y las minúsculas, el tipo BLOB se ordena teniéndolas en cuenta.

Los tipos BLOB se utilizan para almacenar datos binarios como pueden ser ficheros.

TinyText y TinyBlob:

Columna con una longitud máxima de 255 caracteres.

Blob y Text:

Un texto con un máximo de 65535 caracteres.

La principal desventaja de TEXT es que no puede indexarse fácilmente (a diferencia de VARCHAR).

Tampoco se le puede asignar un valor predeterminado a un campo TEXT (un valor por omisión que se complete automáticamente si no se ha proporcionado un valor al insertar un registro).

Sólo deberíamos utilizarlo para textos realmente muy largos

MediumBlob y MediumText:

Un texto con un máximo de 16.777.215 caracteres.

LongBlob y LongText:

Un texto con un máximo de caracteres 4.294.967.295. Hay que tener en cuenta que debido a los protocolos de comunicación los paquetes pueden tener un máximo de 16 Mb.

Enum:

Campo que puede tener un único valor de una lista que se especifica. El tipo Enum acepta hasta 65535 valores distintos.

Su nombre es la abreviatura de "enumeración". Este campo nos permite establecer cuáles serán los valores posibles que se le podrán insertar.

Es decir, crearemos una lista de valores permitidos, y no se autorizará el ingreso de ningún valor fuera de la lista, y se permitirá elegir solo uno de estos datos como valor del campo.

Los valores deben estar separados por comas y envueltos entre comillas simples.

El máximo de valores diferentes es de 65.535.

Lo que se almacenará no es la cadena de caracteres en sí, sino el número de índice de su posición dentro de la enumeración.

Set:

Un campo que puede contener ninguno, uno ó varios valores de una lista. La lista puede tener un máximo de 64 valores.

Su nombre significa "conjunto". De la misma manera que ENUM, debemos especificar una lista, pero de hasta 64 opciones solamente.

La carga de esos valores es idéntica a la de ENUM, una lista de valores entre comillas simples, separados por comas. Pero, a diferencia de ENUM, sí podemos llegar a dejarlo vacío, sin elegir ninguna opción de las posibles.

Y también podemos elegir como valor del campo más de uno de los valores de la lista.

Por ejemplo, darnos a elegir una serie de temas (típicamente con casillas de verificación que permiten selección múltiple) y luego almacenamos en un solo campo todas las opciones elegidas.

Un detalle importante es que cada valor dentro de la cadena de caracteres no puede contener comas, ya que es la coma el separador entre un valor y otro.


Tipo de campo Tamaño de Almacenamiento
CHAR(n) n bytes
VARCHAR(n) n +1 bytes
TINYBLOB, TINYTEXT Longitud+1 bytes
BLOB, TEXT Longitud +2 bytes
MEDIUMBLOB, MEDIUMTEXT Longitud +3 bytes
LONGBLOB, LONGTEXT Longitud +4 bytes
ENUM('value1','value2',...) 1 ó dos bytes dependiendo del número de valores
SET('value1','value2',...) 1, 2, 3, 4 ó 8 bytes, dependiendo del número de valores

Diferencia de almacenamiento entre los tipos Char y VarChar


Valor CHAR(4) Almacenamiento VARCHAR(4) Almacenamiento
'' '' 4 bytes " 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd'
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Realiza el siguiente Test 5 Unidad 1

Test 5 Unidad
          1

También podemos incluir los atributos de los campos:

NULL (4)

El valor NULL representa a un valor desconocido.

Este valor NULL puede ser asignado como valor a cualquier columna de una tabla.

Si el valor de una columna es opcional, quiere decir, que podemos insertar una fila en la tabla sin asignarle ningún valor a esa columna opcional, así que esa columna tomará el valor NULL.

El valor NULL es un valor especial, y por tanto, no se puede comparar con los operadores aritméticos normales (=, >, <, <>), y en su lugar debemos utilizar los operadores IS y IS NOT.

En la tabla personas, tenemos la columna 'apellido2' que es opcional y puede tener valores nulos:

nombre       apellido1    apellido2    edad
ANTONIO    PEREZ                           30
LUIS            LOPEZ         PEREZ        45
ANTONIO    GARCIA                         50


DEFAULT (5)

La restricción DEFAULT se usa para proporcionar un valor predeterminado para una columna.
El valor predeterminado se agregará a todos los registros nuevos SI no se especifica ningún otro valor.

BINARY (6)

Los tipos BINARY y VARBINARY son similares a CHAR y VARCHAR, excepto que almacenan cadenas binarias en lugar de cadenas no binarias. Es decir, almacenan cadenas de bytes en lugar de cadenas de caracteres. Esto significa que tienen el binary juego de caracteres y la clasificación, y la comparación y clasificación se basan en los valores numéricos de los bytes en los valores.

La longitud máxima permitida es la misma para BINARY y VARBINARY que para CHAR y VARCHAR, excepto que la longitud de BINARY y VARBINARY se mide en bytes en lugar de caracteres.

Ejemplo: Para una BINARY(3)columna, 'a 'se vuelve 'a \0'cuando se inserta. 'a\0'se vuelve 'a\0\0'cuando se inserta. Ambos valores insertados permanecen sin cambios para las recuperaciones.

Para VARBINARY, no hay relleno para inserciones y no se eliminan bytes para recuperaciones. Todos los bytes son significativos en las comparaciones, incluidas las operaciones ORDER BY y DISTINCT. 0x00 y el espacio difieren en las comparaciones, con 00x0 la clasificación antes que el espacio.

INDEX (7)

MySQL emplea los índices para encontrar las filas que contienen los valores específicos de las columnas empleadas en la consulta de una forma más rápida.  Si la tabla contiene índices en las columnas empleadas en la consulta, MySQL tendría una referencia directa hacia los datos sin necesidad de recorrer secuencialmente todos ellos.

PRIMARY KEY (8)

Introducción a la clave principal de MySQL
Una clave principal es una columna o un conjunto de columnas que identifica de forma única cada fila de la tabla. La clave primaria sigue estas reglas:

Una clave principal debe contener valores únicos. Si la clave principal consta de varias columnas, la combinación de valores en estas columnas debe ser única.
Una columna de clave principal no puede tener NULL valores. Cualquier intento de insertar o actualizar NULL las columnas de la clave principal generará un error. Tenga en cuenta que MySQL agrega implícitamente una NOT NULL restricción a las columnas de clave principal.
Una tabla puede tener una y solo una clave primaria.

Debido a que MySQL funciona más rápido con números enteros, el tipo de datos de la columna de la clave principal debe ser el número entero, por ejemplo, y debe asegurarse de que los rangos de valores del tipo entero para la clave principal sean suficientes para almacenar todas las filas posibles que pueda tener la tabla. INT, BIGINT.

Cuando define una clave principal para una tabla, MySQL crea automáticamente un índice llamado PRIMARY.

Foreign Key FK

La clave foránea identifica una columna o grupo de columnas en una tabla (tabla hija o referendo) que se refiere a una columna o grupo de columnas en otra tabla (tabla maestra o referenciada). Las columnas en la tabla referendo deben ser la clave primaria u otra clave candidata en la tabla referenciada.

Los valores en una fila de las columnas referendo deben existir solo en una fila en la tabla referenciada. Así, una fila en la tabla referendo no puede contener valores que no existen en la tabla referenciada. De esta forma, las referencias pueden ser creadas para vincular o relacionar información. Esto es una parte esencial de la normalización de base de datos. Múltiples filas en la tabla referendo pueden hacer referencia, vincularse o relacionarse a la misma fila en la tabla referenciada. Mayormente esto se ve reflejado en una relación uno (tabla maestra o referenciada) a muchos (tabla hija o referendo).

AUTO_INCREMENT (9)

El incremento automático permite generar automáticamente un número único cuando se inserta un nuevo registro en una tabla. A menudo, este es el campo de clave principal que nos gustaría que se creara automáticamente cada vez que se inserta un nuevo registro.

UNIQUE (10)

A veces, desea asegurarse de que los valores de una columna o un grupo de columnas sean únicos. Por ejemplo, las direcciones de correo electrónico de los usuarios de la users tabla o los números de teléfono de los clientes de la customers tabla deben ser únicos. Para hacer cumplir esta regla, utiliza una restricción UNIQUE. Es una restricción de integridad que garantiza que los valores de una columna o grupo de columnas sean únicos. Una restricción UNIQUE puede ser una restricción de columna o una restricción de tabla.

FULLTEXT (11)

La búsqueda de texto completo en el servidor MySQL permite a los usuarios ejecutar consultas de texto completo en datos basados ​​en caracteres en tablas MySQL. Debe crear un índice de texto completo en la tabla antes de ejecutar consultas de texto completo en una tabla. El índice de texto completo puede incluir una o más columnas basadas en caracteres en la tabla.

FULLTEXT es el tipo de índice de índice de texto completo en MySQL.

Realiza el siguiente Test 6 Unidad 1

Test 6 Unidad
          1


Diseño de Tablas en la base de datos

Ahora que ya tenemos la información suficiente para poder definir la forma de que se almacenaran los datos en los campos de la tabla, procedemos al diseño de las tablas, en la base de datos, para ello hay varias herramientas, una de ellas es DBDesigner 4, este solo se mantuvo hasta la versión 6.9 de Centos, en CentOS 7, ya no se actualizo, pero en Windows esta disponible, funciona bien, para nuestro caso en CentOS stream 9/ Rocky Linux 9, usaremos esta pagina WEB que hace el mismo proceso que DBDesigner, solo hay que registrarse, y también es funcional en Windows se recomienda usar esta app: 

 1.- Iniciamos en la pagina : https://app.dbdesigner.net/ que nos llevara a lo siguiente:

2.- Del lado derecho vemos una etiqueta que tiene como nombre Guest, hacemos clic ahí y seleccionamos Sign-up, firmarse para tener un área de trabajo y guardar el diseño(s) de la tablas para la base de datos.



3.- Nos solicitara algunos datos sin complicaciones de autorizaciones u confirmaciones, al terminar de ingresar información hacemos clic en la parte inferior CREATE ACCOUNT +



4.- Terminado el proceso de firma nos mostrara el nombre con se firmo, y listo para realizar tablas de las bases de datos.




5.- Finalmente cuando requerimos acceder a muestro pizarrón, usamos el botón Guest, y Login:


6. - Autentificamos con los datos registrados

7.- Si deseas puedes cambiar de idioma para poder trabajar con facilidad, deberás  de usar menú View -> Options...

8.- Seleccionar de la lista el idioma que mas te acomode para trabajar.

Realizado el cambio de idioma hacemos clic en Save Changes

Comencemos por establecer el nombre del proyecto, desde el menú Esquema, Nuevo ...


Seleccionamos el sistema de bases de datos que necesitemos para realizar la estructura junto con sus tablas, en este caso Mysql, y le establecemos un nombre por ejemplo personal.



y clic en Crear nuevo esquema


el siguiente paso es en el menú Insertar -> Tabla

Comencemos con un ejemplo simple en la base de datos llamada personal agregaremos una tabla de nombre personas_informatica, (sin acentos) para cambiar el nombre, observe la imagen anterior, en la parte superior de la tabla esta un icono que tiene una hoja y un lápiz  hagan clic ahí y te solicitara que coloques un nombre a la tabla:


si desean agrega un comentario como, esta tabla es la del personal que trabaja en el área de informática, solo clic en Guardar, y posteriormente Comenzamos a añadir campos (en la parte inferior Añadir Campo) que en esta tabla tendrán los siguientes datos: Nombre, Apellido_p, Apellido_m, Dom_calle, Dom_num, Tel_celular, Tel_fijo, Fecha_nac, Fecha_ingreso, Horas_trabajo, los tipos de datos son los siguientes:

Nombre
varchar(20)
Apellido_p
varchar(15)
Apellido_m varchar(15)
Dom_calle varchar(25)
Dom_num
int
Tel_celular
varchar(15)
Tel_fijo 
varchar(15)
Fecha_nac
date
Fecha_ingreso date
Horas_trabajo int


con estos datos se vería asi:


Todos los campos de esta tabla se deberán de verse asi:

Antes de continuar debemos guardar el esquema con la tabla, usamos el menú Esquema y Guardar como ..








El nombre a guardar será personal que es el nombre del esquema, y dentro del esquema esta la tabla personal_informatica

Ya tenemos nuestro primer esquema (Base de Datos) y nuestra primer tabla. Podemos cerrar el esquema si asi fuera necesario, y al volver a la pagina y autentificarse de nuevo para continuar:

para cerrar:

para ingresar:

después debemos cargar el esquema que estamos usando aquí lo guarde 2 ocasiones para que se note la forma que podemos tener varios esquemas (Bases de Datos), tomo la primera es el mas reciente, cuando se vaya creando mas tablas, solo tome la opción guardar .

Cuando tengamos acceso a nuestro diseño lo podemos exportar a un "formato" para SQL, (que lo utilizaremos para realizar nuestra tabla en PhpMyAdmin, y agregarlo en mariaDB), usamos el menú Exportar -> SQL).


Seleccionamos Create script (genera la secuencia para la creación de una tabla en mariaDB)


se guarda en un directorio que prefieras y al leerlo se vera asi (puede ser con cualquier editor de texto, en nuestro caso con Editor BlueFish, este editor esta solo en LINUX, no hay para Windows, pero puedes usar el block de notas):

Podemos usarlo, copiando el contenido a PhpMyAdmin.

Iniciamos PhpMyAdmin, (en la unidad 1, capitulo 2 se explica como instalar MySQL y PhpMyAdmin, en Gestion de sistemas operativos, en LINUX, que es la plataforma adecuada para PhpMyAdmin) y creamos un esquema (base de datos) llamada personal, del lado izquierdo el panel, haga clic en Nueva, se mostrara del lado derecho Base de Datos, y escribimos personal, y botón crear:

No hay tablas creadas aun, usemos la etiqueta SQL, y copiemos el script que nos genero DBDesigner en ese lugar




Hacemos clic en el botón continuar (si existiese un problema en la estructura de la tabla se mostrara en la parte inferior de la ventana)

vemos que el resultado de la consulta da por resultado la creación de una tabla llamada personas_informatica, (a pesar que dice consulta la instrucción  es CREATE TABLE, del lado izquierdo vemos la jerarquía de la estructura, personal, es la base de datos, y de ahí se desprende personas_informatica, el recuadro verde indica que todo se realizo correctamente:


Regresemos a el separador llamado Estructura (Schema, Esquema), y veamos lo que nos muestra, una columna que tiene el nombre de la tabla, personas_informatica, consideren un punto importante los tipos int definen  como int(2), int(10), significa el tamaño del campo, no el valor, lo pueden manejar sin problema pero lo consideran como int unicamente, en windows puede marcar un mensaje de Warning, pero no hay problema, puede considerar campos int como de esta forma o con longitud de campo, espara restringir la longitud de datos pero int, seguira teniendo su capacidad de almacenamiento, recuerdas cual es su rango de valores ?.

Hagamos clic en el botón estructura (de la tabla), y observemos que la estructura de la tabla se encuentra lista para comenzar a recibir datos

podemos agregar datos directamente, ve el titulo en color rojo (claro es un ejemplo de como ingresar datos, pero el proceso se hace desde una interface apropiada como una pagina web pero aquí lo haremos de forma directa)

vemos un ejemplo de como llenar los datos, recordemos que el formato de fecha es año mes día, para establecer el formato de fecha que usamos debemos manipularlos, para formatear la fecha y convertirla de YYYY-MM-DD a DD-MM-YYYY hacemos lo siguiente:

SELECT date_format(fecha, "%d-%m-%Y") as fecha_formateada from tabla;

Lo que importa aquí es el formato %d-%m-%Y (si quieres puedes usar / en lugar de -) con los modificadores. Si quieres ver la lista completa de modificadores visita este enlace, ya que así puedes crear cualquier formato de fecha.







hacemos clic en el botón Continuar, y hemos insertado una fila a la tabla, los campos se muestran en color azul, mientras que los datos están en rojo, la forma de realizar la insersion de datos en la tabla con un script de SQL es:

 INSERT INTO base_de_datos.tabla ('campo1','campo2',.....) VALUES ('dato1','dato2', ....);

usa el Botón Continuar en la parte inferior derecha.

ahora aquí ya se inserto la fila de datos (registro) consultemos lo que se ha almacenado en la tabla, hacemos clic en Examinar (color rojo):



Ahora agreguemos otra fila (Registro) de datos (son para probar algunas funciones):


Clic en el botón Continuar (revisemos de nueva cuenta la sentencia)

INSERT INTO nombre_table.base_de_datos (Nombre_campo1, Nombre_campo2, ....) VALUES (dato_campo1,dato_campo2, ....);

En Examinar:

Podemos resumir lo que es la tabla con datos de la siguiente forma:



Observemos que se añadió otro registro, pero supongamos que quiero eliminar este registro, bueno aquí tenemos un problema desde PhpMyAdmin y en general no es posible desde esta interface borrar un solo registro ya que no existe un campo de identificación en particular, si observamos con cuidado los campos son bastante genéricos si hay un nombre repetido no podrá distinguirlo de los demás que sean iguales, así que nuestra tabla esta mal diseñada, y si, los lleve a un callejón sin salida pero hay una forma de corregir esto.

En la pestaña SQL escriba la siguiente expresion:

ALTER TABLE `personas_informatica` ADD COLUMN `Identificador` int NOT NULL

use el botón continuar

con esto agregaremos un campo llamado Indentificador en la tabla personas_informatica:

 podemos ver que hay una leyenda en la parte superior :

pues la solución es indicar este campo como INDEX (Indice), en la pestaña Estructura (Esquema) al final se localiza el campo que agregamos, y le establecemos INDEX:

Pasamos a la pestaña estructura y cambiamos los valores al campo que insertamos, seleccionado el campo Identificador con las características siguientes, y Previsualizamos SQL:


Al finalizar los cambios se verán así:

con ello ya puedo borrar el registro 2 de la tabla en la pestaña SQL, simulamos la instrucción SQL:

DELETE FROM `personas_informatica` WHERE `Identificador`=2

Ahora lo ejecutamos con cerrar y continuar, como se ve se debe de llevar una secuencia definida para la creación de tablas

con ello borramos el registro, esto es muy elaborado pero es una forma de corregir el problema, en lo subsiguiente consideremos este campo identificador para evitarnos estos problemas.

Realiza el siguiente Test 7 Unidad 1

Test 7 Unidad
          1


Antes de proseguir con la creación de la base de datos, las tablas que conforman la base de datos debemos entender un concepto llamado NORMALIZACION:

La normalización (12) en las bases de datos relacionales es uno de esos temas que, por un lado es sumamente importante y por el otro suena algo esotérico. Vamos a tratar de entender las formas normales (FN) de una manera simple para que puedas aplicarlas en tus proyectos.

Entonces la  normalización es el proceso de organizar los datos de una base de datos. Se incluye la creación de tablas y el establecimiento de relaciones entre ellas según reglas diseñadas tanto para proteger los datos como para hacer que la base de datos sea más flexible al eliminar la redundancia y las Ambigüedades

Los datos redundantes desperdician el espacio de disco y crean problemas de mantenimiento. Si hay que cambiar datos que existen en más de un lugar, se deben cambiar de la misma forma exactamente en todas sus ubicaciones. Un cambio en la dirección de un cliente es mucho más fácil de implementar si los datos sólo se almacenan en la tabla Clientes y no en algún otro lugar de la base de datos.

Redundancia. Se llama así a los datos que se repiten continua e innecesariamente por las tablas de las bases de datos.

Ambigüedades. Datos que no clarifican suficientemente el registro al que representan.

Existen nueve formas diferentes de normalización,  Primera Forma Normal (1FN), Segunda Forma Normal (2FN), Tercera Forma Normal (3FN), Forma Normal Boyce-Cood, Cuarta Forma Normal, Quinta Forma Normal o Forma Normal de Proyeccion-Unión, Forma Normal de Proyeccion-Union Fuerte, Forma Normal de Proyeccion-Union Extra Fuerte, Forma Normal Clave de Dominio. Solo trataremos los 3 primeros.

Primera Forma Normal (1FN)

Esta FN nos ayuda a eliminar los valores repetidos y no atómicos dentro de una base de datos.

Formalmente, una tabla está en primera forma normal si:

Resumiendo la primer forma normal indica que las columnas no deben repetirse, y si es el caso deberan ponerse en tablas separadas.

Ejemplo:

Vea la tabla llamada clientes:


Lo que podemos apreciar es que en la tabla los campos Nombre_producto1, Costo_producto1, Imagen_producto1, se repiten con otros campos del mismo tipo, por lo que en lugar de tener limitado a 3 productos en esta tabla los pasemos a otra tabla donde los podemos relacionar no solo con 3, podrían ser mas productos que un cliente compre, usando la relación entre tablas.

Con esto en mente podemos hacer estas tablas:

ya tenemos 2 tablas, ahora tenemos que relacionar ambas tablas por medio de un elemento en comun, y es con un campo identico en ambas tablas para que pueda "localizar" el producto "A" de la tabla cliente con el producto "A" de la tabla productos.

Esta es una relación de uno a varios, es el primer ejemplo de esto aunque no terminamos con estas tablas.

La segunda Forma Normal (2FN)

Esta FN nos ayuda a diferenciar los datos en diversas entidades.

Formalmente, una tabla está en segunda forma normal si:

Lo anterior quiere decir que sí tenemos datos que pertenecen a diversas entidades, cada entidad debe tener un campo clave separado.

ELIMINAR LOS DATOS REDUNDANTES

Por ejemplo:

La desventaja es que se lleva tiempo en realizar la normalizacion.

Observando la tabla clientes el campo Nombre_cia_envios no es dependiente del cliente.

Tercera Forma Normal (3FN)
Esta FN nos ayuda a separar conceptualmente las entidades que no son dependientes.


Esta FN se traduce en que aquellos datos que no pertenecen a la entidad deben tener una independencia de las demás y debe tener un campo clave propio, quedando de la siguiente manera.


Realiza el siguiente Test 8 Unidad 1

Test 8 Unidad
          1



Definición de las relaciones

Éste es el último paso antes de crear su base de datos. Definir las relaciones entre las tablas no siempre es una tarea fácil. Primero que nada debe determinar si existe una relación. Segundo, si existe una relación, debe determinar su tipo.

La forma más fácil de determinar las relaciones es observando el diagrama creado en el paso anterior. Tome una tabla/objeto y vea si se relaciona lógicamente o interactúa con alguna(s) otra(s). Por ejemplo, en la base de datos de la librería tiene objetos cliente, libro y transacción. Yo vería el objeto cliente y me preguntaría si existe alguna relación o interacción con el objeto libro. En este ejemplo sí la hay. Un cliente debe comprar un libro de la librería para ser un cliente; por lo tanto, existe una relación.

Después me haría la misma pregunta, pero esta vez con el objeto transacción.

De nuevo, existe una relación entre ellos.

Cuando un cliente compra un libro, se crea una transacción; por lo tanto, aquí también existe una relación.

Tomaría ahora el objeto libro y vería si existe alguna relación.

Tiene una con el objeto cliente, pero no con el objeto transacción.

Un libro puede existir sin ninguna transacción. El objeto transacción interactúa con el cliente, pero no con el libro.

Todo esto puede parecer algo confuso al principio, pero con el tiempo y la experiencia será capaz de establecer las relaciones de manera rápida y fácil.

El siguiente paso en este proceso es determinar qué tipo de relaciones existen. En una base de datos relacional hay tres tipos de relaciones: uno a uno, uno a varios, varios a varios

 Uno a uno

En una relación uno a uno, un registro en la tabla uno debe tener un registro en la tabla dos, y si la tabla dos tiene un registro, debe existir un registro correspondiente en la tabla uno.


En el ejemplo, podría existir una relación uno a uno entre las tablas Tabla 1 y Tabla 2. Para cada registo debe existir una transacción. Para crear esta relación dentro de la base de datos debe añadir un campo que permita establecer esta relación. El campo que normalmente se usa para esto, se conoce como campo clave (primary key). mas adelante se veran ejemplos de campos clave. Por ahora, sólo es necesario saber que el campo clave, es un campo único dentro de la tabla. Ningún otro registro tendrá el mismo valor para este campo. El propósito de esto es distinguir un registro de los demás en esa tabla.


Por esta razón la mayoría de los diseñadores de bases de datos llaman a este campo, el campo ID. Por ejemplo, la Tabla 1 podría tener un campo lD_cliente y la Tabla 2 podría tener un campo ID_cliente (puede ser de nombre diferente pero el tipo de datos y formato deberán ser iguales, sin embargo en la mayoría de los programadores prefieren usar el mismo Nombre campo y sus propiedades en ambas tablas para ubicarlas.)

Para establecer una relación uno a uno debe designar a una de las tablas como primaria y a la otra como secundaria. Generalmente ésta es una decisión arbitraria en relaciones uno a uno. Para hacer esto más fácil, escoja la tabla que se afectará en primera instancia cuando agrege un nuevo registro a la base de datos. Esta tabla primaria contendrá un campo clave. Ambos campos serán únicos dentro de la tabla secundaria. Esto creará una relación uno a uno.

Uno a varios

Una relación uno a varios ocurre cuando un registro de la tabla 1 puede tener varios registros correspondientes en la tabla 2, y la tabla 2 tiene varios registros que corresponden a un solo registro de la tabla 1.

Una relación varios a varios

La relación varios a varios puede causar algunos problemas. Puede introducir datos redundantes, lo cual viola las reglas de normalización. La normalización se cubre con más detalle el día 5 “Normalización de sus datos”. Una relación varios a varios también es difícil de mantener. Borrar y añadir registros es peligroso. Por ejemplo, supongamos que la librería tiene muchas bodegas en todo el país. Cada bodega almacena libros para surtir. Hay varios libros que podrían estar en una bodega y muchas bodegas que podrían contener un libro en particular. ¿Qué pasa si añade una nueva bodega? Tendría que añadir nuevamente cada título de libro en su tabla de bodegas. Esto sería un poco tedioso. Para remediar esta situación debería contar con una tabla intermedia para enlazar estas tablas entre sí. Esto crearía dos relaciones de uno a varios. Esta tabla debería tener las claves primarias de ambas tablas. Cuando se coloca un libro en una bodega, se tendría que agregar un registro en esta tabla intermedia, la cual debería contener el campo clave de la tabla libros y el campo clave de la tabla bodegas. Si necesitara saber qué libros están en una bodega, podría consultar la tabla intermedia para averiguarlo. A primera vista puede parecer que se está haciendo más compleja la base de datos. Le puedo asegurar que esto bien vale la pena. Es verdaderamente difícil implementar una relación varios a varios sin la ayuda de una tabla intermedia.

Realiza el siguiente Test 9 Unidad 1

Test 9 Unidad
          1



Base de datos tienda

Ahora crearemos una base de datos que comprende varias tablas, para llevar el control de venta de libros, primero es definir el proceso de ventas y debemos entrevistar a los trabajadores que reciben a los compradores y como se realiza todos los proceso de recepción de libros, el almacenamiento, y venta / distribución:

1.- Cliente entra a comprar un libro.
2.- Llenar solicitud de membresía.
3.- Llenada ala solicitud, permitir búsqueda de libro en la base de datos.
4.- Cuando se localizá el libro llevar con un link las características.
5.- Ya localizado el libro, hacer solicitud de envió del libro a una dirección.

(hay que hacer un análisis adicional y consiste que una persona puede comprar un libro, sin necesidad de inscribirse como un cliente habitual, eso se debe de considerar en el momento de relizar la aplicacion para que solo afecte a las tablas de pedidos y no al resto de estas tablas)

A partir de esto ya podemos identificar algunos objetos que serian las tablas:

Cliente

Producto

Pedidos

Transaccion

Regresemos a DBDesigner en Internet

Comecemos por asignar un nombre a la base de datos : tienda (en este ejemplo realizaremos la tabla en la base de datos, y haremos cambios a las tablas un ultimo momento para que se pueda apreciar la forma de edición de la tablas)



y en esta ocasión agregamos una descripción, a cada tabla:


Añadir Campo, y comencemos por colocar un campo para identificación de un campo y que sea llave primaria, cuando marcamos en la selección Llave primaria, también se activara Auto Incrementable, en este caso le retiraremos la marca solo quedaria Llave Primaria


Para el ingreso de datos cliente se requiere un identificador que puede ser numérico o alfanumérico, (clave por cliente, ya que cada cliente debe tener un identificador único, ya que si fuera por nombre se repetirían y seria una verdadera confusión, y no es buena practica poner como identificador un nombre porque se repiten muchos), y sera designado como llave primaria (primary key) ya que esta sera la que relacione esta tabla con otra para leer información adicional, este campo deberá ser igual en nombre y propiedades que se encuentren en las otra(s) tablas para poder "relacionar" un campo con otra tabla, la tienda tiene algunas reglas que debemos de considerar antes de seguir

* El cliente no puede consultar su base de datos a menos que este registrado (que sea miembro)

* Un libro no puede ser comprado a menos que sea colocado en el pedido.

* El cliente debe de tener un nombre y una dirección.

* El producto debe de tener un nombre y un precio.

* La fecha de envió o puede ser anterior a la fecha de pedido.

* El sexo solo puede ser M (masculino) o F (femenino).

* El monto de lo pagado debe ser igual a la cantidad pedida o la suma de los pedidos.

* El monto pagado no puede ser un valor negativo

completemos los registros de la tabla clientes queda así:

(estos ejemplos no son correctos del todo, hay ciertos errores que iremos conociendo, y corrigiendo para que se consideren en el momento de hacer tablas en las bases de datos, conociendo las causas y sus soluciones)

Al revisar esta tabla podemos ver que se esta atomizando los campos de los datos.

Ahora pasemos a productos, cada producto tiene un precio y un nombre


crearemos un campo para identificar el pedido, id_pedido (tengan cuidado de no confundir los nombres de los campos de relación, en este caso es con i no con I, esto es para darle seguimiento a esta llave primaria - llave foranea)

Completemos la tabla pedidos:

En este caso estamos relacionado esta tabla, con la de clientes por medio del campo Id_cliente (recuerde que debera ser igual a campo designado en clientes, y este campo deberá ser Llave Foránea, que es la que relaciona ambas tablas, por esa razón al indicar este campo se muestra la tabla de referencia (clientes), y el campo de referencia (Id_cliente).

En la parte inferior de este cuadro de dialogo, estan los conceptos de Tabla de referencia y  de Campo de referencia, deberemos de verificar que esta tabla "Tenga la referencia correcta a la tabla", como se aprecia, debe de referirse a la tabla clientes y el campo Id_cliente.


como se observa se realiza la "relación entre estas tablas", ahora hay un campo id_transaccion, que mas adelante se "relacionara" con otra tabla.

Observemos que hay un campo de tipo double, en la tabla pedidos es correcto esto ?

(esto nos llevara a un problema en cuanto generemos la tabla en PhpMyAdmin.)

y en la tabla clientes hay otro campo que introducimos de forma erronea, lo identificas ?

Pasemos a crear la tabla transacciones, vea que tenemos una clave primaria, a lo cual debemos de regresar mas adelante a la tabla pedidos para modificarlo y agregar una clave foránea.

así quedaría la tabla de transacciones

ahora modifiquemos la tabla pedidos, para modificar el campo Id_transaccion para pasarlo a clave foránea.


en la parte inferior del cuadro de dialogo están de nuevo los conceptos de Tabla de Referencia y Campo de Referencia, que deben de ubicarse con la tabla transacciones, y el campo Id_transaccion, editamos el campo y le asignamos llave foránea, y clic en Actualizar, con ello se conectaran ambas tablas.



definimos la tabla pedido_productos, que tiene una clave primaria, Id_pedido_produccion



designamos la clave foránea, relacionando la tabla pedido_productos, a la tabla pedidos, con el campo id_pedido:


igual que en los casos anteriores se observa la relacion que debe de existir entre esta tabla y la de pedidos, y el campo id_pedido


quedando así:


tabla productos con clave primaria, Id_producto

quedando así la tabla

modificamos pedidos_productos, el campo Id_producto para ser clave foránea


igual que en los casos anteriores se observa la relacion que debe de existir entre esta tabla y la de productos, y el campo Id_producto


asi quedaran las tablas en la base de datos



el siguiente paso es exportar todas las tablas a un script para ejecutarlo en PhpMyAdmin, ya que escribir campo a campo y sus características seria muy tardado y podríamos equivocarnos al verlos en forma de texto , así que, en el esquemas usamos el menu Editar, Seleccionar todo:

y exportamos todas las tablas para un script de SQL..


Clic en Exportar SQL


Supongamos ahora que ya casi estamos listos para pasar nuestro script, a PhpMyAdmin, y nos piden cambios en algunos de las campos de las tablas:

1) Los campos de numéricos de double los tenemos que modificar a float, por la precisión de datos numéricos a usar, adicionalmente son campos que son para almacenar datos numéricos muy grandes que no necesitamos en este momento, ocupan mucho espacio y son requeridos, por esa razón los cambiamos a float.
2) El campo de clientes recibir_ofertas puede ser mas de un solo valor puede tener hasta 5 valores diferentes, así que el valor de bool (boleano) no es el adecuado para nuestro caso, puesto que solo recibe falso o verdadero, por lo que lo cambiamos a char(1).

por lo que se deberá verse asi:

así que debemos de modificar las tablas, en la tabla clientes, transacciones, productos y pedidos, esto lo realizamos con el icono que tiene la figura de lápiz, en el campo a modificar, los alumnos deberán de terminar de cambiar el resto de los campos, ya realizados los cambios a las tablas, se vuelve a exportar el nuevo script, esto que se realizo, es muy frecuente que se presente, esto se debe a que las personas que se entrevistan cambian de opinión, y desean cambiar o agregar algo mas que no habían considerando, o quieren mejorar, por eso es importante que los desarrolladores hagan aclaraciones antes de creación de programas o diseños, si ya se estableció de común acuerdo programador - cliente, cualquier cambio deberá de agregar costo adicional porque podría poner mas tiempo a los cambios, después de considerar esto, procedemos a crear la base de datos en PhpMyAdmin :

y descargamos el script, que formamos en https://app.dbdesigner.net/ ,y en el script se mostraran las tablas y los campos llave primaria en la parte superior del script, y la llave foranea al final del script, es importante que anotes estos pasos, ya que primero generamos las tablas y luego al final de cada tabla sus llaves primarias, y al final del script las llaves foraneas, vea que se usa el comando ALTER TABLE (13), que significa que se modificara la tabla , y el comando ADD CONSTRAINT (14) se utiliza junto con ALTER TABLE para agregar restricciones (como una clave principal o una clave externa) a una tabla existente en una base de datos SQL.

el script es el siguiente:

CREATE TABLE `clientes` (
    `Id_cliente` int(4) NOT NULL,
    `nombre` varchar(20) NOT NULL,
    `apellido_paterno` varchar(20) NOT NULL,
    `apellido_materno` varchar(20) NOT NULL,
    `direccion` varchar(30) NOT NULL,
    `num_exterior` varchar(6) NOT NULL,
    `ciudad` varchar(25) NOT NULL,
    `estado` varchar(25) NOT NULL,
    `cp` varchar(5) NOT NULL,
    `correo_electronico` varchar(35) NOT NULL,
    `edad` int(2) NOT NULL,
    `sexo` varchar(2) NOT NULL,
    `categoria_favorita` varchar(25) NOT NULL,
    `tema_favorito` varchar(25) NOT NULL,
    `ocupacion` varchar(25) NOT NULL,
    `recibir_ofertas` char(1) NOT NULL,
    PRIMARY KEY (`Id_cliente`)
);

CREATE TABLE `pedidos` (
    `id_pedido` int(4) NOT NULL,
    `fecha_pedido` DATE NOT NULL,
    `cantidad_pedido` int(4) NOT NULL,
    `Id_cliente` int(4) NOT NULL,
    `Id_transaccion` int(4) NOT NULL,
    `comentario_cliente` TEXT NOT NULL,
    `monto_pedido` FLOAT(10) NOT NULL,
    PRIMARY KEY (`id_pedido`)
);

CREATE TABLE `transacciones` (
    `Id_transaccion` int(4) NOT NULL,
    `fecha_trnasaccion` DATE NOT NULL,
    `monto_trasaccion` FLOAT(10) NOT NULL,
    `fecha_envio` DATE NOT NULL,
    PRIMARY KEY (`Id_transaccion`)
);

CREATE TABLE `pedido_productos` (
    `Id_pedido_produccion` int(4) NOT NULL,
    `Id_producto` int(4) NOT NULL,
    `id_pedido` int(4) NOT NULL,
    PRIMARY KEY (`Id_pedido_produccion`)
);

CREATE TABLE `productos` (
    `Id_producto` int(4) NOT NULL,
    `nombre_producto` varchar(40) NOT NULL,
    `descripcion_producto` varchar(40) NOT NULL,
    `precio_producto` FLOAT(10) NOT NULL,
    `fabricante_producto` varchar(40) NOT NULL,
    `imagen_producto` varchar(15) NOT NULL,
    PRIMARY KEY (`Id_producto`)
);

ALTER TABLE `pedidos` ADD CONSTRAINT `pedidos_fk0` FOREIGN KEY (`Id_cliente`) REFERENCES `clientes`(`Id_cliente`);

ALTER TABLE `pedidos` ADD CONSTRAINT `pedidos_fk1` FOREIGN KEY (`Id_transaccion`) REFERENCES `transacciones`(`Id_transaccion`);

ALTER TABLE `pedido_productos` ADD CONSTRAINT `pedido_productos_fk0` FOREIGN KEY (`Id_producto`) REFERENCES `productos`(`Id_producto`);

ALTER TABLE `pedido_productos` ADD CONSTRAINT `pedido_productos_fk1` FOREIGN KEY (`id_pedido`) REFERENCES `pedidos`(`id_pedido`);

pasamos a la etiqueta o pestaña SQL, abrimos el escript creado en los pasos anteriores, debes de localizarlo en el directorio donde lo descargaste, lo copiamos con el editor de textos que tu decidas yo lo abro con la aplicacion llamada BlueFish pero cualquier editor se puede usar.

Abajo se ve el procesador llamado BlueFish.


pegamos el script en el área de SQL para ejecutar el script y clic en el botón Continuar.



si no hay errores se debera de ver de esta manera:


cuando veamos ese recuadro verde es que se realizo de forma correcta el script y en la etiqueta Estructura, veremos que son las tablas de la base de datos:

del lado izquierdo del panel, observamos un área de color diferente, y si hacemos clic en tienda veremos las tablas que forman la base de datos.


al hacer clic en una tabla por ejemplo clientes y en las pestañas del lado derecho seleccionamos estructura, veremos todos los campos de la tabla, y si observamos del lado derecho dice Acción y y una columna Primaria (llave primaria, Primary key)  el icono se ve mas opaco indica que este campo tiene una clave primaria y del lado del nombre del campo esta el mismo icono que indica esa llave primaria:



hay algo interesante en PhpMyAdmin, podemos ver la relacion de las bases de datos en un apartado especial de PhpMyAdmin, para que se logre apreciar se debera de configurar correctamente los parámetros de PhpMyAdmin, como se vio inicialmente en la unidad de Gestión de sistemas operativos y virtualización observe el siguiente video , donde se puede apreciar la ventajas del diseñador de PhpMyAdmin.

de hecho podemos crear aquí el diseño pero por un lado es cómodo hacerlo en una aplicación diferente para no tener que estar cambiando constantemente las tablas desde PhpMyAdmin, y poderlo apreciar desde otro punto de vista dbdesigner es buena herramienta para elaborar estos scripts para SQL.

seleccione en la parte izquierda la base de datos: tienda

y del lado derecho vemos lo siguiente:


y en particular esta parte de titulo Tipo:



Revisemos que es esto, InnoDB (15) es un mecanismo de almacenamiento de datos de código abierto para la base de datos MySQL, incluido como formato de tabla estándar en todas las distribuciones de MySQL a partir de las versiones 4.0, es mas lento que su antesesor MyISAM, (Indexed Sequential Access Method) pero es muy seguro los procesos rollback son mas confiables. Su característica principal es que soporta transacciones de tipo ACID (Atomicity, Consistency, Isolation and Durability: Atomicidad, Consistencia, Aislamiento y Durabilidad) y bloqueo de registros e integridad referencial. InnoDB ofrece una fiabilidad y consistencia muy superior a MyISAM,(Método de Acceso Secuencial Indexado), muy rápido pero si hay alguna falla es muy difícil recuperar los datos de la tabla, la anterior tecnología de tablas de MySQL, si bien el mejor rendimiento de uno u otro formato dependerá de la aplicación, pero de preferencia usar InnoDB.

Al poder gestionar bases de datos relacionales, InnoDB soporta FOREIGN KEY, mientras que MyISAM es incapaz de gestionarlos.

InnoDB almacena sus tablas e índices en un espacio de tablas que puede estar formado de varios ficheros o varias particiones. Por el contrario cada tabla MyISAM almacenada en disco genera tres ficheros con el mismo nombre, que será el nombre de la tabla, pero diferentes extensiones. Un fichero .frm donde se guarda la estructura de la tabla, un fichero .myd donde se guardan los datos de la tabla y un fichero .myi donde se guardan los índices de la tabla.

MyISAM permite la indexación de campos de tipo blob y text, al igual que permite valores nulos en columnas indexadas, mientras que InnoDB no. Por tanto si en su aplicación es necesario realizar búsquedas full-text, necesitará una base de datos MyISAM.

MyISAM es más rápido que InnoDB, puesto que en las consultas InnoDB se debe de comprobar la integridad referencial de los datos, mientras que en MyISAM eso no es necesario, ya que esa propiedad no es soportada por este motor de almacenamiento.

InnoDB disponde de herramientas de recuperación ante errores o reinicios inesperados del sistema a partir de sus logs, mientras que MyISAM necesita una exploración exhaustiva para encontrar los índices de los datos de las tablas y recuperarlos en el caso de que los datos no hayan sido volcados todavía a disco.

Si deseamos crear una tabla utilizando un motor en particular, debemos seguir la siguiente estructura.(16)


CREATE TABLE tabla_innodb (id int, value int) ENGINE=INNODB;

CREATE TABLE tabla_myisam (id int, value int) ENGINE=MYISAM;


podemos hacer cambios en nuestras tablas ya que se han creado, por ejemplo el campo sexo, recordemos que una de las condiciones de la tienda es que solo deben ser Hombre o Mujer, por lo que podemos hacer cambios en este campo, de la tabla clientes, esta marcado el campo y hacemos clic en cambiar :



modificamos las propiedades del campo, Tipo lo pasamos a ENUM (Enumerar), esto consiste en una lista enumerada, significa que solo puede almacenar uno de los valores declarados en la lista, puede tener hasta 65,535 elementos de la lista, estos campos son muy útiles cuando se usan  en las paginas web.  Los datos deberán estar como 'Hombre','Mujer' que son las dos posibles opciones unicamente, y en el de Predeterminado seleccionamos Personalizado, y por default se asigna Hombre, en cuanto llegamos al campo cuando capturemos, previsualizamos SQL:

aplicamos el botón Guardar y se ejecuta el comando, y el resultado es:

Modifiquemos otro campo, categoria_favorita, pasemos a enum con las categorías : Ciencia, Ciencia Ficcion, Novela, Terror, Niños, Aventura, Cocina, Ciclismo. Previsualizamos SQL







Ahora debemos de decidir que base de datos debemos de comenzar a capturar:



para poder realizar cualquier transacción debemos tener los datos de los producto en este caso libros, la tabla es productos, luego los clientes, pedidos, transacción, pedidos_productos, debemos de observar las "relaciones" entre las tablas para decidir que tabla deber ser capturada y en que forma.

En la imagen inferior hemos comenzado a introducir datos, sin embargo vemos que el campo nombre_producto se ha marcado de un color diferente, esto se debe que la longitud del texto es mas grande que la capacidad indicada en el campo, es decir el campo es para 40 caracteres y estamos ingresando mas caracteres que los indicados por el campo, varchar(40) estamos ingresando mas de 40, lo que hacemos pues regresar a modificar la estructura de la tabla antes de proseguir.




a continuación vemos que en estructura de la tabla productos seleccione el campo nombre_producto,  y sobre el botón Cambiar:


inicialmente esta de esta manera, con 40 caracteres en el campo, pasemos el 40 a 60:



cambio el valor por 60 caracteres de longitud y agrego un comentario al campo, esto ultimo no es mas que opcional, y se realiza una Previsualizacion SQL, para conocer como es el comando de SQL para cambiar el tamaño de un campo.




Al guardar los cambios:


Cambiemos el siguiente campo que también esta restringido a 40 pasemos a 60, el alumno(a) debera de realizar este cambio, también puede sugerir algún cambio, en la tabla como agregar campos o modificar algo.



hay una observación que debo hacer hay una opción que tiene la descripción Mejorar la estructura de tabla:

esta opción nos ayudara de normalizar las tablas si tienes duda como normalizar tu tabla usa esta sección y te dará los pasos para normalizar la tabla hasta el tercer nivel de normalizacion. También sugiero usar el sección vista de impresión.

Regresamos a Insertar para ingresar datos a la tabla, y aplicamos en el botón Continuar



se ha realizado la insersion de datos de forma correcta, sin errores.




pasamos al separador Examinar:


A todo esto las bases de datos en los sistemas de LINUX se almacenan en el directorio: /var/lib/mysql

en windows lo hace asi C:\Documents and Settings\All Users\Datos de programa\MySQL\MySQL Server 5.1\data

Se sugiere que los alumnos ingresen mas libros sean reales o supuestos, analicen si hay algo que falte o se pueda agregar.

Por el momento he agregado mas datos de los Libros, y he descubierto que tengo un error es la captura de datos, en el registro numero 3 dice: SQL CON ORALE, y debe ser: SQL CON ORACLE




debemos marcar el registro, en casilla del lado izquierdo, se debe ver de esta forma:


y seleccionamos editar:



a lo que nos llevara a la siguiente sección y realizamos la corrección, y aplicamos el botón Previsualizar SQL, para observar como se realiza el código en SQL :




Veamos que se uso la instrucción UPDATE de la base de datos tienda, la tabla productos SET nombre del campo 'descripcion_producto' y lo que fue actualizado 'SQL CON ORACLE' WHERE de la tabla productos con el identificador =3, con update podemos cambiar valores en los registros, ejemplo, si tomamos varios libros de un pedido los vamos sumando el total de los libros (la suma de los precios) cambiamos el campo del total del pedido y realizamos UPDATE, con ello se actualiza el total de la compra.

Esto lo debemos de ir considerando puesto que cuando realicemos el programa que manipula las tablas ya sea desde una aplicación o desde WEB debemos escribir estas instrucciones de desde la aplicación o WEB para que se hagan los cambios necesarios en mariaDB.

Ahora sobe el botón Continuar, quedara actualizado el registro.

A continuación usaremos la tabla clientes para dar de alta a un cliente,


Luego debo de realizar una transacción porque el cliente me solicita un libro, pues bien la transacción esta relacionada con el pedido, aquí esta relacionado con el Id_cliente, y tiene el Id_transaccion, en pedidos:




Los alumnos(as) deberán de crear una base de datos que tengan al menos 2 claves primarias y claves foráneas, del tópico que sea, el tema es libre, y enviar la estructura de la base de datos / tablas, al correo indicado anteriormente.

Ejercicio de Base de datos.

Se crearan las siguientes tablas en la base de datos llamada escolar

Tabla estudiantes, se requiere para administrar 1000 alumnos, cuyo numero deberá ser incrementado de forma automatica, conteniendo los siguientes campos:

ID numérico para 5 posiciones de campo, siendo la clave primaria

Nombre texto con 20 posiciones de campo

Apellido texto con 20 posiciones de campo

Especialidad con 30 posiciones de campo

Creditos numérico (el limite es hasta el numero 500, tu decide que tipo de atributo le darás al campo)

------------------------------------------------------------------------------------------------

Tabla aulas contendrá los siguientes campos:

IDaula numérico para 5 posiciones de campo, siendo la clave primaria PK

Edificio texto con 15 posiciones de campo

Numeroaula numérico de 4 posiciones de campo

Numeroasientos numérico de 4 posiciones de campo

Descripcionaula texto con 50 posiciones de campo

----------------------------------------------------------------------------------------------------

Tabla especialidades contendrá los siguientes campos:

Especialidad texto con 30 posiciones de campo

Totalcreditos numérico de 4 posiciones de campo

Totalestudiantes numérico de 4 posiciones de campo

-------------------------------------------------------------------------------------------------------

Tabla cursos contendrá los siguientes campos:

Departamento texto con 3 posiciones de campo, propiedad único (no permitido repetir)

Ncurso texto con 3 posiciones de campo, propiedad único (no permitido repetir)

Descripcioncurso texto con 20 posiciones de campo

Cupoestudiantes numérico de 3 posiciones de campo

Nestudiantes numérico de 3 posiciones de campo

Ncreditos numérico de 1 posiciones de campo

IDaula numérico de 5 posiciones de campo (clave foranea "FK"de la tabla aulas)

----------------------------------------------------------------------------------------------------------

Tabla estudios contendrá los siguientes campos:

IDestudiante numérico de 5 posiciones de campo

Departamento texto de 3 posición de campo, clave primaria a la tabla cursos

Ncurso  texto de 3 posiciones de campo clave primaria a la tabla cursos

Grado texto de 1 posición de campo (será A, B, C, D, E) que propiedad le aplicarías para seleccionar entre una lista de valores

la clave primaria  ID de la tabla estudiantes es la clave externa para el campo IDestudiante de esta tabla (FK).

-----------------------------------------------------------------------------------------------------------

Tabla cambios contendrá los siguientes campos:

Tipo texto de 1 posición de campo

Razon texto de 8 posiciones de campo

Fecha fecha no null

Antiguedadestudiante numérico de 1 posición de campo

Antiguodepartamento texto de 3 posiciones de campo

Antiguocurso numérico de 3 posiciones de campo

Antiguogrado texto de 1 posiciones de campo

Nuevoestudiante numérico de 5 posiciones de campo

Nuevodepartamento texto de 3 posiciones de campo

Nuevocurso numérico de 3 posiciones de campo

Nuevogrado texto de 1 posición de campo

-------------------------------------------------------------------------------------------------------

Tabla errores contendrá los siguientes campos:

Codigo numerico de 3 posiciones de campo

Mensaje texto de 200 posiciones de campo

Informacion texto de 100 posiciones de campo

-------------------------------------------------------------------------------------------------------

Tabla temporal contendrá los siguientes campos:

Columnanumerica numérico de 3 posiciones de campo

Columnacaracter texto de 100 posiciones de campo

--------------------------------------------------------------------------------------------------------

Tabla debug contendrá los siguientes campos:

Nlinea numérico de 3 posiciones de campo

Texto texto de 100 posiciones de campo

---------------------------------------------------------------------------------------------------------

Crear esta base de datos en DBDesigner, ya teniedo el diseño captura la pantalla (en formato .jpg) y genera el script en MySQL, envialos como evidencia al correo ya mencionado, indicando tu nombre completo y con la descripción de: ejercicio final unidad 1

Anexo 1 Codigo de barras

Proporcionamos una breve explicación sobre como se usan los códigos de barras y sus estándares, no es una guia extensa pero nos ayudaran a implementar una secuencia de códigos de barras para artículos / servicios para simplificar nuestras capturas en las Bases de Datos, Anexo1

Continuamos en el Capitulo 2


https://app.dbdesigner.net/

(1) https://www.oracle.com/mx/database/what-is-database/
(2) https://desarrolloweb.com/articulos/1054.php
(3) https://disenowebakus.net/tipos-de-datos-mysql.php
(4) http://sql.11sql.com/sql-valores-null.htm
(5) https://thedataschools.com/sql/default/
(6) https://dev.mysql.com/doc/refman/8.0/en/binary-varbinary.html
(7) https://www.adictosaltrabajo.com/2015/09/11/introduccion-a-indices-en-mysql/
(8) https://www.mysqltutorial.org/mysql-primary-key/
(9) https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html
(10) https://www.mysqltutorial.org/mysql-unique-constraint/
(11) https://www.w3resource.com/mysql/mysql-full-text-search-functions.php#:~:text=FULLTEXT%20is%20the%20index%20type,ALTER%20TABLE%20or%20CREATE%20INDEX.
(12) https://platzi.com/clases/1566-bd/19791-formas-normales-en-db-relacionales/?gclid=EAIaIQobChMI1MnKlbCJ_AIVVAetBh2NNA9PEAAYASAAEgIoj_D_BwE&gclsrc=aw.ds

(13) https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
(14) https://www.cockroachlabs.com/blog/sql-add-constraint/
(15) https://www.ionos.mx/digitalguide/hosting/cuestiones-tecnicas/que-es-innodb/
InnoDB ha pasado de ser un subsistema de almacenamiento al motor de almacenamiento de propósito general para MySQL. Su gran fiabilidad, incluso a muy alto rendimiento, ha llevado a MySQL a hacer de InnoDB el motor de almacenamiento predeterminado en las versiones 5.6 y posteriores.
https://desarrolloweb.com/articulos/habilitando-innobd-en-mysql.html
https://www.filesuffix.com/es/extension/isam
(16) https://codigofacilito.com/articulos/motores-mysql
http://dan1456.blogspot.com/p/myisam-e-innodb_4.html

Especificadores de formato para fechas
Especificador    Descripcion
%a                    Abbreviated weekday name (Sun..Sat)
%b                    Abbreviated month name (Jan..Dec)
%c                    Month, numeric (0..12)
%D                    Day of the month with English suffix (0th, 1st, 2nd, 3rd, …)
%d                    Day of the month, numeric (00..31)
%e                    Day of the month, numeric (0..31)
%f                     Microseconds (000000..999999)
%H                    Hour (00..23)
%h                    Hour (01..12)
%I                     Hour (01..12)
%i                     Minutes, numeric (00..59)
%j                     Day of year (001..366)
%k                    Hour (0..23)
%l                     Hour (1..12)
%M                   Month name (January..December)
%m                   Month, numeric (00..12)
%p                    AM or PM
%r                    Time, 12-hour (hh:mm:ss followed by AM or PM)
%S                    Seconds (00..59)
%s                    Seconds (00..59)
%T                    Time, 24-hour (hh:mm:ss)
%U                    Week (00..53), where Sunday is the first day of the week; WEEK() mode 0
%u                    Week (00..53), where Monday is the first day of the week; WEEK() mode 1
%V                    Week (01..53), where Sunday is the first day of the week; WEEK() mode 2; used with %X
%v                    Week (01..53), where Monday is the first day of the week; WEEK() mode 3; used with %x
%W                   Weekday name (Sunday..Saturday)
%w                    Day of the week (0=Sunday..6=Saturday)
%X                    Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
%x                    Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
%Y                    Year, numeric, four digits
%y                    Year, numeric (two digits)
%%                   A literal % character
%x                    x, for any “x” not listed above