9.1.4. Mapeamento para o Modelo Relacional
Esta seção discute como transformar o esquema conceitual expresso por um diagrama entidade relacionamento em um esquema lógico de um banco de dados relacional.
Esse processo segue algumas regras bem conhecidas que serão apresentadas com base no diagrama da Figura 9.13.
9.1.4.1. Mapeamento de tipos de entidade forte
Para cada tipo de entidade forte \(E\) do modelo ER, devemos criar uma relação (tabela) \(R\) que inclua todos os atributos simples de \(E\). Além disso, devemos escolher como chave primária um dos atributos identificadores de \(E\). Se mais de um atributo for necessário para identificada uma entidade, então criaremos uma chave primária composta.
No diagrama da Figura 9.13 temos os seguintes tipos de entidade forte: Funcionario
, Departamento
, Projeto
, Peca
e Fornecedor
. Portanto, criaremos as relações mostradas na Figura 9.14.
9.1.4.2. Mapeamento de tipos de entidade fraca
Para cada tipo de entidade fraca \(F\) do modelo ER, associado a um ou mais tipos de entidades proprietárias, devemos criar uma relação (tabela) \(R\) que inclua todos os atributos simples de \(F\). Também devemos incluir como chave estrangeira em \(R\), os atributos identificadores dos tipos de entidades proprietárias associadas, mas apenas aqueles usados como chave primária no mapeamento desses tipos para as respectivas tabelas do modelo relacional. A chave primária de \(R\) é a combinação das chaves primárias das tabelas derivadas dos tipos de entidade proprietárias e a chave parcial do tipo de entidade fraca \(F\).
No diagrama da Figura 9.13 temos apenas o tipos de entidade fraca Dependente
, relacionada ao tipo de entidade forte Funcionario
. Portanto, criaremos a relação mostrada na Figura 9.15.
No modelo relacional, podemos definir a opção de propagação (CASCADE
) tanto de valores da chave primária para a chave estrangeira no caso de atualização, quanto a remoção automática de linhas da tabela contendo a chave estrangeira quando uma linha da outra tabela contendo a respectiva chave primária for removida.
9.1.4.3. Mapeamento dos tipos de relacionamento binário 1:1
Para cada tipo de relacionamento binário \(R\) 1:1 do diagrama ER, devemos identificar as relações (tabelas) S
e T
que correspondem aos tipos de entidades participantes no relacionamento. Temos três opções:
Chave estrangeira: Escolhemos uma das relações e incluímos como chave estrangeira a chave primária da outra relação. A escolha pode dependender da interpretação do relacionamento. No entanto, quando um dos tipos de entidade não tiver participação total, escolhemos colocar a chave primária da relação associada a esssa entidade na tabela associada ao tipo de entidade forte.
Relação mesclada: Quando a participação dos dois tipos de entidade no relacionamento é total, podemos criar uma única tabela com campos derivados das duas. Obviamente que existem vantagens e desvantagens nessa escolha.
Referência cruzada: Podemos também optar por criar uma terceira relação (tabela)
P
materializando o relacionamento, incluindo as chaves dos dois tipos de entidades. A chave primária dessa nova relação pode ser tanto a chave primária deS
quanto a deT
. Além disso, podemos incluir nessa relação (tabela) os atributos presentes no tipo de relacionamento que deu origem a ela.
No diagrama da Figura 9.13, o relacionamento Gerencia
possui um caso em que o tipo de entidade Funcionario
não possui participação total no relacionamento (Figura 9.5). Dessa forma, podemos incluir a chave primária da relação funcionario
como chave estrangeira na tabela departamento
, nomeando essa chave como cpf_gerente
. Além disso, o atributo inicio
do relacionamento também é incluído na tabela departamento
. Assim ficamos com a tabela mostrada na Figura 9.16.
9.1.4.4. Mapeamento dos tipos de relacionamento binário 1:N
Para cada tipo de relacionamento \(R\) binário 1:N, devemos identificar a relação (tabela) \(S\) que representa o tipo de entidade participante do lado N. Iremos incluir como chave estrangeira em \(S\) a chave primária da relação (tabela) \(T\) que representa o outro tipo de entidade do relacionamento (lado 1).
Esse mapeamento é necessário pois uma instância do lado N estará associada a no máximo uma entidade do lado 1. Os atributos simples do relacionamento também são colocados como colunas na relação (tabela) \(S\).
No diagrama da Figura 9.13, vamos usar essa estratégia para os seguintes tipos de relacionamento:
No tipo de relacionamento
Trabalha
, envolvendoFuncionario
eDepartamento
(Figura 9.17),a chave primária da relação
departamento
(codigo
) será incluída como chave estrangeira da relaçãofuncionario
, sendo nomeadacodigo_departamento
(Figura 9.18).No tipo de relacionamento
Controla
, envolvendoDepartamento
eProjeto
(Figura 9.19),a chave primária da relação
departamento
(codigo
) será incluída como chave estrangeira da relaçãoprojeto
, sendo nomeadacodigo_departamento
(Figura 9.20).No tipo de relacionamento
Supervisiona
, envolvendo o próprio tipo de entidadeFuncionario
(Figura 9.21),a chave primária da relação
funcionario
(cpf
) será incluída como chave estrangeira nela mesmo, com o nomecpf_supervisor
(Figura 9.22).Nota
Este tipo de relacionamento também é conhecido como auto-relacionamento.
9.1.4.5. Mapeamento dos tipos de relacionamento binário M:N
Para cada tipo de relacionamento binário \(R\) M:N, devemos criar uma relação \(S\) para representar \(R\). As chaves primárias das relações (tabelas) que representam os tipos de entidades envolvidas no relacionamento devem ser incluídas em \(S\) como chaves estrangeiras. A combinação das chaves estrangeiras formam a chave primária de \(S\). Também devemos incluir os atributos simples de \(R\) como colunas de \(S\). Esse tipo de relacionamento (M:N) necessariamente precisa de uma tabela auxiliar devido à cardinalidade do relacionamento envolvido.
No diagrama da Figura 9.13, vamos usar essa estratégia para o tipo de relacionamento Trabalha
, envolvendo Funcionario
e Projeto
(Figura 9.23).
Assim, teremos a nova relação funcionario_projeto
mostrada na Figura 9.24. Repare que as chaves primárias das relações representando os dois tipos de entidade participantes do relacionamento foram incluídas como chaves estrangeiras para as respectivas tabelas e, juntas, formam a chave primária composta. Além disso, o atributo horas
foi incluído como coluna nessa tabela.
9.1.4.6. Mapeamento dos atributos compostos
Geralmente, nos bancos de dados relacionais, definimos tabelas com tipos simples, como números inteiros, reais, strings, data e hora, entre outros. No PostgreSQL podemos criar um tipo composto através do comando CREATE TYPE
, para materializar atributos compostos. No entanto, a maior parte das aplicações acaba utilizando uma outra estratégia para implementação dos atributos compostos, que é a decomposição em colunas de tipos elementares. Portanto, no mapeamento ER-Relacional, para cada atributo composto devemos decompô-lo em colunas com tipos simples.
No diagrama da Figura 9.13, o atributo endereco
do tipo de entidade Funcionario
dará origem às colunas logradouro
, num_logradouro
, bairro
, cidade
e cep
(Figura 9.25).
9.1.4.7. Mapeamento dos atributos multivalorados
No PostgreSQL temos um tipo que permite materializar atributos multivalorados diretamente, que é o tipo array
. No entanto, a maior parte das aplicações acaba utilizando uma outra estratégia para implementação dos tipos multivalorados, que é a criação de uma relação auxiliar (tabela auxiliar). Portanto, no mapeamento ER-Relacional, para cada atributo multivalorado devemos criar uma relação \(R\), que conterá uma coluna para representar o atributo e uma coluna que será uma chave estrangeira associada à chave primária da relação de origem do atributo multivalorado. A chave primária de \(R\) é a combinação da chave estrangeira com a coluna representando o atributo. Se o atributo for composto, usamos as colunas necessárias para formar a chave primária.
No diagrama da Figura 9.13, o atributo telefone
do tipo de entidade Funcionario
dará origem a uma relação chamada funcionario_telefone
, com a chave primária formada pelo número do telefone e a chave estrangeira cpf
(Figura 9.26).
O atributo multivalorado enderecos
do tipo de entidade Fornecedor
(Figura 9.13), dará origem a uma relação chamada fornecedor_endereco
com as colunas cnpj
, logradouro
, num_logradouro
, bairro
, cidade
e cep
(Figura 9.27). A chave primária nesse caso poderia ser formada pelo cnpj
e os campos logradouro
e num_logradouro
. Além disso, a coluna cnpj
é uma chave estrangeira.
9.1.4.8. Mapeamento dos tipos de relacionamento n-ário
No caso de um relacionamento \(n\text{-ário}\) \(R\), com \(n > 2\), devemos criar uma relação \(S\) para representar \(R\). Essa relação deverá incluir como chaves estrangeiras todas as chaves primárias das tabelas representando os tipos de entidades participantes do relacionamento. Também devemos incluir os atributos simples que façam parte do tipo de relacionamento. A chave primária de \(S\) será formada pela combinação de todas as chaves estrangeiras que referenciam as relações representando os tipos de entidades participantes que possuem cardinalidade maior que 1.
No tipo de relacionamento Fornece
(Figura 9.28),
criaremos uma relação chamada `` projeto_peca_fornecedor`` (Figura 9.29), com as chaves estrangeiras numero_projeto
, numero_peca
e cnpj_fornecedor
. Mas como a cardinalidade do tipo de entidade Fornecedor
é 1, a chave primária será formada apenas pelas colunas numero_projeto
e numero_peca
. Além disso, acrescentaremos colunas para os atributos quantidade
e valor
das peças fornecidas para o projeto.