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.

Modelo Entidade Relacionamento (ER) - Empresa

Figura 9.13 - Modelo Entidade Relacionamento (ER) - Empresa.
Adaptado de [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.

Mapeamento de Tipos de Entidades Fortes em tabelas no modelo relacional

Figura 9.14 - Mapeamento de tipos de entidade forte em tabelas no modelo relacional.

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.

Mapeamento de tipos de entidade fraca em tabelas no modelo relacional

Figura 9.15 - Mapeamento de tipos de entidade fraca em tabelas no modelo relacional.

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 de S quanto a de T. 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.

Mapeamento de tipos de relacionamento binário 1:1

Figura 9.16 - Mapeamento de tipos de relacionamento binário 1:1.

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, envolvendo Funcionario e Departamento (Figura 9.17),

    Trabalha - Tipo de relacionamento binário 1:N

    Figura 9.17 - Trabalha - Tipo de relacionamento binário 1:N.


    a chave primária da relação departamento (codigo) será incluída como chave estrangeira da relação funcionario, sendo nomeada codigo_departamento (Figura 9.18).

    Mapeamento de tipos de relacionamento binário 1:N

    Figura 9.18 - Mapeamento de tipos de relacionamento binário 1:N.

  • No tipo de relacionamento Controla, envolvendo Departamento e Projeto (Figura 9.19),

    Controla - Tipo de relacionamento binário 1:N

    Figura 9.19 - Controla - Tipo de relacionamento binário 1:N.


    a chave primária da relação departamento (codigo) será incluída como chave estrangeira da relação projeto, sendo nomeada codigo_departamento (Figura 9.20).

    Mapeamento de tipos de relacionamento binário 1:N

    Figura 9.20 - Mapeamento de tipos de relacionamento binário 1:N.

  • No tipo de relacionamento Supervisiona, envolvendo o próprio tipo de entidade Funcionario (Figura 9.21),

    Supervisiona - Tipo de relacionamento binário 1:N

    Figura 9.21 - Supervisiona - Tipo de relacionamento binário 1:N.


    a chave primária da relação funcionario (cpf) será incluída como chave estrangeira nela mesmo, com o nome cpf_supervisor (Figura 9.22).

    Mapeamento de tipos de relacionamento binário 1:N

    Figura 9.22 - Mapeamento de tipos de relacionamento binário 1:N.


    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).

Trabalha - Tipo de relacionamento binário M:N

Figura 9.23 - Trabalha - Tipo de relacionamento binário M:N.

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.

Mapeamento de tipos de relacionamento binário M:N

Figura 9.24 - Mapeamento de tipos de relacionamento binário M:N.

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).

Mapeamento do atributo composto endereco do tipo de entidade Funcionario

Figura 9.25 - Mapeamento do atributo composto endereco do tipo de entidade Funcionario.

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).

Mapeamento do atributo multivalorado telefone do tipo de entidade Funcionario

Figura 9.26 - Mapeamento do atributo multivalorado telefone do tipo de entidade Funcionario.

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.

Mapeamento do atributo multivalorado enderecos do tipo de entidade Fornecedor

Figura 9.27 - Mapeamento do atributo multivalorado enderecos do tipo de entidade Fornecedor.

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),

Fornece - Tipo de relacionamento ternário

Figura 9.28 - Fornece - Tipo de relacionamento ternário.

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.

Mapeamento de tipos de relacionamento ternário

Figura 9.29 - Mapeamento de tipos de relacionamento ternário.

9.1.4.9. Modelo Lógico Relacional

Modelo Lógico Relacional

Figura 9.30 - Modelo Lógico Relacional.