4D v16.3

Tipos de relaciones

Inicio

 
4D v16.3
Tipos de relaciones

Tipos de relaciones  


 

 

El tipo de relación más comúnmente utilizado es la relación entre una tabla Muchos y una tabla Uno, llamada relación Muchos a Uno. Sin embargo, también puede crear relaciones Muchos a Muchos y Uno a Uno. Todas las relaciones pueden ser manuales o automáticas.

Una relación pueden ser automática o manual.

En una relación automática, cuando un registro en una tabla relacionada se convierte en el registro actual, 4D selecciona el o los registros correspondientes. Estos registros especificados pueden visualizarse, imprimirse, modificarse o utilizarse para realizar búsquedas y ordenaciones. No es necesario utilizar programación.

En una relación manual, puede ejercer control sobre la carga en memoria de los registros correspondientes por parte de 4D. Para ejercer este control es necesario utilizar métodos. Para mayor información sobre la creación de métodos que controlen tablas relacionadas, consulte el Manual Lenguaje de 4D.

Puede utilizar relaciones manuales si quiere optimizar el rendimiento de aplicaciones específicas que no necesitan cargar todos los registros correspondientes a la vez. Por ejemplo, si su estructura relaciona tres o más tablas, usted podría querer controlar cuándo cargar los registros relacionados. Puede utilizar una relación manual si quiere relacionar dos tablas con dos relaciones diferentes. Sólo puede existir una relación automática entre dos tablas, mientras que el número de relaciones manuales entre dos tablas no tiene límites.

Cuando cree una relación entre dos tablas, la tabla que contiene la llave primaria de la relación se llama Tabla Uno y la tabla que contiene el campo llave de llamada de la relación se llama Tabla Muchos. Las tablas se llaman Uno y Muchos porque un registro de la tabla Uno está relacionado con muchos registros de la tabla Muchos y viceversa. Este tipo de relación se llama una relación de Muchos a Uno.

En la relación entre empleados y empresas, la tabla [EMPRESAS] es la tabla Uno y la tabla [EMPLEADOS] es la tabla Muchos. El registro de una empresa está relacionado con varios empleados (todos los empleados de esta empresa) y varios empleados están relacionados con una empresa (la empresa para la cual trabajan). Por ejemplo, puede haber un registro que corresponde a la empresa Acme en la tabla [EMPRESAS] y varios registros de personas empleadas por Acme en la tabla [EMPLEADOS].

Cuando un registro de la tabla [EMPLEADOS] se convierte en el registro actual, 4D carga el registro correspondiente de la tabla [EMPRESAS]. Si algunos campos han sido incluidos desde la tabla [EMPRESAS], los valores de estos campos se muestran automáticamente.
La siguiente imagen muestra cómo el nombre de la empresa en un registro de la tabla [EMPLEADOS] especifica un registro de la tabla [EMPRESAS] de manera que el registro de la tabla [EMPLEADOS] puede mostrar la dirección y número telefónico de la empresa:

En cambio, cuando un registro de la tabla [EMPRESAS] se convierte en el registro actual, 4D crea una selección de registros en la tabla [EMPLEADOS] y los muestra en el formulario. Sólo los registros mostrados en el formulario se cargan en la memoria.

La imagen a continuación muestra cómo el nombre de una empresa en un registro de la tabla [EMPRESAS] especifica varios registros de la tabla [EMPLEADOS] de manera que el registro de la tabla [EMPRESAS] muestre una lista de empleados de esa empresa.

La diferencia entre la tabla Uno y la tabla Muchos es propia de cada relación. Una tabla puede ser la tabla Uno en una relación y puede serla tabla Muchos en otra relación. Una tabla en una relación sólo necesita tener una llave primaria, pero puede tener varias llaves foráneas.

Por ejemplo, suponga que decide enviar un paquete de mercancía de muestra para todas las personas de la tabla [EMPLEADOS]. Usted añade una tabla [Tarifa_Postal] que contiene los códigos postales y la tarifa postal para cada código postal. El uso de esta estructura le permite imprimir las etiquetas para cada persona, incluyendo el valor de enviar el paquete.

El campo Codigo_Postal de la tabla [CODIGOS_POSTALES] es la llave primaria, así que en esta relación, la tabla [Tarifa_Postal] es la tabla Uno. El campo CodigoPostal en la tabla [EMPRESAS] es la llave foránea para esta relación: en este caso, puede tener valores duplicados para empresas que están en una misma área. La tabla [EMPRESAS] es entonces la tabla Muchos para la relación con la tabla [CODIGOS_POSTALES].

