Em bancos de dados relacionais, um relacionamento um-para-um (1:1) ocorre quando um registro em uma tabela está associado a exatamente um registro em outra tabela, e vice-versa. Este tipo de relacionamento é menos comum em comparação a relacionamentos um-para-muitos ou muitos-para-muitos, mas é útil quando se deseja dividir dados que logicamente pertencem a um único registro, mas por razões de design ou organização devem ser armazenados em tabelas separadas.
Implementação de Relacionamento Um-para-Um
Para estabelecer um relacionamento 1:1 entre duas tabelas, você não precisa adicionar uma chave primária em ambas as tabelas para formar a relação. Normalmente, apenas uma das tabelas contém a chave estrangeira que faz referência à chave primária da outra tabela.
Existem duas abordagens comuns:
-
Chave estrangeira em uma das tabelas: Uma tabela, geralmente a dependente ou a que contém os dados menos cruciais, armazena uma chave estrangeira que referencia a chave primária da tabela principal.
-
Chave primária compartilhada: Neste caso, a chave primária de uma tabela é também a chave estrangeira que referencia a outra tabela. Isso garante uma correspondência exata entre os registros de ambas as tabelas, reforçando ainda mais o vínculo um-para-um.
Ambas as abordagens garantem que um registro na tabela A tenha um único correspondente na tabela B, mantendo a integridade referencial.
Cenário Prático: Relacionamento Um-para-Um
Vamos considerar o exemplo clássico de duas tabelas: users
(usuários) e user_profiles
(perfis de usuários).
- A tabela
users
contém informações básicas dos usuários, comoid
ename
. - A tabela
user_profiles
armazena informações adicionais que são mais específicas para o perfil do usuário, comobio
eavatar
.
Aqui está como esse relacionamento pode ser implementado em SQL:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE user_profiles (
user_id INT,
bio TEXT,
avatar VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES users(id)
);
Nesse exemplo, a coluna user_id
na tabela user_profiles
é uma chave estrangeira que referencia a coluna id
na tabela users
, estabelecendo o relacionamento 1:1. Cada registro em users
pode ter no máximo um perfil associado em user_profiles
.
Vantagens de Dividir os Dados
Dividir informações entre duas tabelas que compartilham um relacionamento um-para-um pode ser uma decisão de design vantajosa por vários motivos:
-
Segurança e controle de acesso: Dados sensíveis podem ser armazenados em uma tabela separada com permissões de acesso restritas.
-
Desempenho e eficiência: Separar informações menos acessadas ou menos críticas pode melhorar o desempenho das consultas, mantendo a tabela principal mais enxuta.
-
Manutenção e organização: Facilita a manutenção de dados relacionados, permitindo uma separação clara entre diferentes tipos de informações sem redundância.
Chave Primária Compartilhada
Outra maneira de implementar um relacionamento 1:1 é usando uma chave primária compartilhada, onde a chave primária de uma tabela também serve como chave estrangeira. Aqui está como isso poderia ser feito:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE user_profiles (
id INT PRIMARY KEY,
bio TEXT,
avatar VARCHAR(255),
FOREIGN KEY (id) REFERENCES users(id)
);
Nesse caso, o campo id
na tabela user_profiles
é a chave primária e, ao mesmo tempo, a chave estrangeira que referencia a tabela users
. Isso garante que cada user_profile
corresponda exatamente a um registro em users
.
Diferença entre Relacionamento Um-para-Um e Um-para-Muitos
É importante não confundir um relacionamento um-para-um com um relacionamento um-para-muitos. Em um relacionamento um-para-muitos, um registro na tabela A pode estar associado a vários registros na tabela B, enquanto no um-para-um, essa associação é estritamente limitada a um registro.
Por exemplo, no caso de um relacionamento um-para-muitos entre users
e posts
(postagens), um usuário pode criar vários posts. Isso seria representado com uma chave estrangeira na tabela posts
, onde cada postagem faria referência a um único usuário.
CREATE TABLE posts (
post_id INT PRIMARY KEY,
user_id INT,
title VARCHAR(255),
content TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
Aqui, user_id
permite múltiplos posts por usuário, enquanto em um relacionamento 1:1, o limite seria de apenas um registro relacionado por tabela.
Casos de Uso Comuns
-
Informações Sensíveis: Quando informações sensíveis ou privadas precisam ser armazenadas separadamente por motivos de segurança (como dados médicos ou financeiros).
-
Dados Opcionalmente Relacionados: Quando informações adicionais podem ou não estar presentes (como perfis de usuários com campos opcionais).
Conclusão
Relacionamentos um-para-um em SQL são úteis para garantir que dois conjuntos de dados estejam fortemente acoplados, mas armazenados em tabelas separadas para melhor organização, segurança ou performance. Seja com uma chave estrangeira em uma das tabelas ou compartilhando a chave primária, esse tipo de relação permite gerenciar com eficiência conjuntos de dados relacionados e otimizar o design do banco de dados.