Digamos que eu tenha uma tabela chamada users
que contém informações básicas do usuário, como e-mail e senha, e também tenho uma tabela chamada clients
.
Um cliente é um tipo de usuário, portanto terá um campo que conterá o id do usuário correspondente da tabela users
, um campo como user_id
.
Agora digamos que existem tabelas específicas do cliente e então haverá a necessidade de armazenar o id do cliente, assim:
Tabela de usuários:
eu ia | |
---|---|
1 | [e-mail protegido] |
2 | [e-mail protegido] |
Tabela de clientes:
eu ia | Nome | ID do usuário |
---|---|---|
1 | Usuário 1 | 1 |
2 | Usuário 2 | 2 |
Tabela de cursos:
eu ia | Nome | ID do Cliente |
---|---|---|
1 | Curso 1 | 1 |
2 | Curso 2 | 2 |
Agora o que eu realmente não sei é qual ID devo salvar na tabela Cursos.
Devo salvar a client_id
tabela de clientes ou devo salvar o ID do usuário da tabela de usuários como ID do cliente.
Eu realmente não sei porque cliente é um tipo de usuário e só um cliente pode comprar um curso, nem todos os tipos de usuários, por outro lado, um cliente não existe sem um usuário o que é realmente confuso é que se eu usar o ID do usuário em vez do ID do cliente, então o campo deve ser chamado de "user_id"? Mas então seria genérico, pois apenas clientes podem fazer um curso.
Então, qual é a melhor abordagem:
1 - Nomeie o campo client_id
e adicione o id do cliente da tabela de clientes e depois obtenha o usuário relacionado a esse cliente (estou inclinado a este).
2 - Nomeie o campo client_id
e armazene o id do usuário na tabela de usuários e obtenha o cliente associado (Isso é um pouco mais confuso, mas pode fazer sentido hierarquicamente falando, já que não há cliente sem usuário).
3 - Nomeie o campo user_id
e armazene o id do usuário da tabela de usuários (essa abordagem realmente quebra a semântica na minha opinião, pois user_id
poderia ser qualquer usuário, mas somente o usuário do tipo cliente poderia ter um curso).
-----------------------------ATUALIZAR-------------------- -----
Então acho que minha pergunta não ficou clara, então vou esclarecer.
O que eu quero saber é se existe alguma prática recomendada neste tópico porque a maneira como armazeno e recupero dados impactaria diretamente a maneira como recupero dados no aplicativo devido aos relacionamentos.
Agora, em um cenário real onde tenho 3 tabelas: table users
, table clients
e table courses
.
A tabela clients
contém apenas os campos que não caberiam na users
tabela considerando que terei mais tipos de usuários que estarão em outras tabelas também, como administradors
o que também é um tipo de usuário.
Agora, considerando que um cliente não existiria sem um usuário e considerando que apenas os clientes podem fazer compras para comprar um curso por exemplo, qual id devo armazenar na client_id
tabela courses
, o id da tabela clients
ou o id da tabela users
.
Por exemplo, apenas clientes podem comprar produtos, mas um cliente ( clients
tabela) pertence a um usuário ( users
tabela). Na tabela, digamos purchased_products
que contém um campo chamado client_id
, devo ter o id do cliente da tabela clients
ou o id do usuário da tabela users
?
Ambos fazem sentido para mim e eu seria capaz de recuperar os dados independentemente do que eu realmente queira saber é o que faz mais sentido aqui:
1 - Se eu armazenasse o id da tabela clients
em courses.client_id
, recuperaria o usuário assim: $client->user
o que hierarquicamente não faz sentido já que um usuário vem antes de um cliente e não o contrário mas pelo menos seria o id da tabela client
armazenado em courses.client_id
.
2 - Se eu armazenar o id da tabela users
em courses.client_id
, recuperaria os dados de uma forma que fizesse mais sentido, como $user->client but I fell like the name of the field should not be
cursos.client_id but rather
cursos.user_id` mas também seria ruim porque nem todos os usuários podem comprar um curso, então pode parecer enganoso .
No primeiro exemplo $client
contém todas as informações relacionadas à tabela clients
e $client->user would access all information related to the table
users` desse cliente.
No segundo exemplo $user
contém todas as informações relacionadas à tabela users
e $user->client would access all information related to the table
clients` desse usuário.
Novamente, é mais uma questão semântica para tornar as coisas mais organizadas.