Pular para o conteúdo principal

Base de Dados

Modelos de Base de Dados

Relacional

Fundamentado por E.F. Codd (1970), cuja proposta envolve uma abordagem intuitiva e direta para representar dados, o modelo relacional permite a representação eficaz de relações entre os dados, facilitando consultas complexas e garantindo a integridade dos dados.

No modelo relacional, os dados são organizados em tabelas (entidades e relações), compostas por colunas e linhas ('tuplas'), com valores de identificação únicos para cada linha (chaves primárias). Cada linha da tabela tem o mesmo conjunto de colunas nomeadas e cada coluna possui um tipo de dado específico. As chaves que identificam as linhas são usadas para definir as relações entre as tabelas.

As tabelas em modelos relacionais possuem relações entre si de um para um, um para muitos e muitos para muitos. Geralmente, uma relação de muitos para muitos é implementado com uma tabela adicional (tabela de associação), contendo as chaves primárias das tabelas envolvidas na relação.

Figura 1 -Exemplo de tabelas organizadas num Modelo Relacional
Figura 1 -Exemplo de tabelas organizadas num Modelo Relacional

Entre os Sistemas de Gestão de Bases de Dados Relacionais (SGBDR) mais conhecidos estão o PostgreSQL, Oracle, MySQL, Microsoft SQL Server, IBM DB2 e o SQLite.

Orientado a Objetos

Num modelo orientado a objetos, os dados são representados como objetos, seguindo os princípios da programação orientada a objetos. Esta abordagem encapsula dados e comportamentos em entidades, promovendo a modularidade e a reutilização.

Um objeto é uma instância de uma classe (entidade), que possui atributos (dados), métodos (ações) e associações (relações entre as classes).

Exemplos incluem CACHE, ZOPE e GemStone.

Objeto-Relacional

O modelo objeto-relacional, ou modelo relacional estendido, combina características dos modelos relacional e orientado a objetos. Mantendo a eficiência dos dados em tabelas que se relacionam, estes modelos incorporam funcionalidades de orientação a objetos, como herança e tipos personalizados.

PostgreSQL

O PostgreSQL, componente principal do PostgreSYS, é um SGBD de código aberto amplamente reconhecido pela sua robustez e versatilidade. Surgiu a partir do projeto Postgres, desenvolvido pelo Departamento de Ciência da Computação da Universidade da Califórnia, e evoluiu para suportar uma ampla gama de funcionalidades, incluindo:

  • Conformidade com SQL e Recursos Avançados: o PostgreSQL não só cumpre a maior parte do padrão SQL, mas também oferece recursos avançados para consultas complexas, chaves estrangeiras, transações, vistas, triggers e procedimentos armazenados. Isso torna o PostgreSQL extremamente flexível e poderoso para diversos casos de uso.

  • Extensibilidade e Suporte a Tipos de Dados Personalizados: Uma das características notáveis do PostgreSQL é a sua extensibilidade. Os usuários podem definir os seus próprios tipos de dados, índices personalizados, podendo inclusive escrever funções em diferentes linguagens de programação. Essa extensibilidade permite que ele seja adaptado para atender às necessidades específicas de quase qualquer aplicação de base de dados.

  • Robustez e Confiabilidade: O PostgreSQL é conhecido pela sua alta estabilidade e confiabilidade. Ele possui recursos como a capacidade de lidar com grandes volumes de dados, um sistema de transação ACID (Atomicidade, Consistência, Isolamento, Durabilidade) robusto e um forte mecanismo de recuperação após falhas. Essas características fazem dele uma escolha confiável para sistemas críticos.

  • Segurança e Conformidade: O PostgreSQL oferece uma excelente segurança de dados. Ele suporta autenticação forte, controlo de acesso granular, encriptação de dados em repouso e em trânsito e muitas outras funcionalidades de segurança. Isso torna o PostgreSQL adequado para aplicações onde a segurança dos dados é uma grande preocupação.

  • Liberdade Tecnológica: PostgreSQL é um software de código aberto distribuído sob a PostgreSQL License, uma licença de software livre. Essa licença é semelhante à licença MIT em termos de permissividade. Ela permite a liberdade de usar, modificar, distribuir e estudar o software sem preocupações sobre o pagamento de licenças ou restrições de uso impostas pelo fornecedor. Esta característica torna o PostgreSQL particularmente atraente para empresas e desenvolvedores que desejam um sistema de gestão de base de dados poderoso sem os custos de licenciamento associados a muitos outros produtos de base de dados. A natureza livre da licença também estimula uma comunidade vibrante e ativa, que contribui constantemente para a evolução e melhoria do PostgreSQL.

Com mais de 30 anos de desenvolvimento e evolução contínua, o PostgreSQL é adotado por diversos sectores em todo o mundo e considerado a escolha certa para ambientes de bases de dados que exigem grande confiabilidade, robustez e desempenho.

De acordo com o site db-engines.com, em dezembro de 2023, o PostgreSQL era o segundo SGBD de código aberto mais utilizado do mundo e o quarto mais popular.

Figura 2 - Ranking dos SGBD por popularidade
Figura 2 - Ranking dos SGBD por popularidade

Arquitetura

Nesta seção exploramos os principais conceitos presentes na arquitetura do PostgreSQL, ilustrada na imagem a seguir.

Figura 3 -Arquitetura do PostgreSQL
Figura 3 -Arquitetura do PostgreSQL

Cliente

Representa sistemas e aplicações que se conectam à base de dados para executar operações, como interfaces de linha de comando, aplicações web, ferramentas de monitorização, etc.

