Notas sobre Bases de Datos - Relaciones

Contenido


Relaciones

Una relación se crea cuando una columna de una tabla referencia a otra columna de otra tabla, la cual se conoce como Foreign Key.

👉 Una Foreign Key siempre hace referencia a la Primary Key de otra tabla o a una columna con la restricción UNIQUE.

Necesitamos describir formalmente las relaciones entre las tablas de nuestra base de datos. La forma en que describimos las relaciones es a través de las claves (Primary Keys, Foreign Keys).

↑ Ir al inicio

Tipos de relaciones

👉 Algo a tener en cuenta es que no es necesario que todas las tablas de la DB tengan relación con alguna otra.

1 to 1

En las relaciones 1 a 1, una entidad sólo tiene relación con otra y viceversa. Por ejemplo, un número de pasaporte puede estar asociado a una única persona y cada persona puede tener sólo 1 número de pasaporte.

Para diseñar relaciones 1 to 1, la forma más común es poner los datos en diferentes columnas de la misma tabla. Por ejemplo, si queremos relacionar un user_id con un username

user_id fist_name last_name username
1 Linus Torvalds ltorvalds

En este caso, el user_id 1 está asociado sólo con el username ltorvalds y viceversa.

One-to-One Relationship

Ver One-to-One Relationship

También podemos tener relaciones 1 to 1 con los datos distribuídos en 2 tablas, por ejemplo, si queremos relacionar usuarios con tarjetas de crédito, podemos hacer

id fist_name last_name card_id
1 Caleb Curry 50
id issue_date max_ammount user_id
50 2020/03/01 5000 1

(en este caso, user_id es una Foreign Key que referencia al id de la tabla de usuarios)

👉 Este es el tipo de relación menos frecuente en bases de datos relacionales.

↑ Ir al inicio

1 to many

En las relaciones 1 a muchos, una entidad puede tener relaciones con 1 o más entidades (pero no a la inversa).

Por ejemplo, las siguientes tablas se encuentran relacionadas a través del customer_id. En la tabla Customer, cumple el rol de Primary Key, mientras que en la tabla Order, cumple el rol de Foreign Key.

⚠️ Notar que esto implica que customer_id debe ser único en la tabla Customer, pero no necesariamente en Order.

Customer

customer_id first_name last_name email address
367 Michelle Blackwell mblackwell@... 22 Acacia...
368 Lynn Allen la1942@... 1016B 1st...
369 Lee Stout lee@... 47 Main St...

Order

order_id date quantity total customer_id
1198 3/1/2011 17 $340.00 367
1199 3/2/2011 47 $902.00 367
1200 3/2/2011 104 $1500.00 368

Este tipo de relación se conoce como 1 to many, ya que cada customer puede tener asociadas 1 o más orders.

⚠️ Notar que la inversa no es cierta, en este caso cada orden puede tener 1 (y sólo 1) cliente asociado.

One-to-Many Relationship

Ver One-to-Many Relationship

👉 Este es el tipo de relación más común en bases de datos relacionales.

↑ Ir al inicio

many to many

En las relaciones muchos a muchos, muchas entidades pueden tener relaciones con 1 o más entidades y viceversa. Por ejemplo, muchos estudiantes pueden estar cursando más de 1 asignatura y a la vez cada asignatura puede tener más de 1 estudiante anotado.

👉 En la mayoría de las bases de datos relacionales no podemos expresar relaciones many to many directamente, sino que tendremos que hacerlo indirectamente.

Por ejemplo, podemos tener una tabla de autores (authors), otra de libros (books) y relacionar los autores con los libros de forma tal que un/a autor/a pueda estar asociado a uno o más libros, es decir, una relación del tipo 1 to many.

authors

author_id (PK) first_name last_name email
445 Tucker Morrison tmorrison@...
446 Robert Allen rallen@...
447 Jordan Winters jwinters64@...

books

book_id (PK) title list_price author_id (FK)
1145 Designing Databases $45 447
1146 PostgreSQL Made Simple $39.95 446
1147 Y U Don't Need MongoDB $19.95 447

El problema aparece si un mismo libro puede tener varios autores, cómo representamos esa relación? No podemos asociar un libro con múltiples Foreign Keys (authorID sería una Foreign Key de la tabla books), al menos no con una única columna author_id. Una posible solución podría ser agregar una segunda columna, author_id_2 (nulleable, en el caso de que haya un único autor), como se muestra abajo, pero esta no es una práctica recomendada y lleva a un mal diseño, ya que estamos repitiendo información (columnas), por lo que vamos a intentar evitarla.

book_id (PK) title list_price author_id_1 (FK) author_id_2 (FK)
1145 Designing Databases $45 447 446
1146 PostgreSQL Made Simple $39.95 446 (null)
1147 Y U Don't Need MongoDB $19.95 447 445

👉 La solución para este tipo de casos entonces, suele ser agregar una tercer tabla, intermedia, que linkee (haga de enlace) entre las otras 2. [1]

authors

author_id (PK) first_name last_name email
445 Tucker Morrison tmorrison@...
446 Robert Allen rallen@...
447 Jordan Winters jwinters64@...

authors_books

authors_books_id (PK) author_id book_id
1 447 1145
2 445 1145
3 446 1146
4 447 1146

books

book_id (PK) title list_price
1145 Designing Databases $45
1146 PostgreSQL Made Simple $39.95
1147 Y U Don't Need MongoDB $19.95

Nos deshacemos de la Primary Key author_id en books.

Podemos decir entonces que ahora tenemos 2 relaciones 1 to many: 1 de authors hacia books y otra de books hacia authors.

👉 La tabla authors_books existe únicamente con el fin de unir authors con books y establecer la relación.

Many-to-Many Relationship

Ver Many-to-Many Relationship

↑ Ir al inicio

Cardinalidad

La cardinalidad expresa cuántas entidades se relacionan con otras, es decir, es sólo un nombre para hablar de los tipos de relaciones mencionados anteriormente (1 to 1, 1 to many ó many to many).

Cardinalidad

↑ Ir al inicio


1 Con las tablas intermedias también podemos utilizar claves compuestas (aka Composite Keys).