TABLA DE CONTENIDOS
NOTA: Este tutorial es una traducción propia de otro que se puede encontrar aquí. Si
deseas, puedes ir allí y leerlo en inglés. Todo el crédito va para el autor original. La
intención de escribirlo aquí en español se rige de acuerdo a nuestra conducta de compartir
el conocimiento.
SQL ya en sí mismo en su tema bastante grande, por lo que está por fuera del alcance de
éste artículo. Aquí nos enfocaremos estrictamente en el diseño de las bases de datos.
Discutiremos los fundamentos de SQL en un tutorial separado en el futuro.
El modelo relacional
Aquí te mostraremos cómo crear un modelo de bases de datos relacional, el cual es un
modelo que describe cómo organizar datos en tablas y cómo definir relaciones entre esas
tablas, esto resulta en un diagrama de base de datos o Diagrama de Entidad-Relación como
el que se puede ver en la siguiente imagen:
Ejemplo tomado de MySQL Workbench
Base de datos
Primero, el software usado para crear las tablas de los ejemplos es MySQL el cual es el
sistema de gestión de bases de datos más popular y que además es libre (asegúrate de leer
el siguiente parrafo acerca de por qué este no es un tutorial de MySQL).
Ahora veamos un breve repaso de la evolución de las bases de datos, así que conocerás de
dónde vienen tanto las bases de datos como el modelo relacional.
Un poco de historia
En los 70’s y 80’s, cuando los científicos computacionales todavía vestían chaquetas
marrones de esmoquín y gafas con marcos grandes y cuadrados, los datos se solían
almacenar en archivos planos, que son documentos de texto en los cuales los datos son
separados (normalmente) por comas o tabulaciones.
Los archivos planos todavía se usan para representación de listas simples de datos. El
formato de Valores Separados por Comas (CSV, Comma Separated Values) es muy
popular y ampliamente soportado por diferentes programas y sistemas operativos, por
ejemplo el Microsoft Excel. Los datos contenidos en un archivo plano pueden ser leídos por
un progama. Un ejemplo de cómo luce un archivo plano puede ser el siguiente:
Un programa que esté leyendo este archivo plano tendría que decírsele que los datos están
separados por comas. Si quisiera seleccionar la categoría en la que estáTutorial de diseño
de bases de datos, tendría que leer el archivo línea por línea hasta encontrar las palabras
“Tutorial de diseño de bases de datos” y luego tendría que leer la palabra después de la
coma para encontrar la categoría Software.
Las bases de datos relacionales modernas son diseñadas para permitir selecciones
avanzadas de filas, columnas y desde múltiples tablas al mismo tiempo a velocidades muy
altas.
El uso de claves
Cada fila de datos en una tabla está identificada por una única “clave” llamada laclave
primaria (PK, Primary Key). La clave primaria es a menudo un número que se incrementa
automáticamente como 1, 2, 3, 4, …,. Los datos en tablas diferentes pueden enlazarse
usando claves. Los valores de la clave primaria de una tabla pueden agregarse a las filas de
una tabla diferente, y por lo tanto enlazar a esas filas.
Usando el Lenguaje de consulta estructurada SQL, los datos de diferentes tablas que estén
enlazados por claves pueden seleccionarse de una sola vez. Por ejemplo, haces una consulta
que selecciona todas las órdenes desde una tabla de órdenes que pertenezcan al usuario
con id 3 (mike) desde la tabla de usuarios. Hablaremos más en detalle de las claves más
adelante en éste artículo.
La columna id de esta tabla es la “clave primaria”. Cada registro tiene una única llave
primaria, usualmente un número. La columna grupo es una columna de “claves foráneas”.
A juzgar por su nombre, probablemente referencia una tabla que contiene grupos de
usuarios
Limitando la entrada
Usando una base de datos relacional puedes especificar qué tipo de datos está permitido en
una columna de la base de datos. Puedes crear campos que contengan números, números
decimales, textos cortos, textos largos, fechas, entre otros.
Cuando se define la tabla en una base de datos se debe especificar un tipo para cada
columna. ‘Varchar’ es el tipo de datos en MySQL para un texto corto de máximo 255
caracteres e ‘int’ es un número entero
Aparte de los tipos de datos, los sistemas de bases de datos permiten aplicar otras
restricciones como la longitud o como hacer cumplir la unicidad de un cierto campo. La
restricción de unicidad a menuda se usa para campos que contienen nombres de usuarios y
direcciones de correo electrónico.
Esas restricciones te dan el control sobre la integridad de tus datos. Previenen situaciones
como:
Permisos
La mayoría de los sistemas de bases de datos ofrecen una estructura de permisos que
pueden ser asignados a varios usuarios. Algunas de las operaciones que se le pueden
habilitar o deshabilitar a un usuario son: SELECT, INSERT, DELETE, ALTER, CREATE,
etc. Esos permisos corresponden a las operaciones que pueden llevarse a cabo usando SQL.
La manera en la que diseñes tu base de datos tiene un efecto directo en las consultas que
necesites escribir para recuperar datos. Esta es otra razón importante por la cual es buena
idea pensar en cómo diseñas. Con una base de datos bien diseñada puedes escribir consultas
SQL limpias y fáciles.
Una consulta SQL que selecciona (SELECT) todo el contenido de la tabla USER
Portabilidad
El modelo relacional es un estándar. Al adherirnos a las reglas del modelo relacional nos
aseguramos que los datos puedan transferirse entre sistemas de bases de datos relacionales
con relativa facilidad.
Esta tabla consiste en 6 tutoriales. Todos son diferenstes, pero cada tutorial tiene los
mismos campos, llamados tutorial _id, titulo y categoria, donde tutorial_id es la clave
primaria de la tabla. La clave primaria es un valor único para cada registro de la tabla.
El número de pedido que recibes cuando haces una compra en internet puede ser
una clave primaria de alguna tabla de pedidos en la base de datos de la tienda,
porque su valor es único.
Tu número de identificación puede ser una clave primaria en alguna base de datos
gubernamental.
Un número de factura puede ser una clave primaria en una tabla en una base datos
que guarde facturas que hayan sido enviadas a clientes.
Entre otros
Claves compuestas
Normalmente la clave primaria es un único campo, pero también puede ser una
combinación de dos campos que identifiquen un registro. La combinación debe ser única en
la tabla. Hablaremos de esto más adelante.
Autonumeración
Las claves primarias normalmente, pero no siempre, son administradas por la base de datos.
Puedes decirle a la base de datos que automáticamente asigne una clave primaria única
numérica a cada registro en la tabla. A menudo la numeración empieza desde 0. Tal clave
primaria es llamada una clave autonumerada. Las claves autonumeradas son una buena
forma de asegurarse que los registros tengan una clave primaria única. Otro nombre para tal
campo de claves primarias es la clave sustituta, como la clave no es parte real de los datos
que se almacenan en la tabla (como un usuario), se llama “sustituta”.
Uno-a-muchos
Clientes y pedidos están relacionados el uno al otro con una relación uno-muchos,
porque, un cliente puede tener varios pedidos y cada pedido (muchos) pertenece
exactamente a un cliente. No te preocupes si esto es muy vago por el momento.
Hablaremos más acerca de las relaciones más adelante.
Lo que es imporante ahora es que una relación uno-a-muchos requiere el uso dedos tablas
separadas. Una para los clientes y otra para los pedidos. Practiquemos un poco creando esas
tablas.
Creemos la tabla entonces en SQLyog. La siguiente imagen es un ejemplo que cómo luce
una tabla cuando es creada usando “new table” en la ventana de SQLyog. Todos los
sistemas gráficos de administración de bases de datos tienen interfaces similares para crear
tablas. También puedes crear la tabla usando SQL en la línea de comandos, sin interfaz
gráfica:
Creando una tabla en SQLyog. Nótese que la caja de PK (Clave primaria, Primary Key)
está marcada para el campo cliente_id, por lo tanto cliente_id es la clave primaria.
También, la caja Auto Incr está marcada, por lo que la base de datos automáticamente
proveerá un valor único (incremental) para este campo
El pedido_id
La fecha en que se realizó el pedido
El cliente que realizó el pedido
Diseño de la tabla de pedidos. El campo cliente es una referencia (una ‘clave foránea’) a
cliente_id en la tabla de clientes
Esas dos tablas están enlazadas, porque el campo cliente en la tabla de pedidos es una
referencia a la clave primaria (cliente_id) de la tabla de clientes. Tal referencia es llamada
una relación de clave foránea. Deberías ver la clave foránea como la copia de la llave
primaria de otra tabla. En este caso, el cliente_id desde la tabla declientes se copia en la
tabla de pedidos de tal forma que cada pedido queda enlazado a un cliente.
En la imagen anterior se puede ver que la columna cliente de la tabla de pedidos queda
enlazada a la llave primaria cliente_id de la tabla de clientes.
Ahora, cuando veamos los datos que pudieran estar presentes en las tablas de pedidos y
clientes, verás cómo están enlazados los clientes y los pedidos:
Los pedidos están enlazados con los clientes por medio del campo cliente que referencia a
la tabla de clientes
Por los datos arriba presentados, podemos ver que el cliente llamado Joe hizo dos pedidos,
el cliente Satya hizo uno y el cliente Terry también hizo uno.
Tal vez te estés preguntando qué pidieron exactamente. Esa es una buena pregunta. Tal vez
estuvieras esperando los productos pedidos en la tabla de pedidos. Pero eso sería un mal
diseño. ¿Cómo pondrías múltiples productos en un solo registro de pedido?
Los productos son entidades separadas que deben almacenarse/guardarse en una tabla
separada. La relación entre pedidos y productos es una relación demuchos-a-muchos. Lo
veremos más adelante.
Crear el diagrama de Entidad-Relación
(ERD)
Acamos de aprender cómo los registros de diferentes tablas se relacionan los unos a los
otros en una base de datos relacional. Antes de empezar a crear y relacionar tablas es
importante pensar acerca de las entidades que existen en el sistema y sus relaciones. En el
diseño de una base de datos, las entidades y sus relaciones son representadas en
un diagrama de entidad-relación (ERD, Entity-Relationship Diagram) que es el resultado
del proceso de diseñar la base de datos.
Entidades
Te estarás preguntando qué es una entidad. Bueno, es una “cosa”. En un sistema. Allí.
Aquí. Mi mamá siempre quiso que fuera profesor, porque explico muy bien.
En el contexto del diseño de una base de datos una entidad es cualquier cosa que tal
vez merece su propia tabla en el modelo. Cuando diseñas una base de datos debes
identificar las entidades en el sistema que estés creando. Esto ya es más algo de hablarcon
tu cliente o contigo mismo y resolver con qué datos de tus sistema vas a trabajar.
Tomemos una tienda web por poner un ejemplo. Una tienda web vende productos. Un
producto puede ser una muy obvia entidad en un sistema de la tienda. Los productos
son pedidos por clientes. Dos entidades más que obvias que además ya habíamos visto:
pedidos y clientes.
Un pedido es pagado por un clinete… qué interesante. ¿Tendremos una tabla depagos en la
base de datos de nuestra tienda? Posiblemente. ¿Pero acaso no es el pago una “única pieza
de información” que pertenece a un pedido? Eso también es posible.
Si no está seguro sólo piensa acerca de qué información quieras almacenar del pago. Tal
vez quieras guardar el método de pago y la fecha del pago. Esas son todavía piezas de
información que pertenecen a un pedido. Puedes interpretrar esto como el método de pago
de un pedido y la fecha de pago de un pedido, así que no vemos la necesidad de modelar
el pago en una tabla separada, aunque, conceptualmente, puedas ver al pago como una
“entidad”, porque puedes tratarlo como un contenedor separado de informarción (fecha de
pago, método de pago).
Y casi lo logras, está muy cerca de tener tu diploma en diseño de base de datos
Como puedes ver, decidir qué entidades tiene tu sistema es un poco de un proceso
intelectual que requiere cierta experiencia y que es a menudo una materia que requiere
cambiar y repensar y reconsiderar.
Relación de uno-a-muchos
Ya vimos como los datos de diferentes tablas pueden enlazarse definiendo una relación de
clave foránea. También vimos cómo los pedidos se enlazaban a los clientes al incluir
el cliente_id como una clave foránea en la tabla de pedidos.
Otro ejemplo de una relación uno-a-muchos es la relación que existe entre madres e hijos.
Una madre puede tener varios hijos pero cada hijo tiene solo una madre. (Técnicamente
sería mejor hablar de una mujer y de sus hijos, porque en una relación de uno-a-muchos
una madre puede tener 0, 1 o varios hijos y una madre con 0 hijos no es técnicamente una
madre)
Ejemplos
Algunos ejemplos de una relación uno-a-muchos:
Un carro y sus partes. Cada parte pertenece a un carro y carro tiene múltiples partes
Un cine y sus salas. Un cine normalmente tiene varias salas y cada sala pertenece a
un único cine
Un ERD y sus tablas. Un diagrama entidad-relación tienen una o más tablas y cada
una de esas tablas pertenece a un único diagrama
Las casas en una calle. Una calle tienen múltiples casas y una casa pertenece a una
única calle
Relación muchos-a-muchos
La relación muchos-a-muchos es donde múltiples files de la tabla A pueden corresponder a
múltiples filas de la tabla B. Un ejemplo de esta relación es una escuela donde los
profesores enseñan a estudiantes. En la mayoría de escuelas cada profesor tiene múltiples
estudiantes y cada estudiante tiene múltiples profesores.
La relación entre distribuidores de cerveza y las cervezas que distribuyen es una relación
muchos-a-muchos también. Nótese que en el diseño de bases de datos te debes preguntar no
qué relación existe en el momento sino qué relación puede existiren el futuro. Si en el
presente todos los distribuidores distribuyen múltiples tipos de cerveza, pero cada cervez es
distribuída por sólo un distribuidor, estás al frente de una relación uno-a-muchos. (Un
distribuidor tiene múltiples cervezas, pero cada cerveza tiene sólo un distribuidor). No te
tientes a modelar esta situación en una relación uno-a-muchos. Hay una buena probabilidad
de que en el futuro dos o más distribuidores también distribuyan el mismo tipo de cerveza y
cuando eso pase tu base de datos no estará preparada .
Nótese que en las tablas de arriba los campos de la clave primaria están en azul y en
negrita. En los modelos de bases de datos, las claves primarias usualmente se subrayan.
Nótese también (otra vez) que la tabla de asociación cerveza_distribuidortiene una clave
primaria compuesta por dos claves foráneas. Las tablas de unión tienen siempre una clave
primaria compuesta.
Hay otra cosa imporante por notar acerca de la relación muchos-a-muchos: consiste de dos
relaciones uno-a-muchos. Tanto la tabla cervezas como la tabla dedistribuidores tienen
una relación uno-a-muchos con la tabla de unión.
En este ejemplo vemos que hay una relación muchos-a-muchos entre huéspuedes y
habitaciones. Una habitación puede ser reservada por varios huéspuedes al pasar el tiempo
y al pasar el tiempo un huésped puede reservar varias habitaciones en el hotel. La tabla de
unión en este ejemplo no es una tabla de unión clásica que consiste de sólo dos claves
foráneas, sino que es una entidad separada que tiene relación con otras dos entidades.
Encontrarás situaciones en las que la tabla de unión de dos entidades sea una nueva
entidad.
Relación uno-a-uno
En una relación uno-a-uno cada elemento de la entidad A puede asociarse con 0 o con 1
elemento de la entidad B. Un empleado, por ejemplo, usualmente está asociado a una
oficina. O una marca de cerveza tiene un país de origen.
En la misma tabla
La relación uno-a-uno es fácilmente modelada: en una tabla. Las filas de la tabla contienen
datos que están relacionados en una relación uno-a-uno a la clave primaria o a la fila. Los
datos de cada cliente, por ejemplo, están enlazados en una relación uno-a-uno a su clave
primaria, el cliente_id.
En tablas separadas
En casos raros, una relación uno-a-uno se modela usando dos tablas separadas. Tal
configuración a veces se usa para sobrepasar limitaciones del sistema de la base de datos o
para ganar rendimiento. O en casos raros tal vez decidas que quieras tener dos entidades en
diferentes tablas, manteniendólas relacionadas en una relación uno-a-uno. Normalmente
tener dos tabalas separadas en una relación uno-a-uno es considerada una mala práctica.
Las personas y sus pasaportes. Sin embargo, esto solo cuenta si miramos a sus
pasaportes actuales. Cada persona tienen un único, actual pasaporte y cada
pasaporte pertenece a una única persona.
Un diseño de base de datos relacional es una colección de tablas que están interrelacionadas
por claves primarias y claves foráneas. El modelo relacional comprende un número de
reglas que te ayudan a descubrir la relaciones correctas entre los datos. Esas reglas son
llamadas las formas normales. Ahora veamos como normalizar una base de datos.
Las forma normales son guías para un buen diseño de base de datos. No estás obligado a
adherirte a todas las cinco formas normales cuando estés diseñando una base de datos. Sin
embargo, se te sugiere normalizar la base de datos sobre la que vayas a trabajar, porque la
normalización tiene ventajas significativas en términos de eficiencia y de mantenibilidad de
tu base de datos.
Estas son algunas de las tareas más generales que están asociadas a la normalización de una
base de datos:
Muy pocas bases de datos se adhieren a todas las cinco formas normales presentadas en el
modelo relacional. Usualmente las bases de datos se normalizan hasta la segunda o tercerca
forma normal. La cuarta y la quinta forma se usan raramente. Por lo tanto discutiremos
solamente la primera, segunda y tercerca forma normal.
Clave primaria
Regla: cada tabla tiene una clave primaria, consustente de la más pequeña cantidad de
campos posibles.
Como ya sabes, una clave primaria puede cosnsitir de múltiples campos. Puedes por
ejemplo escoger la combinación de fecha de cumpleaños, nombres y apellidos como la
clave primaria (y esperar que esta combinación sea siempre única). Podría ser una mucho
mejor opción escoger el número de identificación de alguien como la clave primaria,
porque éste es el único campo que identifica ínequivocamente a una persona.
Mejor aún, cuando no hay un obvio candidato a la clave primaria, asigna una calve sustituta
a tu tabla al crear un campo de id autoincremental.
Atomicidad
Regla: los campos no se duplican en una fila y cada campo contiene un único valor.
Tomemos por ejemplo un sitio web de coleccionistas de carros en los que cada collecionista
de carro que se registra en el sitio lo hace con sus carros. La tabla siguiente muestra los
registros de carros de los usurarios que se registraron en el sitio web:
La duplicación horizontal de los campos es un mal diseño. Con este diseño sólo puedes
almacenar hasta cinco carros y si tienes menos de cinco carros estás desperdiciando espacio
en la base de datos con columnas vacías.
La solución correcta aquí es dividir los carros en una tabla separada e incluir una clave
foránea que referencie a la tabla de usuarios.
Redundancia de datos:
Regla: Los campos que no sean parte de la clave primaria deben depender de la clave
primaria.
Eso puede sonar un poco académico. Lo que significa que es sólo debes almacenar datos en
una tabla que estén directamente relacionados y que no pertenezcan a otra entidad.
Adherirse a la segunda forma normal es cuestión de encontrar datos que frecuentemente
estén duplicados a través de filas y que puedan pertenecer a una entidad diferente.
La tabla de arriba podría pertenecer a una compañía que vende carros y tiene múltiples
tiendas en Holanda. Si miras detalladamente la tabla, puedes encontrar múltiples ejemplos
de duplicación a través de filas. El campo marca puede dividirse en una tabla separada.
También, el campo tipo puede dividirse un otra tabla que tenga relaciones uno-a-muchos
con la tabla marca, porque una marca tiene múltiples tipos.
Abajo vemos un ejemplo de cómo se podría modelar mejor la situación de los carros
evitando redundancia de datos en la tabla de carros:
En la configuración anterior, la tabla carro tiene una clave foránea referenciada a las
tablas tipo y tienda. Ya no está la columna marca, porque está ímplicitamente referenciada
a través de la referencia tipo. Cuando se referencia un tipo, también se referencia la marca,
porque un tipo pertenece a una marca.
Se ha removido un montón de redundancia de datos del modelo. Si eres estricto puede que
aún no estés satisfecho con esta solución. ¿Qué hay del campopais_de_origen en la
tabla marca? No hay duplicación aún, porque sólo hay cuatro marcas de diferentes países.
Un diseñador de bases de datos estricto podría dividir los nombres de los países en una
tabla separada de países.
E incluso puede que aún no estés satisfecho, porque podrías dividir el campo coloren otra
nueva tabla.
Qué tan estrictamente diseñes las tablas depende de tí mismo y de la situación. Si vas a
tener grandes cantidades de carros en tu sistema y quieres poder ser capaz de buscar carros
por color, podría ser de sabios separar los colores en un otra tabla, así no se tendrían
duplicados.
Hay otra situación donde tal vez quieras separar los colores en otra tabla. Si quieres
permitir que empleados de la compañía ingresen nuevos carros y quieres que
puedanescoger un color de carro desde una lista predefinida. En ese caso deberías
almacenar todos los colores posibles en tu base de datos, incluso si no hay carros con cierto
color aún, quieres que esté presente en la base de datos, para que el empleado pueda
seleccionarlo.
Dependencias transitivas
Regla: no deben haber dependencias transitivas entre campos en una tabla.
La tabla de clientes siguiente (mis clientes son jugadores de fútbol franceses y holandeses)
contiene relaciones transitivas:
En esta tabla no todos los campos dependen única y exclusivamente de la clave primaria.
Existe una relación separada entre codigo_postal y la ciudad y la provincia. En Holanda, la
ciudad y la provincia están determinadas por el código postal, así que no hay necesidad de
almacenar la ciudad y la provincia en la tabla de clientes. Si conoces el código postal,
conoces la ciudad y la provincia.
Tales relaciones transitivas deben ser evitadas si quieres modelar tu base de datos en la
tercera forma normal.
En este caso, eliminar las relaciones transitivas de la tabla puede lograrse por remover los
campos de ciudad y de provincia de la tabla y guardarlos en una tabla separada, que
contenga el código postal (clave primaria), el nombre de la provincia y la ciudad. Averigüar
las combinaciones de código postal - ciudad - provincia para un país entero es un trabajo
difícil. Por eso es que tales tablas se venden comercialmente.
Otro ejemplo de aplicación de la tercera forma normal es esta (muy) sencilla tabla de
pedidos de una tienda online:
La tercera forma normal básicamente dice que no debes almacenar datos en campos que
puedan derivarse de otros campos (que no sean claves) en una tabla. Especialmente en el
ejemplo de la tabla de clientes, aplicar la tercera forma normal requiere un montón de
trabajo o adquirir una tabla comercial de códigos postales - provincias - ciudades.
La tercera forma normal no siempre se adhiere al diseño de bases de datos. Cuando se esté
diseñando una base de datos debes siempre comparar las ventajas de una forma normal más
alta al trabajo que tome aplicar y mantener esa forma normal. En el caso de la tabla de
clientes, personalmente escogería no normalizarla a la tercera forma normal. En último
caso, lo haría. Almacenar datos derivados, como el resultado de un cálculo que está
basado en datos existentes es usualmente una mala idea.
Muestra productos
Categoriza productos
Registra clientes
Guarda productos en un carrito de compras
Muestra el contenido del carrito
Envía órdenes al dueño de la tienda web
etc.
Una vez hayas identificado las entidades que quieras modelar puedes analizar las relaciones
existentes entre entidades:
Entre pedido y producto hay una relación muchos-a-muchos. Cada pedido contiene
1 o más productos y cada producto puede ser asociado con 0, 1 o más pedidos. Una
relación muchos-a-muchos se modela con tres tablas. Dos tablas fuentes (Pedido y
Producto) y una tabla de unión (PedidoProducto), como se muestra en el modelo
más adelante. Nótese como los pedidos y los productos tienen una relación uno-a-
muchos con la tabla de unión. Juntos forman la relación muchos-a-muchos entre
pedidos y productos
Clientes y pedidos están enlazados en una relación uno-a-muchos. Cada registro en
la tabla cliente puede asociarse con múltiples registros en la tabla de pedidos y lo
mismo a la inversa, cada registro en pedidos es asociado con un registro encliente.
Las tablas mostradas en el modelo anterior sirven como ejemplo sencillo. Una tabla de
clientes en la vida real por supuesto debe tener más datos del cliente (dirección, ciudad,
etc.)
Tabla de pedidos
Cada fila en la tabla de pedido está enlazada a una única fila en la tabla de cliente con el
campo de clave foránea cliente_id. La tabla de pedidos contiene únicamente datos que no
son claves que son dependientes del pedido_id (clave primaria), tal como la fecha y la hora.
Cantidad de pedidos
El modelo actual está algo limitado. Permite que un usuario sólo agregue unproducto de
cada tipo por cada pedido. ¿Por qué? Porque la tabla PedidoProducto tiene una clave
primaria compuesta que consiste del pedido_id y del producto_id. Como una clave primaria
siempre debe ser única, sólo un registro de cada cierta combinación pedido_id -
producto_id puede existir en la tabla.
¿Entones cómo permitimos que un usuario almacenar una cantidad de más de 1 del mismo
producto en el mismo pedido? Hay dos soluciones:
Tipo de pago
Un campo que se podría agregar a la tabla de pedidos es tipo_pago. Éste es único para cada
pedido y no puede derivarse de otros datos. (Nótese que tipo_pago se convertiría en un
campo de clave foránea en la tabla de pedidos referenciando a una tabla separada que
contenga los tipos de pagos).
Tabla de productos
En la tabla de productos se almacena el precio sin incluir el IVA. El precio incluyendo el
IVA puede ser calculado del precio sin incluir el IVA por un programa o por una consulta
SQL. Es por esto que no se guarda el precio del producto incluyendo el IVA. Debes ser
consciente que guardar el precio de un producto de esta forma puede tener implicaciones en
el futuro. En este modelo el precio del producto es almacenado en un único campo. Una vez
cambie el precio del producto, el viejo precio se ha ido. Si quisieras poder tener un reporte
histórico de ventas de tu base de datos deberías almacenar un historial de precios para cada
producto por separado. Si un producto cambia de precio dos veces al año, necesitarás un
historial de precios si quieres poder calcular la cantidad total de dinero que hiciste de un
producto en ese año.
Conclusiones
Una base de datos relacional en una pieza de equipamiento maravillosa para almacenar
grandes cantidades de datos eficientemente. En este tutorial nos enfocamos principalmente
en construir el modelo de la base de datos. Esos modelos pueden implementarse en
cualquier RDBMS y ser consultados usando el Lenguaje de Consulta Estructura.
¿Dónde ir ahora?
Si quieres diseñar tu propia base de datos, asegúrate de probar a MySQL Workbench. Es
una gran herramienta para crear diagramas entidad-relación. La podremos usar mucho en
nuestro trabajo de desarrolladores, incluso si no estamos usando MySQL.
Otro paso lógico para tomar desde aquí es aprender más acerca de SQL. Las herramientas
de modelado como MySQL Workbench y las herramientas de administración como
SQLyog son grandiosas, pero si en realidad quieres aprender cómo usar una base de datos,
SQL es una habilidad imprescindible. La W3Schools tienen un excelente tutorial para
principiantes y hay incluso muchos otros tutoriales por los cual empezar. Por ahora
llegamos hasta aquí. En un futuro estaremos incluyendo nuestro propio tutorial curado en
este blog.
Happy coding!