Una tabla es una tabla Uno o Muchos dependiendo de la relación con la otra tabla. La tabla [EMPRESAS] es la tabla Muchos en la relación con la tabla [CODIGOS_POSTALES] y es la tabla Uno en la relación con la tabla [EMPLEADOS].

Las relaciones Uno a Uno se utilizan sólo en casos especiales puesto que las tablas relacionadas por este tipo pueden combinarse en una sola tabla.

Algunas de las razones para utilizar relaciones Uno a Uno son:

  • Su base tiene datos de tipo Texto, Imagen o BLOB muy grandes. Estos campos podrían ralentizar la base si se cargan en la memoria cuando un registro se convierte en el registro actual. Al colocar los textos, imágenes o BLOBs en otra tabla, puede cargar en memoria sólo los datos que necesita y de esta forma optimizar el funcionamiento de la base.
  • Su base contiene un número muy grande de campos y necesita dividirlos en grupos lógicos. Las tablas separadas pueden hacer que la base de datos sea más rápida y fácil de utilizar.
  • Quiera limitar el acceso a ciertos campos. Utilizando tablas separadas, puede asignar diferentes privilegios de acceso a cada tabla.

Algunas veces, usted necesita relacionar algunos registros de una tabla con otros registros de otra tabla. Este tipo de relación se conoce como relación Muchos a Muchos.

Un ejemplo de una relación Muchos a Muchos es una base de datos que hace seguimiento a las inscripciones de materias de un grupo de estudiantes. Imagine que esta base tiene dos tablas: [Estudiantes] y [Clases]. Un estudiante puede inscribirse en varias clases y una clase puede tener varios estudiantes. Usted quiere ver las clases que ha inscrito un estudiante y todos los estudiantes inscritos en cada clase.

Otros ejemplos de relaciones Muchos a Muchos son:

  • [Proveedores] y [Productos]: cada proveedor suministra diferentes productos y cada producto puede ser suministrado por diferentes proveedores.
  • [Empleados] y [Cuentas]: cada empleado trabaja en diferentes cuentas y cada cuenta puede ser utilizada por diferentes empleados.
  • [Películas] y [Actores]: cada película reúne diferentes actores y cada actor puede participar en diferentes películas.

Puede utilizar 4D para crear automáticamente relaciones Muchos a Muchos. La clave es crear una tabla intermedia relacionada a las otras tablas utilizando relaciones Muchos a Uno. Luego puede crear los formularios de entrada y salida para manejar el seguimiento y visualización de los datos.

La siguiente imagen muestra la base de datos de inscripciones con tres tablas, [ESTUDIANTES], [MATERIAS] y [ESTUDIANTE_MATERIA]. Esta sección utiliza la estructura de esta base de datos para explicar cómo funcionan las relaciones Muchos a Muchos.

La tabla [ESTUDIANTES] es una tabla Uno. Contiene un registro por cada estudiante, incluyendo su nombre, apellido y promedio. Su número de ID lo identifica de manera única.
La tabla [MATERIAS] también es una tabla Uno. Contiene un registro para cada clase, incluyendo el nombre de la materia y el profesor. El ID identifica cada materia de manera única.
Una tabla intermedia, la tabla [ESTUDIANTE_MATERIA], es la tabla Muchos para las otras dos tablas. Contiene registros de varios estudiantes y clases. Los formularios de esta tabla se utilizan para la entrada y despliegue de datos de las otras dos tablas.
El uso de tres tablas asegura que los datos se almacenen eficientemente. El registro completo de un estudiante sólo se almacena una vez. Los registros que relacionan los estudiantes a las clases se almacenan una vez por inscripción. Toda la información está disponible en cualquier combinación.

Se utiliza una tabla intermedia, en este ejemplo la tabla [ESTUDIANTE_MATERIA], para introducir y mostrar información de las otras dos tablas. Cada registro que introduzca en la tabla [ESTUDIANTE_MATERIA] está relacionado con las otras tablas (ESTUDIANTES y MATERIAS). Los registros de la tabla [ESTUDIANTE_MATERIA] sólo contienen las dos partes de información que establece la relación: la identificación del estudiante y el nombre de la materia. Este es un ejemplo de un registro que se está introduciendo en la tabla [ESTUDIANTE_MATERIA]:

