Professional Documents
Culture Documents
Clientes
ID_ Cliente
Nombre
Apellidos
Nombre_Producto1
Costo_Producto1
Imagen_Producto1
Nombre_Producto2
Costo_Producto2
Imagen_Producto2
Fecha_Pedido
Cantidad_Pedido
Nombre_Cia_Envios
La tabla se ha descrito de manera abreviada pero aun así representa la idea general.
¿Cómo podría añadir un nuevo cliente en su tabla Clientes? Debería añadir un producto y un
pedido también. ¿Qué tal si quisiera emitir un informe de todos los productos que vende? No
podría separar fácilmente los productos de los clientes con una simple instrucción SQL. Lo
bello de las bases de datos relacionales, si están bien diseñadas, es que puede hacer esto
fácilmente.
La nomlalización también hace las cosas fáciles de entender. Los seres humanos tenemos la
tendencia de simplificar las cosas al máximo. Lo hacemos con casi todo desde los animales
hasta con los automóviles. Vemos una imagen de gran tamaño y la hacemos menos
compleja agrupando cosas similares juntas. Las guías que la nomlalización provee crean el
marco de referencia para simplificar la estructura. En su base de datos de muestra es fácil
detectar que usted tiene tres diferentes grupos: clientes, productos y pedidos. Si sigue las
guías de la nomlalización, podría crear las tablas basándose en estos grupos.
El proceso de nomlalización tiene un nombre y una serie de reglas para cada fase. Esto
puede parecer un poco confuso al principio, pero poco a poco irá entendiendo el proceso, así
como las razones para hacerlo de esta manera. A la mayoría de la gente le encantan las
hojas de cálculo por la forma en la que manejan sus datos. El tiempo que le lleve
reconfigurar su esquema para ajustarlo al proceso de nomlalización, siempre será bien
Iinvertido. Al fin y al cabo, esto le tomará menos tiempo que el que tendría que invertir , para
cortar y pegar sus columnas de datos para generar el infomle que quiere su jefe.
Grados de normalización
Existen básicamente tres niveles de normalización: Primera Fomla Normal (1NF), Segunda
Fomla Normal (2NF) y Tercera Fomla Normal (3NF). Cada una de estas formas tiene sus
propias reglas. Cuando una base de datos se conforma a un nivel, se considera nomlalizada
a esa forma de nomlalización. Por ejemplo, supongamos que su
base de datos cumple con todas las reglas del segundo nivel de nomlalización. Se considera
que está en la Segunda Fomla Normal. No siempre es una buena idea tener una base de
datos conformada en el nivel más alto de normalización. Puede llevar aun nivel de
complejidad que pudiera ser evitado si estuviera en un nivel más bajo de normalización.
La regla de la Primera Forma Normal establece que las columnas repetidas deben
eliminarse y colocarse en tablas separadas. Ésta es una regla muy fácil de seguir. Observe
el esquema de la tabla Clientes de la base de datos.
Clientes
ID Cliente
Nombre
Apellidos
Nombre_Producto1
Costo_Producto1
Imagen_Producto1
Nombre_Producto2
Costo_Producto2
Imagen_Producto2
Fecha_Pedido
Cantidad_Pedido
Nombre Cia Envios
--
La tabla tiene varias columnas repetidas. Éstas se refieren principalmente a los productos.
De acuerdo con la regla, debe eliminar las columnas repetidas y crearles su propia tabla.
Clientes Pedidos
ID_Clientes Nombre_Productos
Nombre Costo_Producto
Apellidos Imagen_Producto
Direccion
Numero_Pedido
Fecha_Pedido
Cantidad_Pedido
Clave_Cia_Envios
Nombre_Ci_ Envios
--
Ahora tiene dos tablas. Pero todavía hay un problema. No hay forma de relacionar los datos
de la tabla original con los de la nueva tabla. Para hacerlo, debe añadir un campo clave a la
segunda tabla de forma que se establezca la relación. Añada a la tabla Productos una clave
primaria que se llame ID_Producto y añada una clave a la tabla Clientes que la relacione con
la tabla Productos. El campo ID_Producto es el candidato ideal.
Clientes Pedidos
ID_Productos ID_Productos
ID_Clientes Nombre_Productos
Nombre Costo_Producto
Apellidos Imagen_Producto
Direccion
Numero_Pedido
Fecha_Pedido
Cantidad_Pedido
Clave_Cia_Envios
--
Así, se ha establecido una relación uno a varios. Ésta representa lo que la base de datos
estará haciendo en la vida real. El cliente tendrá muchos productos que podrá comprar,
sin importar cuántos otros clientes quieran comprarlos también. Además, el cliente
necesitará haber pedido un producto para ser un cliente. Usted ya no está obligado a añadir
La regla de la Segunda Forma Normal establece que todas las dependencias parciales se
deben eliminar y separar dentro de sus propias tablas. Una depen dencia parcial es un
término que describe a aquellos datos que no dependen de la clave de la tabla para
identificarlos. En la base de datos de muestra, la información de pedidos está en cada uno
de los registros. Sería mucho más simple utilizar únicamente el número del pedido. El resto
de la información podría residir en su propia tabla. Una vez que haya organizado la
información de pedidos.
Apellidos Imagen_Producto
Direccion
Numero_Pedido
Nombre_Cia_Envios
De nuevo, al organizar el esquema de esta forma puede reflejar el mundo real en su base de
datos. Tendría que hacer algunos cambios en sus reglas del negocio para que esto fuera
aplicable, pero para ilustrar la normalización, así está bien.
Al haber alcanzado la Segunda Forma Normal, usted puede disfrutar de algunas de las
ventajas de las bases de datos relacionales. Por ejemplo, puede añadir nuevas columnas a
la tabla Clientes sin afectar a las tablas Productos y Pedidos. Lo mismo aplica para las otras
tablas. Alcanzar este nivel de normalización permite que los datos se acomoden de una
manera natural dentro de los límites esperados.
Una vez que ha alcanzado el nivel de la Segunda Forma Normal, se han controlado la
mayoría de los problemas de lógica. Puede insertar un registro sin un exceso de datos en la
mayoría de las tablas. Observando un poco más de cerca la tabla Clientes, vemos la
columna Nombre_Cia_Envios. Ésta no es dependiente del cliente. El siguiente nivel de
normalización explicará cómo solucionar esto.
La regla de la Tercera Forma Normal señala que hay que eliminar y separar cualquier dato
que no sea clave. El valor de esta columna debe depender de la clave. Todos los valores
deben identificarse únicamente por la clave. En la base de datos de muestra, la tabla
Clientes contiene la columna Nombre_Cia_Envios, la cual no se identifica únicamente por la
clave. Podría separar estos datos de la tabla y ponerlos en una tabla aparte.
Eliminación de los datos que no son claves para la Tercera Forma Normal
Nombre
Apellidos
Direccion
Ahora todas sus tablas están en la Tercera Forma Normal. Esto le da más flexibilidad y
previene errores de lógica cuando inserta o borra registros. Cada columna en la tabla está
identificada de manera única por la clave, y no hay datos repetidos. Esto provee un esquema
limpio y elegante, que es fácil de trabajar y expandir.
A veces puede ocurrir que normalizar sus datos hasta el nivel más alto no tenga sentido. Por
ejemplo, suponga que añade una columna extra para la dirección en su base de datos. Es
muy normal tener dos líneas para la dirección. El esquema de la tabla podría verse como se
muestra a continuación:
ID_Cliente
Nombre
Apellidos
Direccion1
Direccion2
De acuerdo con las reglas, si aplica la Primera Forma Normal, la columna de dirección
debería sacarse de esta tabla y reemplazarse con la clave de una nueva tabla. El resultado
de este esquema se muestra a continuación:
ID_Ciente ID_Direccion
Nombre ID_Cliente
Apellidos Direccion
La base de datos ahora cumple con la Primera Forma Normal. Los clientes pueden tener
más de una dirección. El problema aquí es que usted ha complicado demasiado una idea
simple, por tratar de seguir las reglas de normalización. En el ejemplo mostrado, la segunda
dirección es totalmente opcional. Está ahí sólo para colectar información que pudiera
utilizarse como información de contacto. No hay necesidad de partir la tabla en dos y forzar
las reglas de la normalización. En esta instancia, el exceso de normalización frustra el
propósito para el que se utilizan los datos. Añade, de manera innecesaria, un nivel más de
complejidad. Una buena forma de determinar si está llevando demasiado lejos su
normalización, es ver el número de tablas que tiene. Un número grande de tablas pudiera
indicar que está normalizando demasiado. Observe su esquema.
¿Está dividiendo tablas sólo para seguir las reglas o estas divisiones son en verdad
prácticas? Éstas son el tipo de cosas que usted, el diseñador de la base de datos, necesita
decidir. La experiencia y el sentido común lo pueden auxiliar para tomar la decisión correcta.
La normalización no es una ciencia exacta. Es subjetiva.
Existen seis niveles más de normalización que no se han discutido aquí. Ellos son Forma
Normal Boyce-Codd, Cuarta Forma Normal (4NF), Quinta Forma Normal (5NF) o
En resumen
La normalización es una técnica que se utiliza para crear relaciones lógicas apropiadas entre
tablas de una base de datos.
Existen varios niveles de normalización: Primera Forma Normal, Segunda Forma Normal,
Tercera Forma Normal, Forma Normal Boyce-Codd, Cuarta Forma Normal, Quinta Forma
Normal o Forma Normal de Proyección-Unión, Forma Normal de Proyección-Unión Fuerte,
Forma Normal de Proyección-Unión Extra Fuerte y Forma
Normal de Clave de Dominio. Cada nuevo nivel o forma lo acerca más a hacer su base de
datos verdaderamente relacional.
Se discutieron las primeras tres formas. Éstas proveen suficiente nivel de normalización para
cumplir con las necesidades de la mayoría de las bases de datos.
Normalizar demasiado puede conducir a tener una base de datos ineficiente y hacer a su
esquema demasiado complejo para trabajar. Un balance apropiado de sentido común y
Xxxxxxxxxxxxxxxxxxxxxxxxxx
http://foros.softonic.com/a/ayuda-base-datos-normalizacion-83942
vvvvvvvvvvvvvvv
Digamos que queremos crear una tabla con la información de usuarios, y los datos a guardar
son el nombre, la empresa, la dirección de la empresa y algun e-mail, o bien URL si las
tienen. En principio comenzarias definiendo la estructura de una tabla como esta:
Formalización CERO
usuarios
Diríamos que la anterior tabla esta en nivel de Formalizacion Cero porque ninguna de
nuestras reglas de normalización ha sido aplicada. Observa los campos url1 y url2 -- ¿Qué
haremos cuando en nuestra aplicación necesitemos una tercera url ? ¿ Quieres tener que
añadir otro campo/columna a tu tabla y tener que reprogramar toda la entrada de datos de tu
código PHP ? Obviamente no, tu quieres crear un sistema funcional que pueda crecer y
adaptarse fácilmente a los nuevos requisitos. Hechemos un vistazo a las reglas del Primer
Nivel de Formalización-Normalización, y las aplicaremos a nuestra tabla.
¿ Ves que estamos rompiendo la primera regla cuando repetimos los campos url1 y
url2 ? ¿ Y que pasa con la tercera regla, la clave primaria ? La regla tres
básicamente significa que tenemos que poner una campo tipo contador
autoincrementable para cada registro. De otra forma, ¿ Qué pasaria si tuvieramos
dos usuarios llamados Joe y queremos diferenciarlos. Una vez que aplicaramos el
primer nivel de F/N nos encontrariamos con la siguiente tabla:
usuarios
Ahora diremos que nuestra tabla está en el primer nivel de F/N. Hemos solucionado
el problema de la limitación del campo url. Pero sin embargo vemos otros
problemas....Cada vez que introducimos un nuevo registro en la tabla usuarios,
tenemos que duplicar el nombre de la empresa y del usuario. No sólo nuestra BD
crecerá muchísimo, sino que será muy facil que la BD se corrompa si escribimos
mal alguno de los datos redundantes. Aplicaremos pues el segundo nivel de F/N:
Segundo nivel de F/N
4. Crear tablas separadas para aquellos grupos de datos que se aplican a varios
registros.
5. Relacionar estas tablas mediante una clave externa.
Hemos separado el campo url en otra tabla, de forma que podemos añadir más en el
futuro sin tener que duplicar los demás datos. También vamos a usar nuestra clave
primaria para relacionar estos campos:
usuarios
urls
1 1 abc.com
2 1 xyz.com
3 2 abc.com
4 2 xyz.com
usuarios
1 Joe 1
2 Jill 2
empresas
urls
1 1 abc.com
2 1 xyz.com
3 2 abc.com
4 2 xyz.com
Ahora tenemos la clave primaria emprId en la tabla empresas relacionada con la
clave externa recEmpresaId en la tabla usuarios, y podemos añadir 200 usuarios
mientras que sólo tenemos que insertar el nombre 'ABC' una vez. Nuestras tablas de
usuarios y urls pueden crecer todo lo que quieran sin duplicación ni corrupción de
datos. La mayoria de los desarrolladores dicen que el tercer nivel de F/N es
suficiente, que nuestro esquema de datos puede manejar facilmente los datos
obtenidos de una cualquier empresa en su totalidad, y en la mayoria de los casos
esto será cierto.
Pero hechemos un vistazo a nuestro campo urls - ¿ Ves duplicación de datos ? Esto
es perfectamente aceptable si la entrada de datos de este campo es solicitada al
usuario en nuestra apliación para que teclee libremente su url, y por lo tanto es sólo
una coincidencia que Joe y Jill teclearon la misma url. ¿ Pero que pasa si en lugar
de entrada libre de texto usáramos un menú desplegable con 20 o incluso más urls
predefinidas ? Entonces tendríamos que llevar nuestro diseño de BD al siguiente
nivel de F/N, el cuarto, muchos desarrolladores lo pasan por alto porque depende
mucho de un tipo muy específico de relación, la relación 'varios-con-varios', la cual
aún no hemos encontrado en nuestra aplicación.
Antes de definir el cuarto nivel de F/N, veremos tres tipos de relaciones entre los
datos: uno-a-uno, uno-con-varios y varios-con-varios. Mira la tabla usuarios en el
Primer Nivel de F/N del ejemplo de arriba. Por un momento imaginámos que
ponemos el campo url en una tabla separada, y cada vez que introducimos un
registro en la tabla usuarios tambien introducimos una sola fila en la tabla urls.
Entonces tendríamos una relacion uno-a-uno: cada fila en la tabla usuarios tendría
exactamente una fila correspondiente en la tabla urls. Para los propósitos de
nuestra aplicación no sería útil la normalización.
Ahora mira las tablas en el ejemplo del Segundo Nivel de F/N. Nuestras tablas
permiten a un sólo usuario tener asociadas varias urls. Esta es una relación uno-
con-varios, el tipo de relación más común, y hasta que se nos presentó el dilema del
Tercer Nivel de F/N. la única clase de relación que necesitamos.
La relación varios-con-varios, sin embargo, es ligeramente más compleja. Observa
en nuestro ejemplo del Tercer Nivel de F/N que tenemos a un usuario relacionado
con varias urls. Como dijímos, vamos a cambiar la estructura para permitir que
varios usuarios esten relacionados con varias urls y así tendremos una relación
varios-con-varios. Veamos como quedarían nuestras tablas antes de seguir con este
planteamiento:
usuarios
1 Joe 1
2 Jill 2
empresas
urls
urlId url
1 abc.com
2 xyz.com
url_relations
1 1 1
2 1 2
3 2 1
4 2 2
Para disminuir la duplicación de los datos ( este proceso nos llevará al Cuarto Nivel
de F/N), hemos creado una tabla que sólo tiene claves externas y primarias
url_relations. Hemos sido capaces de remover la entradas duplicadas en la tabla urls
creando la tabla url_relations. Ahora podemos expresar fielmente la relación que
ambos Joe and Jill tienen entre cada uno de ellos, y entre ambos, las urls. Así que
veamos exáctamente que es lo que el Cuarto Nivel de F/N. supone:
Cuarto Nivel de F/N.
1. La tabla original debe ser reconstruida desde las tablas resultantes en las cuales a
sido troceada.
Los beneficios de aplicar esta regla aseguran que no has creado ninguna columna extraña
en tus tablas y que la estructura de las tablas que has creado sea del tamaño justo que tiene
que ser. Es una buena práctica aplicar este regla, pero a no ser que estes tratando con una
extensa estructura de datos probablemente no la necesitarás.
Espero que hayas encontrado este artículo útil, y que seas capaz de aplicar estas reglas de
normalización a todos tus proyectos de bases de datos. Y en el caso que te estes
preguntando de donde viene todo esto, las tres primeras reglas de normalización fueron
perfiladas por el Dr. E.F.Codd en su escrito de 1972, "Further Normalization of the Data Base
Relational Model" ( Referente a la normalización de las Bases de Datos Relacionales). La
otras regla han sido teorizadas por posteriores matemáticos/Algebristas.
--Barry
vvvvvvvvvvvvvvvv
Pérez Gómez,
1001 Variable compleja Murray Spiegel McGraw Hill 15/04/2005
Juan
Nancy
García Roque,
1006 Oracle University Greenberg y Oracle Corp. 20/04/2005
Luis
Priya Nathan
Pérez Gómez,
1007 Clipper 5.01 Ramalho McGraw Hill 18/04/2005
Juan
1NF
CodLibro Titulo Autor Editorial Paterno Materno Nombres FechaDev
Variable McGraw
1001 Murray Spiegel Pérez Gómez Juan 15/04/2005
compleja Hill
McGraw
1005 Estadística Murray Spiegel Roca René 16/04/2005
Hill
Oracle Oracle
1006 Priya Nathan García Roque Luis 20/04/2005
University Corp.
McGraw
1007 Clipper 5.01 Ramalho Pérez Gómez Juan 18/04/2005
Hill
2NF
CodLibro Titulo Autor Editorial
McGraw
1001 Variable compleja Murray Spiegel
Hill
McGraw
1005 Estadística Murray Spiegel
Hill
Nancy Oracle
1006 Oracle University
Greenberg Corp.
Oracle
1006 Oracle University Priya Nathan
Corp.
McGraw
1007 Clipper 5.01 Ramalho
Hill
Hemos creado una tabla para contener los datos del lector y también tuvimos
que crear la columna CodLector para identificar unívocamente a cada uno.
Sin embargo, esta nueva disposición de la base de datos necesita que exista
otra tabla para mantener la información de qué libros están prestados a qué
lectores. Esta tabla se muestra a continuación:
Para la Tercera Forma Normal (3NF) la relación debe estar en 2NF y además
los atributos no clave deben ser mutuamente independientes y dependientes
por completo de la clave primaria. También recordemos que dijimos que esto
significa que las columnas en la tabla deben contener solamente información
sobre la entidad definida por la clave primaria y, por tanto, las columnas en la
tabla deben contener datos acerca de una sola cosa.
3NF
CodLibro Titulo
1005 Estadística
802 E. Petroustsos
Nancy
803 Greenberg
806 Ramalho
CodEditorial Editorial
902 Anaya
Aunque hemos creado nuevas tablas para que cada una tenga sólo
información acerca de una entidad, también hemos perdido la información
acerca de qué autor ha escrito qué libro y las editoriales correspondientes,
por lo que debemos crear otras tablas que relacionen cada libro con sus
autores y editoriales.
CodLibro codAutor
1001 801
1004 802
1005 801
1006 803
1006 804
1007 806
CodLibro codEditorial
1001 901
1004 902
1005 901
1006 903
CodLibro codEditorial
1007 901
Vvvvvvvvvvvvvvvvvvv
Un ejemplo completo
Tenemos una empresa pública donde los puestos de trabajo están regulados
por el Estado, de modo que las condiciones salariales están determinadas
por el puesto. Se ha creado el siguiente esquema relacional
EMPLEADOS(nss, nombre, puesto, salario, emails) con nss como clave primaria.
En general, esta solución pasa por sustituir R por una nueva relación
modificada R', en la cual:
Formalización CERO
usuarios
Diríamos que la anterior tabla está en nivel de Normalización Cero porque ninguna de
nuestras reglas de normalización ha sido aplicada. Observa los campos url1 y url2 -- ¿Qué
haremos cuando en nuestra aplicación necesitemos una tercera url? ¿Quieres tener que
añadir otro campo/columna a tu tabla? Obviamente no, tú quieres crear un sistema funcional
que pueda crecer y adaptarse fácilmente a los nuevos requisitos. Realicemos un vistazo a
las reglas del Primer Nivel de Formalización-Normalización, y las aplicaremos a nuestra
tabla.
¿Ves que estamos rompiendo la primera regla cuando repetimos los campos url1 y url2? ¿Y
que pasa con la tercera regla, la clave primaria? La regla tres básicamente significa que
tenemos que poner un campo tipo contador autoincrementable para cada registro. De otra
forma, ¿Qué pasaría si tuviéramos dos usuarios llamados Joe y queremos diferenciarlos.
Una vez que aplicaremos el primer nivel de F/N nos encontraríamos con la siguiente tabla:
usuarios
Ahora diremos que nuestra tabla está en el primer nivel de F/N. Hemos solucionado el
problema de la limitación del campo url. Pero sin embargo vemos otros problemas....Cada
vez que introducimos un nuevo registro en la tabla usuarios, tenemos que duplicar el
nombre de la empresa y del usuario. No sólo nuestra BD crecerá muchísimo, sino que será
muy fácil que la BD se corrompa si escribimos mal alguno de los datos redundantes.
Aplicaremos pues el segundo nivel de F/N:
Hemos separado el campo url en otra tabla, de forma que podemos añadir más en el futuro
si tener que duplicar los demás datos. También vamos a usar nuestra clave primaria para
relacionar estos campos:
usuarios urls
userId nombre empresa direccion_empresa urlId relUserId url
1 Joe ABC 1 Work Lane 1 1 abc.com
2 Jill XYZ 1 Job Street 2 1 xyz.com
3 2 abc.com
4 2 xyz.com
Hemos creado tablas separadas y la clave primaria en la tabla usuarios, userId, esta
relacionada ahora con la clave externa en la tabla urls, relUserId. Esto está mejor. ¿Pero
qué ocurre cuando queremos añadir otro empleado a la empresa ABC? ¿O 200 empleados?
Ahora tenemos el nombre de la empresa y su dirección duplicándose, otra situación que
puede inducirnos a introducir errores en nuestros datos. Así que tendremos que aplicar el
tercer nivel de F/N:
Nuestro nombre de empresa y su dirección no tienen nada que ver con el campo userId, así
que tienen que tener su propio empresaId:
3 2 abc.com
4 2 xyz.com
Ahora tenemos la clave primaria emprId en la tabla empresas relacionadas con la clave
externa relEmpresaId en la tabla usuarios, y podemos añadir 200 usuarios mientras que
sólo tenemos que insertar el nombre 'ABC' una vez. Nuestras tablas de usuarios y urls
pueden crecer todo lo que quieran sin duplicación ni corrupción de datos. La mayoría de los
desarrolladores dicen que el tercer nivel de F/N es suficiente, que nuestro esquema de datos
puede manejar fácilmente los datos obtenidos de una cualquier empresa en su totalidad, y
en la mayoría de los casos esto será cierto.
Pero echemos un vistazo a nuestro campo urls - ¿ Ves duplicación de datos ? Esto es
perfectamente aceptable si la entrada de datos de este campo es solicitada al usuario en
nuestra aplicación para que teclee libremente su url, y por lo tanto es sólo una coincidencia
que Joe y Jill teclearon la misma url. ¿Pero que pasa si en lugar de entrada libre de texto
usáramos un menú desplegable con 20 o incluso más urls predefinidas? Entonces
tendríamos que llevar nuestro diseño de BD al siguiente nivel de F/N, el cuarto, muchos
desarrolladores lo pasan por alto porque depende mucho de un tipo muy específico de
relación, la relación 'varios-con-varios', la cual aún no hemos encontrado en nuestra
aplicación.
Antes de definir el cuarto nivel de F/N, veremos tres tipos de relaciones entre los datos: uno-
a-uno, uno-con-varios y varios-con-varios. Mira la tabla usuarios en el Primer Nivel de F/N
del ejemplo de arriba. Por un momento imaginamos que ponemos el campo url en una tabla
separada, y cada vez que introducimos un registro en la tabla usuarios también
introducimos una sola fila en la tabla urls. Entonces tendríamos una relación uno-a-uno:
cada fila en la tabla usuarios tendría exactamente una fila correspondiente en la tabla urls.
Para los propósitos de nuestra aplicación no sería útil la normalización.
Ahora mira las tablas en el ejemplo del Segundo Nivel de F/N. Nuestras tablas permiten a un
sólo usuario tener asociadas varias urls. Esta es una relación uno-con-varios, el tipo de
relación más común, y hasta que se nos presentó el dilema del Tercer Nivel de F/N. la única
clase de relación que necesitamos.
La relación varios-con-varios, sin embargo, es ligeramente más compleja. Observa en
nuestro ejemplo del Tercer Nivel de F/N que tenemos a un usuario relacionado con varias
urls. Como dijimos, vamos a cambiar la estructura para permitir que varios usuarios estén
relacionados con varias urls y así tendremos una relación varios-con-varios. Veamos como
quedarían nuestras tablas antes de seguir con este planteamiento:
usuarios empresas urls url_relations
userId nombre relEmpresaId emprId empresa direccion_empresa urlId url relationId relatedUrlId relatedUserId