Servidor

Representa a instância de base de dados PostgreSQL, contemplando processos, áreas de memória, diretórios e ficheiros.

Processos

  • Postgres: O Postgres, ou postmaster, éprincipal processo do serviço da instância PostgreSQL. Iniciado em 'foreground' ao iniciarmos o cluster, é responsável por gerenciar os processos utilitários e por escutar as solicitações de conexão dos clientes, criando um novo processo de backendpara cadaconexão.

  • WAL Writer: O WAL Writer é um processo em background que escreve periodicamente registos do WAL da memória para o disco. Esse processo é essencial para garantir a durabilidade das transações e ajudar na eficiência do sistema, reduzindo a carga de I/O durante as operações de checkpoint. Ele assegura que os dados críticos sejam guardados continuamente.

  • Archiver: O Archiver é um processo em background responsável por arquivar os WAL para um local seguro. Isso é crucial para a recuperação de desastres e replicação. O Archiver é activado quando o WAL chega ao fim dum segmento e precisa ser armazenado de forma persistente.

  • WAL Sender: O WAL Sender é um processo em background dedicado à replicação. Ele é responsável por enviar registos do WAL para os servidores de réplica num ambiente de replicação assíncrona ou síncrona. Este processo é crucial para garantir a consistência de dados e a alta disponibilidade em configurações de base de dados distribuídos.

  • WAL Receiver: O WAL Receiver é um processo em background executado em servidores de réplica. Ele recebe registos do WAL enviados pelo processo WAL Sender do servidor primário. Esse processo é essencial para manter a réplica actualizada, aplicando as alterações da base de dados primária ao secundário em configurações de replicação síncrona ou assíncrona.

  • Background Worker (BgWorker): O Background Worker é um processo projectado para executar diversas tarefas em background. Ele é essencial para a execução de módulos externos, permitindo a extensão de funcionalidades da base de dados. Além disso, é um componente chave para o paralelismo de consultas, possibilitando uma melhoria significativa no desempenho do ambiente ao distribuir o processamento de consultas complexas por múltiplos núcleos ou processadores.

  • Background Writer (BgWriter): O Background Writer é um processo em background responsável por escrever gradualmente as páginas de memória modificadas ('dirty pages') para o disco. Esta ação é fundamental para distribuir a carga de I/O ao longo do tempo, melhorando o desempenho durante os checkpoints e garantindo a integridade e a segurança dos dados, reduzindo o risco de perda em caso de falhas do sistema.

  • Checkpointer: O Checkpointer é um processo em background responsável pela gestão de 'checkpoints', ou seja, pontos consistentes de sincronização da instância de base de dados no disco. Durante um checkpoint, as páginas de dados modificadas ('dirty pages') são escritas no disco, assim como os WALs, e o ficheiro pg_control é actualizado para reflectir o novo estado consistente. Isso assegura a integridade dos dados, a durabilidade das transações e permite a recuperação da instância de base de dados em caso de falha.

  • Autovacuum: O Autovacuum é um processo essencial para recuperar o espaço ocupado por tuplas obsoletas nos ficheiros de dados das tabelas, resultantes de operações de atualização e exclusão. O autovacuum trabalha continuamente em background, monitorizando as tabelas para identificar a necessidade de manutenção e executando-a de forma proactiva para prevenir a degradação do desempenho.

  • Statistics Collector: O Statistics Collector é responsável pela colecta de dados estatísticos da actividade da instância de base de dados, como o número de acessos a tabelas e índices, operações de modificação de dados e informações sobre o uso de recursos do sistema. Essas estatísticas são cruciais para o desempenho de consultas, pois permitem que o optimizador de consultas avalie as estratégias de execução mais eficientes baseando-se no comportamento actual das consultas e na distribuição dos dados. Este processo opera em background e é acedido através de 'views' do sistema, fornecendo aos administradores de base de dados informações valiosas para ajustes e monitorização do ambiente.

Memória

  • Shared Memory: A Shared Memory, ou memória partilhada, é uma área de memória reservada para todos os processos da instância PostgreSQL. Essa memória é utilizada para armazenar estruturas de dados cruciais para a operação do sistema, como buffers de dados, informações de controlo de transações, locks e caches de metadados

    • Shared Buffers: Área da memória partilhada utilizada para armazenar páginas de tabelas e índices lidos do disco. Este cache é partilhado entre os processos do servidor, permitindo que as consultas acedam rapidamente aos dados já carregados para a memória.

    • WAL Buffers: Área da memória partilhada utilizada para armazenar temporariamente os registos de WAL (Write-Ahead Logging) antes de serem escritos no disco.

  • Process Memory ou Backend Memory: Área de memória exclusiva para processos de backend, sejam eles conexões de clientes ou processos utilitários. A quantidade de memória alocada para cada processo é determinada por parâmetros de configuração do servidor.

    • work_mem: Parâmetro de configuração do servidor que determina a quantidade de memória a ser utilizada por operações internas de ordenação (ORDER BY, DISTINCT, MERGE JOINS) e hash antes de recorrer a ficheiros temporários em disco ('spill').

    • temp_buffers: Parâmetro de configuração do servidor que limita o tamanho de buffers temporários, por sessões, usados para tabelas temporárias.

    • maintenance_work_mem: Parâmetro de configuração do servidor que limita a quantidade de memória para operações de manutenção da instância de base de dados, como VACUUM, INDEX REBUILD e ALTER TABLE.

    • autovacuum_work_mem: Parâmetro de configuração do servidor que especifica exclusivamente a quantidade de memória utilizada por cada processo do autovacuum.