Existem basicamente três opções para traduzir a generalização em um modelo de banco de dados
1. Uma mesa por aula concreta
Criar tabelas
Admin
, Teacher
e Student
. Cada uma dessas tabelas contém colunas para todos os atributos e relações de User
- Pro
- Todos os campos de uma subclasse concreta estão na mesma tabela, portanto, nenhuma junção é necessária para obter todos os dados do aluno
- Restrições fáceis de validação de dados (como campos obrigatórios para
Student
)
- Con
- Todos os campos de
User
são duplicados em cada tabela de subclasse - Chaves estrangeiras para
User
devem ser divididos em três campos FK. Um paraAdmin
, um paraTeacher
e um paraStudent
.
- Todos os campos de
2. Na tabela para todo o conjunto de generalizações
Neste caso você tem apenas uma chamada de tabela
User
que contém todos os campos de User
+ todos os campos de todas as subclasses de User
- Pro
- Todos os campos estão na mesma tabela, portanto, nenhuma junção é necessária para obter todos os
User
dados - Sem divisão de FKs para
User
- Todos os campos estão na mesma tabela, portanto, nenhuma junção é necessária para obter todos os
- Con
- Existem vários campos que nunca são usados. Todos os campos específicos para
Student
eTeacher
nunca são preenchidos paraAdmins
e vice-versa - Validação de dados, como campos obrigatórios para uma classe concreta, como
Student
tornar-se bastante complexo, pois não é mais um simplesNot Null
restrição.
- Existem vários campos que nunca são usados. Todos os campos específicos para
3. Uma tabela por classe concreta e uma para a superclasse
Neste caso, você cria tabelas para cada uma das subclasses concretas e cria uma tabela para a classe
User
. Cada uma das tabelas de subclasses concretas tem um FK obrigatório para User
- Pro
- Esquema mais normalizado:sem campos repetidos para os atributos do usuário e sem campos não utilizados.
- Sem divisão de FKs para
User
- Restrições fáceis de validação de dados (como campos obrigatórios para
Student
)
- Con
- Você precisa consultar duas tabelas se quiser todos os dados de um
Student
- Regras de validação complexas para garantir que cada
User
registro tem exatamente umAdmin
,Teacher
ouStudent
registro.
- Você precisa consultar duas tabelas se quiser todos os dados de um
Qual dessas opções você escolhe depende de uma série de coisas, como o número de subclasses, o número de atributos em qualquer subclasse ou superclasse, o número de FKs para a superclasse e provavelmente algumas outras coisas que eu não fiz pense sobre.