#
Diagrama do Modelo Relacional
#
O diagrama
A maneira que boa parte das coisas foram convertidas do MER para o Modelo Relacional é clara o suficiente, mas ainda existem alguns pontos a se falar.
Começando pelo ponto mais interessante:
#
Considerações
#
Como implementar uma herança em SQL?
- Single Table Inheritance:
- Criar uma única tabela com todas as propriedades de todas as entidades na relação de herança, e diferenciar qual a entidade da linha/row com um atributo adicional;
- Isso cria problemas, pois, por exemplo, não pode se definir o atributo ISBN como não nulo, já que
"Material Didatico", que tem ISBN nulo, ocuparia a mesma tabela que"Livro". Existem outros problemas, como dificuldade de diferenciação dos atributos de cada "filho", etc.
- Concrete Table Inheritance:
- Fazer uma tabela para cada filho do relacionamento, colocando os atributos do parente em cada um dos filhos. Ou seja, a herança definida com
"Item","Livro"e"Material Didatico"seria implementado usando uma tabela para"Livro"e uma para"Material Didatico"; - Isso cria problemas, pois, por exemplo, teríamos não uma, mas duas tabelas que possuem com lógica de negócio semelhantes (o que significa código duplicado), e a partir daí mais duas tabelas de
"Emprestimo"diferentes, multiplicando o problema por 2. Manutenção e alteração das tabelas está mais suscetível a erro humano, pois coisas que estão muito próximas entre si na modelagem estão sendo implementados mais distantes. Busca pelos itens independente do tipo fica mais difícil, e necessitaria deUNION's.
- Fazer uma tabela para cada filho do relacionamento, colocando os atributos do parente em cada um dos filhos. Ou seja, a herança definida com
- Class Table Inheritance:
- Fazer uma tabela com os atributos comuns entre os filhos (representando o pai). Então implementar cada filho como sua própria tabela, a qual tem chave primária que também funciona como chave estrangeira para seu pai;
- Um problema conhecido dessa implementação é a dificuldade em encontrar os filhos a partir do pai. Geralmente é necessário procurar em tabela por tabela dos filhos. No entanto, utilizar o atributo type no pai é o suficiente para diferenciar em qual tabela procurar.
Finalmente, com todas essas considerações, e visto que não foram feitas todas as considerações possíveis, somente as pensadas mais relevantes para o problema, foi decidido que a melhor opção é usar Class Table Inheritance.
#
Outros Detalhes de Implementação
- Foram criados tipos Enum para os campos
"Emprestimos"."status","Usuarios"."funcao","Items"."type", pois- Isso torna o banco de dados uma fonte de verdade mais abrangente, contendo segurança de tipos ao inserir valores nesses campos;
- Sobre
"Emprestimos", além de usar(itemId, itemType, userId, dataDeEmprestimo)como PK, também será usado um index único para(status, )
- O hash da senha é guardada como
char(60), pois- A função de criptografia sempre gera um hash de mesmo tamanho;
- Em específico, usar crypto do pgcrypto com o algoritmo
bfgera output de tamanho60;