Optimización del acceso a datos en una base de datos relacional

Relaciones entre tablas

En las bases de datos relacionales, las relaciones entre las tablas generalmente se establecen a través de valores de columna comunes. La relación más común se establece cuando el valor de una columna en una tabla es el mismo valor que una columna en otra tabla. En terminología relacional, esto se crea a través de un "equi-join". Las relaciones también se pueden establecer basándose en otras comparaciones, como "menos que".

Equi-joins requieren la identificación de las dos tablas y sus columnas coincidentes. Una consulta SQL identificará las columnas y un motor de base de datos relacional encontrará todas las filas donde coinciden las columnas. Pero dado que algunas columnas se crean con la intención de unirlas con otras columnas, SQL DDL permite identificarlas designándolas como claves "primarias" o claves "externas". Una clave principal identificará de forma única una fila en una tabla, mientras que una clave externa se refiere a una clave principal para la que existe una relación. Dada esta inteligencia sobre el uso de datos, el motor relacional podrá estructurar las representaciones de datos para permitir un acceso rápido a filas relacionadas.

El siguiente fragmento de SQL DDL muestra un ejemplo de una definición primaria / externa entre dos tipos de tablas:

				
					create table author(
last_name char(13) primary key,
full_name char(35),
yr_born smallint,
yr_died smallint,
short_bio long varchar
);

create table book(
bookid char(14) primary key,
last_name char(13)
references author on delete cascade on update cascade,
title varchar(105) key[16],
descr char(61),
publisher varchar(136),
publ_year smallint range 1500 to 1980 key,
date_sold date,
price decimal(10,2)
);
				
			

La tabla de autor siempre identificará a un autor usando last_name (esto puede requerir algún adorno para crear unicidad, tal vez con las iniciales del nombre). La tabla de libros tiene su propia clave principal, bookid, que está disponible para referencia en otras tablas. Pero la columna last_name de la tabla del libro es la que se está configurando como la referencia externa a una fila en la tabla del libro.

Esta relación primaria / extranjera se ajusta naturalmente a la definición del mundo real de los datos, ya que cada autor puede tener uno o más libros asociados con su nombre. Otro nombre para este tipo de relación es uno a muchos, donde un autor está relacionado con muchos libros.

NOTA: Este ejemplo asume que cada libro está escrito por un solo autor y, por supuesto, este no es siempre el caso, ya que algunos libros tienen varios autores. Con fines ilustrativos, este ejemplo muestra libros de un solo autor. Un tipo de relación más avanzado, comúnmente llamado muchos a muchos, se implementa a través de una "intersección" que se describe en otra parte.

Optimizaciones del motor relacional

Internamente, un motor de base de datos relacional normalmente optimizará las relaciones conocidas mediante la creación de índices en valores de columna tanto primarios como externos. Por lo tanto, escanear los títulos de todos los libros escritos por un determinado autor implica buscar en el índice de clave externa todos los libros que se refieren a ese autor, como se ilustra en la siguiente figura. Generalmente, la Tabla 1 tendrá una clave única (principal) que también está indexada, y la Tabla 2 tendrá uno o más valores clave coincidentes.

Las estructuras de índice facilitan búsquedas rápidas de valores clave y, cuando se encuentran, se obtiene un "puntero" a la fila que contiene el valor.

Relational db

The RDM Core database engine has always had an alternative method to relate tables, in addition to indices. This method has historically been called “set” relationships, where one-to-many relationships are maintained by direct pointers from “owner” to one or more “member” rows. Rather than searching through an index, this method allows a pointer to a member row to be obtained and used directly from the contents of the owner row. See the illustration:

Relational table


El motor central mantiene estos punteros cada vez que se crea o elimina una fila. Por ejemplo, si se agrega un nuevo libro a la base de datos, su autor se ubicará inmediatamente y los punteros se configurarán de manera que el nuevo libro se encuentre en el “conjunto” de libros escritos por el autor.

Una ventaja secundaria y una optimización del uso del método "set" es que el valor de la clave externa (por ejemplo, last_name) no necesita almacenarse físicamente en la fila de referencia porque se puede encontrar en la fila principal. Esto da como resultado una base de datos más pequeña al reducir los datos redundantes y eliminar un índice.
El método "conjunto" permite que el motor relacional se mueva a través de conexiones establecidas en varias direcciones. Puede pasar del propietario de una instancia de conjunto al primer o último miembro del conjunto. Desde un miembro del conjunto, puede pasar al registro de miembro anterior o siguiente, o a la fila de propietario.

The relational equi-join, which is by far the most common method to associate tables in a relational database, has been optimized in RDM by using the “set” method. This is faster than using indices alone because direct pointers between rows are constantly maintained, making navigation from row to row go very quickly, and because referring rows do not contain redundant data values