Este registro indica que el estudiante Javier Guillén está inscrito en la clase de programación avanzada. Este registro combina información de las otras dos tablas.

Un registro similar existe por cada materia en la que el estudiante se haya inscrito. En la tabla [ESTUDIANTE_MATERIA] sólo están almacenados actualmente los campos de identificación del estudiante y el nombre de la materia. Cada registro indica la inscripción de un estudiante en particular a una materia específica.

Nota: cuando un registro de la tabla [ESTUDIANTE_MATERIA] se carga (como durante su creación), se crea automáticamente una selección de registros en las tablas relacionadas. La selección está compuesta por los registros de estudiantes y materias correspondientes. Si abre cada una de las otras tablas constatará que sólo se muestra un registro. Para
mostrar todos los registros, seleccione Mostrar todos en el menú Búsquedas.

El formulario de entrada para este registro se muestra a continuación. Note que contiene campos de las tablas [ESTUDIANTES] y [MATERIAS].

Los datos se introducen únicamente en los campos de identificación del estudiante y de la materia. Cuando se introduce la identificación de un estudiante, 4D busca la información del estudiante en la tabla relacionada [ESTUDIANTES] y la muestra en los campos Apellido y Nombre. Igualmente, cuando se introduce la identificación de la materia, 4D busca la información en la tabla relacionada [MATERIAS] y la muestra en el formulario de entrada.

Puede mostrar información de estas tres tablas utilizando subformularios. Puede mostrar todas las materias en las que está inscrito un estudiante en el registro del estudiante. Puede mostrar todos los estudiantes inscritos en una clase particular desde el registro de la clase.

Para mostrar la lista de materias en el registro de un estudiante, utilice un subformulario. Para mayor información sobre la creación de subformularios, consulte el párrafo Crear y definir un subformulario.

El registro de la imagen anterior está en la tabla [ESTUDIANTES]. Se muestra la información del estudiante en la parte superior y el subformulario en la parte inferior muestra la información de las materias que ha inscrito, traída de la tabla [ESTUDIANTE_MATERIA].

Note que el subformulario corresponde a la tabla [ESTUDIANTE_MATERIA], no a la tabla [MATERIAS]. La tabla [ESTUDIANTE_MATERIA] contiene los registros que relacionan los registros de los estudiantes con los registros de las materias. El subformulario contiene el campo Nombre de la materia [MATERIAS].
Por la relación entre las tablas [ESTUDIANTE_MATERIA] y [MATERIAS], 4D puede mostrar el nombre de la materia automáticamente.

Este registro muestra la lista de estudiantes inscritos en una clase:


Este es un registro de la tabla [MATERIAS]. Muestra información de la materia y la lista de estudiantes inscritos. La información de los estudiantes es traída de la tabla [ESTUDIANTE_MATERIA], que contiene los registros que relacionan las clases con los estudiantes inscritos en ellas.

En los ejemplos anteriores de subformularios, puede introducir datos en todos los campos mostrados. Por ejemplo, para introducir el registro de un nuevo estudiante, coloque el cursor en el último registro del subformulario y presione las teclas Ctrl+Mayús: (Windows) o Comando+Mayús: (Mac OS)1 para crear un nuevo registro (puede cambiar este atajo en las Propiedades de la base, ver el párrafo ). Cuando introduzca el nombre de la materia, el resto de la información se introduce automáticamente en el registro.

Las relaciones que establezca en una base de datos juegan un papel muy importante en el funcionamiento de la base controlando el flujo de datos entre las tablas.

Si un registro con una relación automática se carga en un formulario de entrada, el o los registros de la tabla relacionada correspondiente serán seleccionados. Si la relación selecciona sólo un registro en una tabla relacionada, ese registro se cargará desde el disco. Si la relación hace referencia a varios registros, una nueva selección actual de registros será creada para esta tabla y se cargará el primer registro de esa selección. El registro que se carga se llama registro actual de la tabla.

En los ejemplos de esta sección, se han definido relaciones entre no más de tres tablas. En realidad, con frecuencia se definen relaciones entre varias tablas y se activan una tras otra, como una cadena. Cada vez que se activa una relación, 4D crea una selección de registros en la tabla relacionada y carga un registro. El registro cargado se convierte en el registro actual para la tabla y si la tabla tiene una relación automática, 4D crea una nueva selección en la tabla siguiente de la cadena.

