Em muitos projetos de bancos de dados relacionais, existem campos que são referenciados em outras tabelas.
Por exemplo, considere uma tabela de usuário com um nome de usuário exclusivo e uma segunda tabela armazenando dados de endereço.
Um layout possível, que eu diria que é a abordagem comum, porque observei na maioria dos softwares, é usar IDs de incremento automático como este:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
É assim que eu costumava fazer e como eu o via na maioria dos casos.
Outra maneira seria:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
Aqui também armazenamos o nome de usuário completo na tabela adressdata.
Para mim, isso tem as seguintes vantagens:
Você pode selecionar o nome de usuário imediatamente da tabela sem a necessidade de associá-lo a outra tabela. Neste exemplo, isso é do ponto de vista do aplicativo provavelmente não é tão relevante, mas é apenas um exemplo.
Pode ser mais fácil dimensionar o banco de dados em um ambiente de replicação mestre-mestre, porque não há conflitos de incremento automático.
Mas também as desvantagens:
- Os requisitos de espaço para o índice e os dados (mas mais relevante provavelmente será o índice) no campo da segunda tabela são mais altos.
- Uma alteração do nome de usuário precisaria se propagar para todas as tabelas, o que consome mais recursos do que apenas alterá-lo em uma tabela e deixar os IDs como estão.
Na minha opinião, é muito mais fácil trabalhar com campos de texto e não usar IDs de incremento, e as compensações são mínimas e na maioria dos aplicativos não são relevantes.
É claro que alguns objetos SÃO identificados com um número incremental por sua natureza (por exemplo, as postagens no fórum devem receber um ID incremental porque provavelmente não há outro campo exclusivo, como o título).
Mas antes de começar a projetar meus layouts de banco de dados de uma maneira completamente diferente, gostaria de saber se há coisas em que não pensei.
Existem práticas recomendadas?
Existem prós / contras que eu não pensei e cujo efeito pode surgir posteriormente em algum momento?
Como você projeta pessoalmente bancos de dados sobre os pontos acima e por quê?