bloque2:diseno
Diferencias
Muestra las diferencias entre dos versiones de la página.
bloque2:diseno [2022/02/14 14:18] – [Conversión de Modelo E/R a Relacional] fernando | bloque2:diseno [2024/09/16 19:34] (actual) – editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 229: | Línea 229: | ||
- | === Claves Secundarias === | + | === Claves |
Se suele llamar de este modo a todos los campos que identifican a cada registro de forma inequívoca, | Se suele llamar de este modo a todos los campos que identifican a cada registro de forma inequívoca, | ||
En las imágenes del ejemplo anterior, el campo (matricula) de la tabla Vehículo, es un campo único por lo que se considera una clave secundaria. También podríamos tener un campo (dni) para la tabla Propietario que actuaría como clave secundaria. | En las imágenes del ejemplo anterior, el campo (matricula) de la tabla Vehículo, es un campo único por lo que se considera una clave secundaria. También podríamos tener un campo (dni) para la tabla Propietario que actuaría como clave secundaria. | ||
- | ====Conversión | + | ====Transformación |
El paso de un modelo E/R a un modelo relacional se puede llevar a cabo, en gran parte, siguiendo una serie de reglas o pautas, que se enumeran a continuación: | El paso de un modelo E/R a un modelo relacional se puede llevar a cabo, en gran parte, siguiendo una serie de reglas o pautas, que se enumeran a continuación: | ||
Línea 244: | Línea 244: | ||
* El **identificador único** de la entidad se convierte en clave primaria. Siempre que pueda, añadiré un campo //id// como clave primaria. | * El **identificador único** de la entidad se convierte en clave primaria. Siempre que pueda, añadiré un campo //id// como clave primaria. | ||
* Los **atributos multivaluados** generan una nueva tabla con tres columnas: un //id//, el //id// de la tabla de la que surgen propagado como //clave ajena// y el valor del campo multivaluado. < | * Los **atributos multivaluados** generan una nueva tabla con tres columnas: un //id//, el //id// de la tabla de la que surgen propagado como //clave ajena// y el valor del campo multivaluado. < | ||
+ | |||
**Relaciones: | **Relaciones: | ||
Línea 272: | Línea 273: | ||
* En la transformación de **relaciones 1:1** se tienen en cuenta las cardinalidades de las entidades que participan en ellas. Existen también diferentes soluciones: | * En la transformación de **relaciones 1:1** se tienen en cuenta las cardinalidades de las entidades que participan en ellas. Existen también diferentes soluciones: | ||
- | - La transfomación tradicional consiste en que una de las tablas tenga una clave primaria que al mismo tiempo es clave ajena de la otra tabla. Solo se puede plantear si alguna de las cardinalidades parciales es (1,1). En ese caso se propaga la clave primaria de la entidad con cardinalidad (1,1) a la tabla resultante de la entidad de cardinalidad (0,1), en la que será clave primaria y ajena al mismo tiempo. Si ambas cardinalidades parciales son (1,1), no importa hacia qué lado se propaga. | + | - La transfomación tradicional consiste en que una de las tablas tenga una clave primaria que al mismo tiempo es clave ajena de la otra tabla. Solo se puede plantear si alguna de las cardinalidades parciales es (1,1). En ese caso se propaga la clave primaria de la entidad con cardinalidad (1,1) a la tabla resultante de la entidad de cardinalidad (0,1), en la que será clave primaria y ajena al mismo tiempo. Si ambas cardinalidades parciales son (1,1), no importa hacia qué lado se propaga. |
- | - Otra solución más sencilla es transformarla como si fuera una relación 1:N. Si existe una entidad con cardinalidad parcial (0,1), su tabla tendrá una columna nueva que sería la clave primaria de la otra entidad propagada como clave ajena. Si las cardinalidades parciales son iguales da igual hacia qué tabla se propague la clave primaria. //Si usamos esta opción, al crear las tablas en el SGBD, la clave ajena debe ser una columna indexada sin repeticiones ('' | + | - Otra solución más sencilla es transformarla como si fuera una relación 1:N. Si existe una entidad con cardinalidad parcial (0,1), su tabla tendrá una columna nueva que sería la clave primaria de la otra entidad propagada como clave ajena. Si las cardinalidades parciales son iguales da igual hacia qué tabla se propague la clave primaria. //Si usamos esta opción, al crear las tablas en el SGBD, la clave ajena debe ser una columna indexada sin repeticiones ('' |
- | - Transformarlo en una tabla. | + | - Transformarlo en una tabla. |
Ejemplo: Un empleado solo puede tener un despacho, y un despacho pertenece a un solo empleado. | Ejemplo: Un empleado solo puede tener un despacho, y un despacho pertenece a un solo empleado. | ||
{{ : | {{ : | ||
- | >Tablas empleados y despachos (opción | + | >Tablas empleados y despachos (Ejemplo |
+ | |||
+ | <code sql> | ||
+ | -- Ejemplo 1: Clave primaria y ajena al mismo tiempo | ||
- | < | ||
- | -- Opción 1 | ||
empleados(# | empleados(# | ||
despachos(# | despachos(# | ||
- | -- Opción | + | -- Ejemplo |
empleados(# | empleados(# | ||
despachos(# | despachos(# | ||
</ | </ | ||
- | * Para los **atributos | + | * Las relaciones |
- | | + | - Para relacionarlas, |
- | | + | - La otra forma, menos común, es transfomarla como si fueran dos relaciones **1:N**: las tablas hijas tienen su propia clave primaria |
- | * Las relaciones | + | |
- | + | ||
- | * Las relaciones de **herencia** se pueden transforman de varias maneras. Aplicando las reglas anteriores, se ha de crear una tabla por cada entidad hija con sus propias columnas. | + | |
- | - Para relacionarlas, | + | |
- | - La otra forma, menos común, es transfomarla como si fueran dos relaciones **1:N**: las tablas hijas tienen su propia clave primaria, y añadirán una columna nueva que es la clave primaria de la entidad padre, propagada como clave ajena. //En este caso, al crear las tablas hijas en el SGBD, las claves ajenas deben tener ser columnas indexadas sin repeticiones ('' | + | |
- | |||
Ejemplo: Una pista puede ser una pista_abierta o una pista_cerrada. | Ejemplo: Una pista puede ser una pista_abierta o una pista_cerrada. | ||
{{ : | {{ : | ||
+ | |||
>Tablas pistas, pistas_abiertas y pistas_cerradas | >Tablas pistas, pistas_abiertas y pistas_cerradas | ||
- | < | + | < |
+ | -- Ejemplo 1: Claves primarias y ajenas al mismo tiempo | ||
pistas(#id, nombre, tipo, superficie) | pistas(#id, nombre, tipo, superficie) | ||
pistas_abiertas(# | pistas_abiertas(# | ||
pistas_cerradas(# | pistas_cerradas(# | ||
- | </ | + | |
+ | -- Ejemplo 2: Claves primarias y ajenas diferentes (-id_pista es UNIQUE y NOT NULL) | ||
+ | |||
+ | pistas(#id, nombre, tipo, superficie) | ||
+ | pistas_abiertas(# | ||
+ | pistas_cerradas(# | ||
+ | </ | ||
* Las relaciones **reflexivas**, | * Las relaciones **reflexivas**, | ||
- | * Si la cardinalidad es **N:M**, se crea una tabla nueva como el caso general de relación N:M. La clave primaria se comprone del id de la tabla. | + | * Si la cardinalidad es **N:M**, se crea una tabla nueva como el caso general de relación N:M. La clave primaria se compone de dos columnas que referencian al mismo id de la propia |
* Si la cardinalidad es **1:N**, se transforma como si se tratara de una relación 1:N, se propaga la clave primaria a la misma tabla como clave ajena. | * Si la cardinalidad es **1:N**, se transforma como si se tratara de una relación 1:N, se propaga la clave primaria a la misma tabla como clave ajena. | ||
- | * Si la cardinalidad es **1:1**, al tratarse de la misma tabla, se transforma como si se tratara de una relación 1:N. //Si usamos esta forma al crear la tabla en el SGBD la columna clave ajena no permitirá valores repetidos (indexada sin repeticiones, | + | * Si la cardinalidad es **1:1**, al tratarse de la misma tabla, se transforma como si se tratara de una relación 1:N. //En este caso, al crear la tabla en el SGBD la columna clave ajena no permitirá valores repetidos (indexada sin repeticiones, |
{{ : | {{ : | ||
>Un empleado puede supervisar a varios empleados | >Un empleado puede supervisar a varios empleados | ||
- | < | + | < |
-- Relacion 1:N y 1:1 | -- Relacion 1:N y 1:1 | ||
empleados(# | empleados(# | ||
Línea 326: | Línea 332: | ||
empleados_supervisores(# | empleados_supervisores(# | ||
</ | </ | ||
+ | |||
+ | * Para los **atributos de las relaciones** existen dos casos: | ||
+ | * Si la relación es 1:N, sus atributos se propagan a la tabla de lado N, junto con la clave del lado 1 | ||
+ | * Si la relación es N:M, sus atributos se transforman en columnas de la tabla generada por dicha relación | ||
+ | * Las relaciones **1:1** no deberían de tener atributos, ya que en principio deben pertenecer a alguna de las dos entidades. | ||
==== Ejemplos de transformaciones a modelo relacional ==== | ==== Ejemplos de transformaciones a modelo relacional ==== | ||
bloque2/diseno.1644848320.txt.gz · Última modificación: 2024/09/16 19:34 (editor externo)