Banco de dados: Modelo conceitual
Tags: database, beginners, sql, data
Published: 2024-06-03 14:11:51

**Disclaimer:** Post com intuito de gravar meu aprendizado em banco de dados. Não é uma verdade absoluta.

**Referência:** Sistemas de banco de dados, 7ª edição - _Navathe_ e _Elmasri_

---

1. [Conceitos iniciais](#conceitos-iniciais)

2. [Modelo conceitual](#modelo-conceitual)    

    2.1 [Entidades](#entidades)
    2.2 [Atributos](#atributos)
    2.3 [Relacionamentos](#relacionamentos)

3. [Superclasse e subclasse](#superclasse-e-subclasse)

    3.1 [Especialização](#especialização)
    3.2 [Generalização](#generalização)
    3.3 [Restrições](#restrições)

---

### Conceitos iniciais

**Modelo de dados:** Mostra toda a estrutura (tipos, relacionamentos, restrições) de um banco de dados, abstraindo em recursos essenciais para que diferentes pessoas sejam capazes de entender. 

**Alguns dos modelos mais conhecidos:** Modelo conceitual e modelo físico.

**1. Modelo conceitual:** Modelo de alto nível, tendo o foco usuários finais. Ou seja, não vai haver um aprofundamento em pontos mais técnicos (para programadores, DBAs), mas sim em entidades, atributos, restrições e relacionamentos.

**2. Modelo físico:** Modelo de baixo nível que descreve mais a fundo sobre como os dados serão armazenados (formato de registro, caminhos de acesso) e o foco são pessoas técnicas.

Existe o modelo **representativo** - ou **implementação** - que é o meio termo entre o conceitual e o físico. Aqui há um aprofundamento sobre os dados, mas ainda sim diferentes tipos de usuários podem ser capazes de compreender.

**Esquema (descrição) de banco de dados:** Diz respeito a esquematização de restrições lógicas, nome de tabelas, campos das tabelas e seus tipos. Um esquema não deve ser alterado com frequência, apenas quando há mudanças de requisitos no projeto - chamado de **evolução do esquema** -

Um banco de dados tem **estados**, eles são:

* **Estado vazio:** Esquema sem nenhum registro inserido nele.
* **Estado inicial:** Quando uma carga é feita na tabela

Todo banco em determinado tempo terá seu estado atual, com os registros atuais, porém o estado do banco se altera a cada nova inserção, atualização ou exclusão de registros.

Com isso, o SGBD tem que **garantir** o **estado válido** dos registros, ou seja, garantir que tudo esteja de acordo com a estrutura e restrições do esquema.

Obs: Os registros são também chamados de instância dos objetos (entidades) ou ocorrências.  

---

### Modelo conceitual 

O modelo conceitual trabalha com três bases: **entidade, atributos e relacionamentos**


![Primeiro desenho é o símbolo de um atributo simples, oval com uma linha. O segundo é o símbolo de um atributo multivalorado, oval dupla. O terceiro é o símbolo de uma entidade, um retângulo.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hg0q2us8kfwehnkoaez0.png)

#### Entidades: 
É o objeto. Ex: Usuário, Departamento, Empresa e etc

#### Atributos: 
São as propriedades (características) que descrevem esse objeto. Ex: Usuário -> Nome, CPF, E-mail.

Os atributos podem ser de diversos tipos, entre eles:

* **Composto** ou **Simples (Atômico):** Atributos compostos são aqueles que podem ser sub-divididos (quebrados) em partes até serem atributos não divisíveis. Então um atributo simples é um atributo que não é divisível.


![Imagem do atributo endereço que é composto e tem atributos simples (cidade e estado) e um outro atributo composto logradouro que se divide em rua, bairro e número](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ejgyb72g572k1qq87nd7.png)

Não é obrigatório destrinchar os atributos compostos. Se um atributo for referenciado como um todo ou não especificado, é possível manter como um atributo simples.

![Imagem do atributo Nome que pode ser composto e se dividir em primeiro nome, nome do meio e sobrenome](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f5guopd6kxo23zsluya1.png)

No exemplo acima, o atributo "Nome" pode ser composto, mas também pode ser referenciado como atributo simples e agrupar os outros atributos. Ex: Nome: Josué Henrique Santos.

* **Valor único** ou **Multivalorado:** Um atributo de valor único é aquele atributo que recebe apenas um valor, enquanto o multivalorado pode ter um conjunto de valores, além de poder estabelecer uma restrições do mínimo e do máximo de valores possíveis.

Ex: Uma pessoa tem apenas uma idade, por isso o atributo "Idade" é valor único.

Ex²: Uma pessoa pode ter zero, uma ou mais graduações, por isso o atributo "Formação" é multivalorado. Além disso, poderia colocar que o máximo de valores possíveis é 3.

* **Derivado** ou **Armazenado:** Um atributo derivado é aquele que deriva de um atributo armazenado. Também podendo derivar de outra entidade relacionada.

Ex: Eu tenho o atributo "Idade", onde o valor dele é feito através do cálculo do dia atual com o valor do atributo "Data de nascimento". Ou seja, o atributo "Idade" é derivado, pois deriva do atributo "Data de nascimento", este sendo o atributo armazenado. 

As entidades podem ter um ou mais atributos que são **atributos chaves** que tem o objetivo de identificar, de forma única, cada entidade.

Um atributo sozinho pode ser um atributo chave, porém dois ou mais atributos podem formar uma chave (as combinaçãos delas devem ser **únicas**)


![Uma entidade com um atributo chave chamado "registro" que é formado pelos atributos simples: estado e número](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlspt8p2fejqggrw3yeg.png)

Na imagem acima, o atributo chave "Registro" é formado pela combinação dos atributos simples, "Estado" e "Número". Esse tipo também é chamado de **atributo chave composto.**

* Uma entidade pode ter nenhuma chave e é chamada de entidade fraca.

**Exemplo do que foi descrito até agora:**


![Entidade departamento tem cinco atributos, sendo dois atributos-chave (nome e número), um atributo multivalorado (localizações), um que é derivado (gerente) e outro que é a data de início que esse gerente começou a atuar](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1968pbqc7hq6ynw7mucj.png)

* Uma entidade departamento tem cinco atributos, sendo dois atributos-chave (nome e número), um atributo multivalorado (localizações), um que é derivado (gerente) e outro que é a data de início que esse gerente começou a atuar  

#### Relacionamentos: 
Na fase inicial de um modelo ER, os relacionamentos existentes entre as entidades não precisam estar explícitos, pois isso é refinado durante a evolução do modelo.

Existem alguns tipos de relacionamentos, entre eles o relacionamento **binário** (que é o mais comum) e o **terciário**, que corresponde a quantas entidades estão relacionadas. (Há relacionamentos mais complexos)

Além disso, existe o relacionamento que é feito entre a mesma entidade. Ex: Um funcionário é supervisionado por outro funcionário. Nesse caso o relacionamento que existe é **autorrelacionado/recursivo.**

![Três exemplos de visualizar o autorrelacionamento. O padrão, o de pé de galinha e usando conjuntos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2773euashchxp8c4w588.png)

Há uma **restrição estrutural** que é a **restrição de participação** onde os relacionamentos entre as entidades podem ter uma **dependência de existência** ou não.

* **Participação total:** Também conhecida como dependência de existência, a participação total é quando a existência de uma entidade depende dela estar ligada com outra. — **Todas as instâncias precisam estar no relacionamento**

Ex: Todo funcionário precisa trabalhar para um departamento. Ou seja, é obrigatório que todas as instâncias do 'Funcionário' participem (estejam ligados) a uma instância de 'Departamento'.

![Entidade 'Funcionario' ligado a entidade 'Departamento' com linha dupla, que significa dependência total](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqer4bl33y6k0vm9g5b7.png)

A linha dupla representa que no relacionamento entre as entidades há a dependência total/de existência.

* **Participação parcial:** Quando nem todas as instâncias de uma entidade precisam estar ligada com outra.

Ex: Um funcionário pode gerenciar um departamento ou nenhum,

![Entidade 'Funcionario' ligado a entidade 'Departamento' com linha simples, que significa dependência parcial](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/75ua0h9bh4t5u59myr2d.png)

Os relacionamentos com participação parcial mantém a linha simples.

* **Cardinalidades:**

1. **1:1 - Um para Um:** Uma instância da entidade A está, no **máximo**, associada a uma instância da entidade B (e vice versa)


* Ex: Uma pessoa está associada a apenas um CPF como documento oficial.

Nesse caso, o atributo desse relacionamento pode estar na entidade 'Pessoa' ou na entidade 'Documento', por exemplo. 

![Entidade 'Pessoa' e entidade 'Documento' com cardinalidade 1:1 e o atributo PESSOA_ID estando na entidade 'Documento'](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5rhwkwja2eanv4vuy0t.png)

2.**N:1 ou 1:N - Um para Muitos:** Quando uma instância de uma entidade A pode estar associada a zero, uma ou várias instâncias de uma entidade B, porém uma instância da entidade B só pode estar associada a, no máximo, uma instância da entidade A.

* Ex: Um departamento pode ter vários funcionários enquanto um funcionário só pode pertencer a um departamento. 

Nesse caso, o atributo relacionado fica, **somente**, na entidade com o lado **N** do relacionamento.

![Entidade 'Funcionario' e entidade 'Departamento' com cardinalidade 1:N e o atributo DEPARTAMENTO_ID na entidade 'Funcionario'](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7fawsn1a0p1azdwtweyc.png)

3.**N:M ou N:N - Muitos para muitos:** Várias instâncias de uma entidade A podem estar relacionadas a várias instâncias de uma entidade B (e vice-versa).

* Ex: Um autor pode escrever vários livros e vários livros podem ser de um mesmo autor.

Nesse caso, os atributos de relação são a **combinação das entidades** e **precisa** ter uma entidade intermediária.


![Entidade 'Livro' e entidade 'Autor' com cardinalidade N:N, onde gerou a entidade 'Livro_Autor' que contém o ID_AUTOR e ID_LIVRO](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uq60fqtr6kg7zyfvfv38.png)

Durante o processo de modelagem de um banco de dados, atributos definidos no refinamento inicial pode se tornar uma entidade independente. Uma forma de avaliar isso é vendo se um atributo está presente em N entidades, dessa forma é possível criar uma entidade independente e evitar a redundância dos dados.

Da mesma forma que o inverso pode ser feito. Uma entidade estabelecida no refinamento inicial pode se tornar um atributo, se essa entidade estiver relacionada a apenas uma entidade, por exemplo, ela pode se tornar um atributo dessa outra entidade.

---

### Superclasse e subclasse

Também conhecido como supertipo e subtipo, esse conceito diz que um conjunto pode ter **subconjuntos** associados. 

Quando há necessidade, uma entidade é criada para explicitar esse subagrupamento:


![Entidade Funcionário com ligação as entidades Secretária, Gerente e Técnico](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/460j6drxe5u0lavmwevh.png)

No exemplo acima, o funcionário é a superclasse e a secretária, técnico e gerente são as subclasses. 

Uma subclasse não pode existir sem estar relacionada a uma superclasse. Ex: Não é possível existir uma secretária sem ser membro da superclasse 'Funcionário'.

Ou seja, uma entidade de subclasse pertence a entidade de subclasse e também a de superclasse. Então o subtipo herda os atributos de entidade do supertipo.

#### Especialização

Um conjunto de subtipos pode ser a especialização de um supertipo. Ex: Pode haver uma especizalição por 'tipo_cargo' da entidade base 'Funcionário'.


![Supertipo 'Funcionário' com uma linha ligando a um círculo com a letra 'd' no meio e duas linhas, com o símbolo U no meio, desse círculo conectando as entidades de subtipo 'Técnico' e 'Secretária' e ao lado uma ligação de 'Funcionário' com o subtipo 'Gerente', onde nesse caso só utiliza a linha com U](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9gw797jem9peihyhuwye.png)

Os subtipos podem ter atributos normalmente, esses atributos são chamados de **atributos específicos (ou locais)**, além de que subclasses podem participar de **relacionamentos específicos**.

#### Generalização

A generalização é o processo contrário da especialização. Quando entidades tem vários atributos comuns, é possível generalizar esses atributos em uma entidade (que se torna uma superclasse).

Ex: As entidades 'Carro' e 'Caminhão' pode fazer surgir a entidade 'Veiculo', que é uma entidade generalizada e a superclasse dessas outras entidades.

Ou seja, no final pode-se olhar o processo como generalização/especialização, pois no final do processo ela se complementa. O que diferencia é a motivação/objetivo inicial da modelagem.

#### Restrições

* **Subclasse definida por predicado:** As subclasses são determinadas através de um atributo na superclasse. Ex: A entidade 'Funcionário' tem um atributo chamado 'tipo_emprego' que determina se o funcionário é do tipo 'Técnico', 'Secretária' etc.

* **Definida pelo usuário:** Quando não se tem uma condição explícita para se definir. A separação depende dos usuários do banco de dados no processo da operação de inserção de uma entidade.

* **Restrição de disjunção (desconexão):** As subclasses devem ser **disjuntas**, ou seja, devem pertencer a, **no máximo**, uma subclasse. 

Se as subclasses não forem disjuntas, pode se ter a sobreposição, onde é possível ser membro de mais de uma classe.


![Entidade superclasse 'Peça' que tem uma linha dupla ligado a um círculo com um 'o' de overlapping dentro e duas linhas distintas partindo desse círculo e ligando as entidades 'P_Fabricada' e 'P_Comprada'](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phqujek2pjbbb4hzpooe.png)

Quando há a letra o dentro círculo, significa o overlapping.

A linha dupla vem do conceito a seguir:

* **Restrição de completude:** A restrição de completude pode ser parcial ou total.

Quando **total**, significa que **toda** entidade da superclasse precisa ser membro de pelo menos uma subclasse da especialização. Por isso a linha dupla.

A restrição **parcial** significa que uma entidade **pode** não pertencer a nenhuma subclasse.

! Quando houver uma operação de exclusão de entidade da superclasse, isso implica que a entidade na subclasse também seja deletada.