Estou projetando um banco de dados para estudantes. Estudantes de ciência da computação aqui na Suíça podem decidir entre diferentes especializações, por exemplo, desenvolvimento de aplicativos, engenharia de sistemas, etc.
Também há alunos de outras profissões neste aplicativo, que não possuem essa especialização. Alguns exemplos:
+--------------------+-------------------------+
| Profession | Specialization |
+--------------------+-------------------------+
| Computer scientist | |
| | Application development |
| | System engineering |
| | Support |
| | |
| Electrician | |
| | none |
| | |
| Janitor | |
| | none |
| | |
| Architect | |
| | Small buildings |
| | High buildings |
| | |
+--------------------+-------------------------+
Espero que você tenha a idéia. Minha pergunta agora é, como eu desenho as tabelas do banco de dados com esses atributos, já que eles são dependentes uns dos outros? Cada usuário tem uma profissão, alguns não possuem uma especialização dependendo de sua profissão. Portanto, um eletricista não deve ser um desenvolvedor de aplicativos, nem um arquiteto.
Meus pensamentos até agora 1
+-----------------------------+
| User |
+-----------------------------+
| #id |
| profession_id |
| specialisazion_id, nullable |
+-----------------------------+
Imponha a lógica por meio de verificações de restrição
Abordagem 2
+-------------------+ +----------------+ +------------+
| User | | Specialization | | Profession |
+-------------------+ +----------------+ +------------+
| #id | +--| #id | +--| #id |
| username | | | name | | | name |
| specialization_id |--+ | profession_id |--+ +------------+
+-------------------+ +----------------+
Gerencie eu mesmo a lógica e garanta que toda profissão sem especialização tenha uma entrada de especialização.
Abordagem 3
+----------------+ +-----------------------------+ +------------+
| Specialization | | spec_prof | | Profession |
+----------------+ +-----------------------------+ +------------+
| #id |--+ | #id | +--| #id |
| name | +--| specialization_id, nullable | | | name |
+----------------+ | profession_id |--+ +------------+
+-----------------------------+
|
|
+--------------+ |
| User | |
+--------------+ |
| #id | |
| username | |
| spec_prof_id |--+
+--------------+
De alguma forma, todas as abordagens diferentes parecem desajeitadas, sujas. Quais são os argumentos a favor e contra as diferentes abordagens? Existe uma maneira melhor?
E como faço para procurar esse problema? Dependente é a nomenclatura correta?
Qualquer ajuda é muito apreciada.
Eu modelaria isso usando uma única tabela para as Profissões e uma tabela relacionada para as Especializações.
Alguns dados de exemplo:
As profissões, com suas especializações associadas:
Resultados:
Se seus usuários puderem ter apenas uma única profissão, eu criaria uma tabela Users como esta:
ProfessionID
As restrições de verificação garantem que apenas profissões e especializações válidas possam ser adicionadas às custas de exigir uma coluna "duplicada" para especializações.A inserção de usuários fica assim:
Ver os usuários com suas profissões e especializações se parece com:
A tentativa de inserir dados inválidos se parece com:
Se eu precisasse dar suporte a usuários com várias profissões, eu usaria uma tabela de referência cruzada, assim:
Inserir dados:
Consulte os dados:
Resultados:
Mais uma vez, as restrições em vigor impedem combinações inválidas de profissão/especialização:
Isso também apoiará usuários com uma profissão, que não se especializou:
Você pode manter isso simples com uma única hierarquia de tabela, que permite mais de uma "especialização" também.
Acho que você é a Abordagem 1.
Agora você pode consultá-lo com um CTE recursivo.
A vantagem deste formulário é que você pode adicionar uma nova "especialização" e ela funcionará... Por exemplo,
E só vai funcionar..
Now you can see
The Gods
are a-further specialization ofComputer scientists
, andPostgreSQL DBAs
are a subset of them.