| 
 | 
 | 
| [Home](home) | [Convenções e Diretrizes](Convenções e Diretrizes) | [Tecnologias](Tecnologias) | [Banco de dados](Banco de Dados) | 
 | 
| 
 | 
 | 
| --- | --- | --- | --- |
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
O banco de dados escolhido foi o PostgreSQL que roda dentro de um container Docker, o que garante que todos os desenvolvedores possuam o mesmo ambiente. Foi escolhido o banco de dados relacional devido a integridade e coesão que os dados devem apresentar entre si para que sejam utilizados e manipulados ao longo da aplicação. Além disso, a nível de código, foi utilizada a biblioteca SQLAlchemy, responsável por facilitar o mapeamento das entidades como classes de Python. 
 | 
| 
 | 
 | 
Para o banco de dados do projeto Vincula, foram unidos dois sistemas de banco de dados: PostgreSQL e Neo4J. Ambos rodam dentro de um container Docker, o que garante que todos os desenvolvedores possuam o mesmo ambiente. Foi escolhido o banco de dados relacional devido a integridade e coesão que os dados devem apresentar entre si para que sejam utilizados e manipulados ao longo da aplicação. Foi somado a ele um banco de dados não relacional, o Neo4J, que é um banco de dados orientado a grafo, o que facilita a criação dos grafos de vínculos entre os dados de uma investigação. Além disso, a nível de código, foi utilizada a biblioteca SQLAlchemy, responsável por facilitar o mapeamento das entidades como classes de Python. 
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
Em relação a modelagem, existem oito tabelas que se relacionam no projeto conforme a imagem abaixo. 
 | 
| 
 | 
 | 
Em relação a modelagem, existem cinco tabelas no banco de dados relacional e mais duas entidades centrais para o banco não relacional que se interconectam no projeto conforme a imagem abaixo. 
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
### Tabelas PostgreSQL:
 | 
| 
 | 
 | 
- **User:** armazena as informações sobre os usuários da aplicação. Possui campo de _id _(chave primária), _name_, _password_ e _role_(indica o cargo do usuário no sistema e vai ser usado para níveis de permissão na aplicação)
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Case:** armazena as informações de cada caso a ser investigado. Possui campo de _id _(chave primária), _case_number _(utilizado pelo MP para identificar um caso), _name_, _description_, _status_, _creation_date_, _update_date_ e _owner_ (indica quem é o dono do caso, pois é uma chave estrangeira para a tabela de User).
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Archive:** armazena as informações dos arquivos submetidos pelo usuário para poderem compor o caso. Possui campo de _id_ (chave primária), _url_ (vai indicar o arquivo em si), _creation_date_ e _case_id_ (relaciona o arquivo com o caso do qual faz parte)
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Suspect:** são as pessoas suspeitas de um caso. Possui _id_ (chave primária), _name_, _cpf_cnpj_, _phone_number_ e _case_id_ (para poder relacionar o registro com o caso do qual faz parte)
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Analyzed_person:** é uma tabela auxiliar para armazenar os dados de pessoas ou empresas citadas ao longo dos arquivos de fontes externas, como o simba, sittel e o rif. Possui atributo de _id_ (chave primária), _cpf_cnpj_, _name_, _phone_, _address_.
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Data_simba_detailed_extract:** armazena as informações provenientes do SIMBA. Possui atributo de _id_ (chave primária), _fk_analysed_person_ (chave estrangeira para tabela de analyzed_person), _name_ e _fk_archive_id_ (chave estrangeira para a tabela de Archive).
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Data_sittel:** armazena as informações provenientes do SITTEL. Possui atributo de _id_ (chave primária), _originating_number_ (número que fez a ligação), _destination_number_ (número que recebeu a ligação), _fk_subscriber_origin_ (relaciona na tabela de analyzed_person quem é o dono da linha que fez a ligação), _fk_assigned_origin_ (relaciona na tabela de analyzed_person quem foi a pessoa que de fato fez a ligação), _fk_subscriber_destination_  (relaciona na tabela de analyzed_person quem é o dono da linha que recebeu a ligação), _fk_assigned_destination_ (relaciona na tabela de analyzed_person quem é que de fato recebeu a ligação), _fk_archive_id_ (chave estrangeira para a tabela de Archive).
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Data_riffs:** armazena as informações provenientes do RIF. Possui atributo de _id_ (chave primária), _indexer_, _rif_number_, _name_involved_, _fk_analysed_person_ (chave estrangeira para tabela de analyzed_person), _type_envolved_, _fk_archive_id_ (chave estrangeira para a tabela de Archive).
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
- **Archive:** armazena as informações dos arquivos submetidos pelo usuário para poderem compor o caso. Possui campo de _id_ (chave primária), _url_ (vai indicar o arquivo em si), _creation_date_ e _case_id_ (relaciona o arquivo com o caso do qual faz parte)
 | 
| 
 | 
 | 

 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **User_Case:** é uma tabela auxiliar para identificar quais usuário estão presentes em qual caso, com atributo de ID (chave primária), case_id (chave estrangeira para a tabela de casos), user_id (chave estrangeira para a tabela de usuários) e creation_date (registro de qual essa ligação foi feita).
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
### Entidades Neo4J:
 | 
| 
 | 
 | 
- **Case:** é um nó que representa um caso investigativo. Cada caso é identificado pelo seu case_number, e inclui informações sobre: origem (tipo do arquivo: SIMBA, SITTEL ou RIF), lista de arquivos nos quais o caso foi identificado (file_name[]), e identificador do caso no sistema relacional (vincula_case_id), que corresponde diretamente ao campo CASE.id no PostgreSQL.
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Person:** é um nó representa um sujeito envolvido nos casos, podendo ser uma pessoa física ou jurídica. Cada nó de pessoa inclui atributos como: identity (CPF, CNPJ), name (nome do titular, investigado ou entidade), phone_number[] (número de telefone encontrado nos dados), e file_name[] (arquivos em que a pessoa aparece), e vincula_case_id (referência ao caso correspondente no sistema relacional).
 | 
| 
 | 
 | 
 | 
| 
 | 
 | 
- **Involved_in:** é uma aresta que conecta entidades do grafo e indica a relação de envolvimento de uma pessoa em um caso. | 
 | 
 | 
\ No newline at end of file |