Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Implementando o subtipo super-tipo corretamente no MySQL


A mesa "festa" não parece certa. Compare com o código-fonte de esta outra pergunta SO .

Nesse tipo de estrutura, o número de identificação do partido se propaga para baixo, por assim dizer. Geralmente deve ser uma chave primária ou uma chave estrangeira em tabelas que armazenam dados sobre uma pessoa.

Na sua tabela "relatórios", parece que a chave primária não deve ser 'partyid'. Isso permitiria apenas uma linha por funcionário, o que acho que você não pretendia. (Eu posso estar errado.) Se eu estiver certo sobre isso, você pode considerar um NOT NULL UNIQUE restrição em {partyid, date} e uma PRIMARY KEY restrição em uma nova coluna, 'reportid'. As tabelas "viagem" e "desempenho" provavelmente fariam referência a 'reportid'. (Mas continue lendo.)

Há lugares em seu diagrama em que uma entidade obtém uma chave adicional:sua empresa atribui um número de identificação de funcionário exclusivo a seus funcionários, por exemplo. Não há razão teórica para que você não possa usar 'employid' em vez de 'partyid' a partir desse ponto para referenciar funcionários. Mas há uma razão prática que você pode não querer fazer isso. Aumenta o número de junções.

Por exemplo, se as tabelas "credential", "tool", "certification", "academic" e "compliance" fizerem referência a employee.employid em vez de employee.partyid, você não poderá simplesmente associar "compliance" e "party" a obter o nome da pessoa. Você teria que se juntar a "funcionário", também.

Eles precisam ter uma chave primária; a chave primária não precisa necessariamente ser um número de identificação. Se houver uma chave natural existente, você deve identificá-la e declará-la ÚNICA de qualquer maneira.

A tabela "orders" provavelmente deve ter apenas "orderid" como sua chave primária; use uma referência de chave estrangeira para identificar o cliente. Em alguns casos, faz sentido renomear colunas. No caso dos clientes, pode fazer sentido chamar sua chave de 'customerid' em vez de 'parytid'. Eu mesmo criaria um domínio.
create domain PARTY_ID as integer not null;

Então, em todos os lugares que precisassem de um número de identificação do partido, eu usaria o domínio.
create table customers (
    customerid PARTY_ID primary key references parties (partyid),
...

Eu preferiria ver uma tabela de gerentes também. Uma referência a ele garantiria que manager.managerid resolveria para um gerente real, não apenas para qualquer funcionário.