Si las relaciones de las tablas no se han definido cuidadosamente, el flujo de información entre las tablas puede llegar a ser desordenado o incorrecto. Los siguientes casos ilustran estructuras relacionales a las cuales es necesario prestar mucha atención.

Una relación circular es un conjunto de relaciones definidas de manera que la transferencia de datos forma un bucle indefinido. La siguiente imagen le muestra una relación circular en la que la tabla [EMPLEADADOS] está relacionada a la tabla [EMPRESAS], que a su vez está relacionada a la tabla [ASEGURADOR], que vuelve a relacionarse a la tabla [EMPLEADOS].

 

Cuando un registro de la tabla [EMPLEADOS] se carga, 4D carga el registro correspondiente de la tabla [EMPRESAS]. Este registro se convierte en el registro actual de la tabla [EMPRESAS], lo que implica la carga del registro relacionado de la tabla [ASEGURADOR].

Si a las relaciones les estuviera permitido continuar, los registros relacionados con esta aseguradora (todas las personas aseguradas por la empresa) serían seleccionados en la tabla [EMPLEADOS] y el primer registro de esa selección se convertiría en el registro actual. Observe que este registro actual puede ser diferente al registro actual que tenía inicialmente cuando inicio la progresión. En este caso, 4D no tiene forma de saber cuál es el verdadero registro actual.

Cuando 4D encuentra este tipo de relaciones circulares, las relaciones entre las tablas se detienen en la última tabla en la cadena. En este caso, la relación entre las tablas [ASEGURADOR] y [EMPLEADOS] no se lleva a cabo.

Un conflicto similar entre registros actuales ocurre si tiene más de un enlace a la misma tabla.
Como no es posible tener más de un registro actual a la vez, no es posible controlar una relación automática en la cual dos o más tablas están relacionadas con la misma tabla.
La siguiente imagen muestra una estructura de base de datos en la cual una tabla y su subtabla están relacionadas con la misma tabla.

Cuando un usuario está trabajando con un registro de la tabla [EMPLEADOS], el registro relacionado de la tabla [SEGURO] se carga y se convierte en el registro actual para esa tabla.
Sin embargo, también hay una relación entre la subtabla [BENEFICIARIOS] y la tabla [SEGURO]. Esto significa que otro registro relacionado se carga en la tabla [SEGURO] de acuerdo al subregistro actual de la tabla [BENEFICIARIOS] (el primer registro de la selección actual). Si la empresa aseguradora de los beneficiarios es diferente a la de su padres, esta estructura relacional causará problemas. En este caso, 4D no detiene la ejecución de las relaciones. Ambas relaciones se ejecutan, pero no al mismo tiempo.
Si quiere utilizar una estructura de este tipo, debe utilizar relaciones manuales y controlar las relaciones utilizando los comandos descritos en el Manual del lenguaje de 4D.

Otro ejemplo de una estructura relacional que no puede ser manejada con relaciones automáticas es la de una estructura en la cual una tabla tiene más de una relación con otra tabla. Cada vez que un usuario modifique uno de los campos relacionados en la tabla 1, el registro actual de la otra tabla Muchos cambiar. En este caso, usted no puede saber qué relación está siendo activada.

Como hay un registro actual en cada tabla, las relaciones no están establecidas para todos los registros de una selección. Observemos por ejemplo la base de facturación que se muestra a continuación:

Cuando un registro de la tabla [FACTURAS] es utilizado, se crea una selección de registros en la tabla [LINEAS_FACTURA] que contiene todas las líneas para esta factura. Sólo se carga el registro de la tabla [ITEMS] correspondiente al primer registro de la tabla [LINEAS_FACTURA]. La selección actual de la tabla [ITEMS] no contiene información sobre todos los objetos de la factura, sólo sobre el primer objeto de la factura.

Sin embargo, si pone la tabla [LINEAS_FACTURA] en un subformulario y la tabla [FACTURAS], 4D llama cada una de las líneas de la factura y activa la relación para cada una de ellas.

 
PROPIEDADES 

Producto: 4D
Tema: Definir la estructura de la base de datos

 
HISTORIA 

 
ARTICLE USAGE

Manual de Diseño ( 4D v16)
Manual de Diseño ( 4D v16.1)
Manual de Diseño ( 4D v16.3)