Una relación adecuada entre dos entidades es crucial para una comunicación efectiva, y esto también se aplica a las bases de datos. En este artículo, discutiremos los diferentes tipos de relaciones posibles entre objetos de base de datos y cómo modelarlos.
Relación uno a uno
Una relación uno a uno existe cuando una fila en una tabla está relacionada con exactamente una fila en otra tabla. Para establecer esta relación, utilizamos una clave primaria de una tabla como una restricción de clave externa única en otra tabla. Ejemplos del mundo real de relaciones uno a uno incluyen una persona y su tarjeta PAN, pasaporte o licencia de conducir.
Creemos dos tablas, Persona y PANCard, en una base de datos de SQL Server para demostrar esta relación:
-- Crear tabla Persona
CREATE TABLE Persona
(
Id INT IDENTITY PRIMARY KEY,
Nombre VARCHAR(255),
Apellido VARCHAR(255),
Edad INT
)
-- Crear tabla PANCard
CREATE TABLE PANCard
(
Id INT IDENTITY PRIMARY KEY,
Numero VARCHAR(255),
IdPersona INT UNIQUE FOREIGN KEY REFERENCES Persona(Id)
)
-- Insertar datos en la tabla Persona
INSERT INTO Persona VALUES ('Adam', 'M', 25)
INSERT INTO Persona VALUES ('Bob', 'C', 25)
-- Insertar datos en la tabla PANCard
INSERT INTO PANCard VALUES ('P001', 1)
INSERT INTO PANCard VALUES ('P002', 2)
Ahora, podemos unir ambas tablas fácilmente para recuperar datos de manera consolidada:
-- Unir tabla Persona con PANCard para obtener todos los datos juntos
SELECT pr.Nombre, pr.Apellido, pc.Numero as 'Número de tarjeta PAN'
FROM Persona as pr
JOIN PANCard as pc ON (pr.Id = pc.IdPersona)
Relación uno a muchos
Una relación uno a muchos existe cuando una fila en una tabla tiene múltiples filas relacionadas en otra tabla. Esta relación se puede establecer utilizando la clave primaria de una tabla como una restricción de clave externa en otra tabla. Ejemplos de relaciones uno a muchos incluyen una persona y sus autos o un cliente y sus cuentas.
Creemos las tablas para el primer ejemplo, Persona y Auto:
-- Crear tabla Persona (ya creada anteriormente)
-- Crear tabla Auto
CREATE TABLE Auto
(
Id INT IDENTITY PRIMARY KEY,
ChasisNo VARCHAR(50),
NumeroRegistro VARCHAR(50),
AreaRegistro VARCHAR(50),
IdPersona INT FOREIGN KEY REFERENCES Persona(Id)
)
-- Insertar datos en la tabla Auto
INSERT INTO Auto VALUES ('CHS001', 'REG001', 'Area001', 1)
INSERT INTO Auto VALUES ('CHS002', 'REG002', 'Area001', 1)
En el ejemplo anterior, encontramos un error debido a la restricción de unicidad en la clave externa. Para resolver esto, podemos eliminar la palabra clave UNIQUE de la consulta de creación de la tabla Auto.
Para recuperar los autos registrados bajo una persona específica, podemos usar la siguiente consulta:
-- Mostrar los autos registrados bajo la Persona con Id = 1
SELECT pr.Nombre, pr.Apellido, Auto.ChasisNo, Auto.AreaRegistro, Auto.AreaRegistro
FROM Auto
JOIN Persona as pr
ON (Pr.Id = Auto.IdPersona)
WHERE pr.Id = 1
Relación muchos a muchos
Una relación muchos a muchos existe cuando una fila en una tabla tiene múltiples filas relacionadas en otra tabla, y viceversa. Esta relación se puede modelar utilizando una tabla puente, que establece la clave primaria como una combinación de las claves primarias de ambas tablas. Ejemplos de relaciones muchos a muchos incluyen una persona y sus direcciones o un libro y sus autores.
Tomemos el ejemplo de las tablas Persona y Dirección:
-- Crear tabla Dirección
CREATE TABLE Dirección
(
Id INT IDENTITY PRIMARY KEY,
Calle VARCHAR(24),
Área VARCHAR(30),
Ciudad VARCHAR(40),
País VARCHAR(30)
)
-- Crear tabla puente PersonaDirección
CREATE TABLE PersonaDirección
(
IdPersona INT,
IdDirección INT,
CONSTRAINT pk_personaDirección PRIMARY KEY (IdPersona, IdDirección),
CONSTRAINT fk_persona FOREIGN KEY (IdPersona) References Persona(Id),
CONSTRAINT fk_dirección FOREIGN KEY (IdDirección) References Dirección(Id)
)
-- Insertar datos en la tabla Dirección
INSERT INTO Dirección VALUES ('Strt001', 'Área001', 'Ciudad001', 'USA')
INSERT INTO Dirección VALUES ('Strt002', 'Área002', 'Ciudad001', 'USA')
INSERT INTO Dirección VALUES ('Strt003', 'Área003', 'Ciudad001', 'USA')
INSERT INTO Dirección VALUES ('Strt004', 'Área004', 'Ciudad002', 'USA')
-- Insertar datos en la tabla puente
INSERT INTO PersonaDirección VALUES (1, 1)
INSERT INTO PersonaDirección VALUES (1, 2)
INSERT INTO PersonaDirección VALUES (1, 3)
INSERT INTO PersonaDirección VALUES (2, 1)
INSERT INTO PersonaDirección VALUES (2, 2)
Para recuperar las direcciones de una persona o las personas que viven en una dirección específica, podemos usar las siguientes consultas:
-- Obtener todas las direcciones pertenecientes a la Persona con Id = 1
SELECT * FROM Dirección as direcciones
JOIN PersonaDirección as puente ON direcciones.Id = puente.IdDirección
WHERE puente.IdPersona = 1
-- Obtener todas las personas que viven en la Dirección con Id = 1
SELECT * FROM Persona as pr
JOIN PersonaDirección as puente ON pr.Id = puente.IdPersona
WHERE puente.IdDirección = 1
Finalmente, aquí está el diagrama completo de la base de datos:
En conclusión, comprender y modelar adecuadamente las relaciones entre entidades en una base de datos es crucial para una gestión eficiente de datos. Al considerar el tipo de relación entre tablas, podemos diseñar una base de datos bien estructurada y organizada.