Sistemas de Arquivos Tradicionais

// A Era Pré-BD: Desafios de Organização e Confiabilidade

O Armazenamento de Dados no Passado

Antes dos SGBDs se tornarem padrão, os dados eram frequentemente armazenados e gerenciados diretamente por meio de **sistemas de arquivos tradicionais** do sistema operacional. Isso significava usar arquivos simples (como `.txt`, `.csv`, `.dat`) e organizar em pastas. Embora simples para pequenos volumes, essa abordagem logo revelou-se insuficiente para aplicações complexas e grandes volumes de dados.

Principais Limitações e Problemas

A falta de uma camada de gerenciamento robusta nos sistemas de arquivos levava a diversos problemas:

  • Redundância de Dados: O mesmo dado era frequentemente duplicado em múltiplos arquivos e locais. Por exemplo, o endereço de um cliente poderia estar na planilha de vendas e na planilha de suporte, ocupando espaço desnecessário.
  • Inconsistência de Dados: Consequência direta da redundância. Se o endereço de um cliente fosse atualizado em uma planilha, mas não na outra, as informações se tornariam conflitantes. Qual delas seria a "verdade"?
  • Dificuldade de Acesso e Consulta: A recuperação de dados era complexa. Não havia uma linguagem padrão. Era necessário escrever programas específicos para cada nova consulta ou para combinar dados de diferentes arquivos (o equivalente a um "join"). A busca por informações era lenta e ineficiente, especialmente em arquivos grandes.
  • Concorrência Quase Inexistente: Múltiplos usuários tentando acessar e, principalmente, **modificar** o mesmo arquivo simultaneamente aumentavam drasticamente o risco de corrupção de dados ou de sobrescrever alterações alheias. O controle de bloqueio era rudimentar ou inexistente.
  • Segurança Limitada: As permissões de acesso eram a nível de arquivo ou pasta, não de dados específicos. Não era possível, por exemplo, permitir que um usuário lesse apenas o nome de um cliente, mas não seu salário. Criptografia e auditoria eram raros ou complexos de implementar.
  • Problemas de Integridade: Não havia mecanismos embutidos para garantir a validade dos dados (ex: um campo de idade aceitando valores negativos) ou a manutenção de relações lógicas entre dados (ex: um pedido existir sem um cliente associado).
  • Dificuldade de Recuperação: Em caso de falha (queda de energia, erro de software), restaurar os dados de forma consistente e completa era um processo manual, demorado e com alto risco de perda de informações.
cli_user@data_chaos:~#
# Exemplo 1: Redundância e Inconsistência em Arquivos Simples
cat clientes.csv
id,nome,email,telefone
1,João Silva,joao@email.com,9876-5432
2,Maria Souza,maria@email.com,9123-4567

cat pedidos.csv
id_pedido,id_cliente,data,valor,nome_cliente_redundante
P001,1,2025-07-19,150.00,João Silva
P002,2,2025-07-19,200.00,Maria Souza

# Problema de Inconsistência: Se o nome de João mudar, terei que alterar em clientes.csv E pedidos.csv!

# Exemplo 2: Concorrência - Risco de Corrupção em Escrita Simultânea
# Usuário A tenta adicionar um novo cliente:
echo "3,Pedro,pedro@email.com,9555-1111" >> clientes.csv
# Ao mesmo tempo, Usuário B tenta adicionar outro cliente:
echo "4,Ana,ana@email.com,9666-2222" >> clientes.csv
# Sem controle, um pode sobrescrever o outro ou gerar um arquivo corrompido!
          
Atividade Prática: Imagine que você tem dois arquivos CSV: `produtos.csv` (id, nome, preco) e `estoque.csv` (id_produto, quantidade, local).
  1. Escreva um comando de shell (Unix/Linux) para encontrar produtos com "camiseta" no nome e quantidade em estoque maior que 10. (Você terá que simular a junção de dados manualmente).
  2. Discuta como um SGBD resolveria as limitações de "difícil acesso e consulta" e "concorrência quase inexistente" nesse cenário.

Surgimento e Consolidação dos SGBDs

// Da Crise dos Arquivos à Revolução dos Dados

A Resposta aos Desafios: Por Que o SGBD?

A partir da década de 1960, com o aumento da complexidade dos sistemas e do volume de dados, as limitações dos sistemas de arquivos tradicionais (discutidas no slide anterior) tornaram-se insustentáveis. Era evidente a necessidade de uma solução mais robusta, que oferecesse:

  • **Centralização e Controle:** Um único ponto para gerenciar todos os dados da organização.
  • **Independência de Dados:** Separar a forma como os dados são vistos pela aplicação da forma como são armazenados fisicamente.
  • **Integridade:** Garantir que os dados sejam corretos e consistentes.
  • **Segurança:** Controlar o acesso e as permissões de forma granular.
  • **Concorrência:** Permitir acesso simultâneo sem conflitos.
  • **Recuperação:** Restaurar dados após falhas.

Essas necessidades impulsionaram o desenvolvimento dos **Sistemas Gerenciadores de Banco de Dados (SGBDs)**.

Modelos Pioneiros e Marcos Históricos

A jornada dos SGBDs começou com modelos que, embora menos flexíveis que os atuais, foram fundamentais para a sua evolução:

  • **Anos 1960: Modelo Hierárquico (Ex: IBM IMS)**

    Baseado em uma estrutura de árvore, onde cada registro filho tem um único pai. Eficiente para algumas operações, mas inflexível para relações complexas. Foi um dos primeiros SGBDs comerciais de sucesso.

  • **Início dos Anos 1970: Modelo em Rede (Ex: CODASYL DBTG)**

    Uma evolução do hierárquico, permitindo que um registro filho tivesse múltiplos pais, formando uma rede. Mais flexível, mas a navegação ainda era complexa e procedural.

  • **1970: A Revolução do Modelo Relacional (Edgar F. Codd)**

    Proposto por Codd na IBM, o Modelo Relacional simplificou drasticamente a forma de organizar e consultar dados, utilizando o conceito de **tabelas (relações)** com linhas e colunas. Sua base matemática (teoria dos conjuntos) e a subsequente criação da **SQL (Structured Query Language)** tornaram o acesso aos dados muito mais intuitivo e poderoso, definindo o padrão para as décadas seguintes.

  • **1975: C.J. Date publica “Introdução a SGBD”**

    Um marco literário que ajudou a popularizar os conceitos e a importância dos SGBDs.

  • **Anos 1980–1990: Consolidação e Padrão Corporativo**

    Os SGBDs relacionais se tornam o padrão-ouro na indústria. Grandes sistemas como Oracle, IBM DB2 e SQL Server ganham destaque. A SQL se firma como a linguagem universal para bancos de dados, oferecendo consultas simplificadas, controle de concorrência robusto e alta integridade de dados.

sql@db_consolidation:~#
-- Exemplo de como um SGBD garante a integridade de dados (unicidade)
CREATE DATABASE empresa_db;
\c empresa_db
CREATE TABLE clientes (
  id SERIAL PRIMARY KEY,
  nome VARCHAR(100) NOT NULL,
  email VARCHAR(100) UNIQUE
);
-- Inserção bem-sucedida:
INSERT INTO clientes (nome, email) VALUES ('João Silva', 'joao@email.com');
-- Tentativa de inserção com email duplicado (viola UNIQUE):
INSERT INTO clientes (nome, email) VALUES ('João Oliveira', 'joao@email.com');
-- Resultado: ERRO (o SGBD impede a inconsistência!)
-- ERROR: duplicate key value violates unique constraint "clientes_email_key"
      
Atividade Prática: Modelando e Assegurando Relações no SGBD

Com base na aula e nos benefícios dos SGBDs (especialmente integridade e relacionamentos):

  1. Crie uma nova tabela chamada `pedidos` no banco `empresa_db`.
  2. Esta tabela `pedidos` deve ter uma coluna `id_cliente` que referencia a `id` da tabela `clientes` (usando uma **chave estrangeira - FOREIGN KEY**).
  3. Insira um novo cliente na tabela `clientes`.
  4. Tente inserir um pedido para este novo cliente que você acabou de criar.
  5. Tente inserir um pedido para um `id_cliente` que **não existe** na tabela `clientes` e observe o erro que o SGBD retorna. Isso demonstra o papel da **integridade referencial**.

Modelos de Dados Pioneiros: Hierárquico e em Rede

// Árvores e Grafos Simples na História dos Bancos de Dados

Modelo Hierárquico (Anos 1960)

O Modelo Hierárquico foi um dos primeiros modelos de banco de dados a ganhar destaque comercial. Sua estrutura se assemelha a uma árvore invertida ou um organograma. Os dados são organizados em segmentos (ou nós) onde cada segmento "filho" pode ter apenas um segmento "pai", mas um "pai" pode ter múltiplos "filhos".

  • Estrutura: Organização em árvore, com um único caminho de navegação de um nó raiz até qualquer folha. Cada registro tem um único "pai".
  • Acesso aos Dados: As operações de manipulação de dados (DML) são essencialmente navegacionais. Você precisa percorrer a hierarquia, do pai para o filho, para encontrar os dados desejados. Por exemplo, para encontrar um projeto, você primeiro teria que navegar até o departamento, depois até o funcionário, e então para o projeto associado a esse funcionário.
  • Vantagem: Era eficiente para certas operações quando a estrutura de dados se encaixava perfeitamente na hierarquia (relações 1:N).
  • Limitação: Extremamente inflexível para representar relações muitos-para-muitos (N:M). Se um projeto fosse associado a vários funcionários de diferentes departamentos, o dado do projeto teria que ser duplicado ou a modelagem ficaria artificialmente complexa. Mudanças na estrutura eram difíceis.
  • Exemplo Notável: IBM IMS (Information Management System), um SGBD amplamente utilizado em grandes corporações por décadas.
ims_system@hierarchical:~#
-- Exemplo Conceitual de Estrutura Hierárquica:
Departamento (Pai)
└── Funcionário (Filho)
    └── Projeto (Neto)

-- Limitação: Se um Projeto 'X' é trabalhado por 'Funcionário A' (Dep. 1) e 'Funcionário B' (Dep. 2),
-- o registro de 'Projeto X' precisaria ser duplicado sob ambos os funcionários,
-- ou então 'Funcionário B' não poderia se relacionar diretamente com 'Projeto X' dentro dessa hierarquia.
-- Isso leva a: Redundância ou Dificuldade de Modelagem de N:M.
          

Modelo em Rede (Anos 1970)

O Modelo em Rede surgiu como uma evolução do modelo hierárquico, buscando superar suas principais limitações, especialmente na representação de relações complexas. Ele permite uma estrutura de dados mais flexível, semelhante a um grafo.

  • Estrutura: Os dados são organizados como um grafo simples, onde um registro "filho" pode ter múltiplos registros "pais". Isso significa que múltiplos caminhos de navegação são possíveis para alcançar um dado.
  • DML Navegacional Flexível: A linguagem de manipulação de dados (DML) ainda era navegacional e procedural, mas mais flexível que a hierárquica. O programador precisava saber as "ligações" (ponteiros) entre os registros para navegar de um para outro.
  • Vantagem: Conseguiu representar diretamente relações muitos-para-muitos (N:M) de forma mais natural que o modelo hierárquico, eliminando algumas redundâncias.
  • Desvantagem: A complexidade na modelagem e na programação era alta. A navegação de dados ainda era procedural, o que significava que o programador precisava saber a estrutura exata e os "caminhos" para acessar os dados. Mudanças na estrutura do banco ainda exigiam alterações significativas nos programas.
  • Exemplo Notável: CODASYL DBTG (Data Base Task Group), um padrão que influenciou vários SGBDs da época.
codasyl_db@network:~#
-- Exemplo Conceitual de Estrutura em Rede:
Departamento <--- (pertence_a) --- Funcionario --- (trabalha_em) ---> Projeto
                 ^                                    ^
                 |                                    |
                 +------------------------------------+

-- Comandos de Navegação (Pseudocódigo):
GET (Funcionario) ONDE nome = 'FuncionarioA';
ENCONTRAR PROXIMO (Projeto) ATRAVES DE 'trabalha_em' DE FUNCIONARIO;
-- Desafio: A complexidade reside na necessidade de gerenciar as múltiplas conexões
-- e entender o caminho correto para o dado desejado, o que era responsabilidade do programador.
          
Atividade Prática: Comparando Modelos
  1. Imagine uma relação "Produto-Fornecedor", onde um produto pode ser fornecido por vários fornecedores e um fornecedor pode fornecer vários produtos (relação N:M).
  2. Descreva como essa relação seria modelada (conceitualmente) em um Modelo Hierárquico. Cite uma limitação clara dessa abordagem para essa relação N:M.
  3. Descreva como essa relação seria modelada (conceitualmente) em um Modelo em Rede. Explique como ele supera a limitação hierárquica, mas ainda apresenta desafios.

O Modelo Relacional: A Revolução de Codd

// Tabelas, Relações e a Linguagem que Dominou o Mundo dos Dados

A Simplicidade que Transformou Tudo

Proposto por Edgar F. Codd na IBM, o Modelo Relacional revolucionou o gerenciamento de dados ao introduzir uma abordagem matemática e lógica que era incrivelmente mais simples e flexível que seus antecessores (hierárquico e em rede). A grande sacada foi organizar os dados em tabelas simples, eliminando a complexidade da navegação por ponteiros.

Conceitos Chave do Modelo Relacional

Para entender o poder do Modelo Relacional, a gente precisa dominar seus pilares:

  • Tabelas (Relações): Onde os dados são armazenados. Pense em uma tabela como uma planilha de dados, com linhas e colunas. No contexto de banco de dados, "relação" é o termo técnico para tabela.
  • Tuplas (Registros/Linhas): Cada linha em uma tabela representa uma única ocorrência de um objeto ou evento. Por exemplo, em uma tabela de clientes, cada tupla seria um cliente específico.
  • Atributos (Campos/Colunas): Cada coluna em uma tabela representa uma característica ou propriedade dos objetos/eventos. Por exemplo, "nome", "endereço" ou "telefone" seriam atributos da tabela de clientes.
  • Domínios de Valores: Cada atributo possui um domínio, que é o conjunto de valores permitidos para ele (ex: o domínio do atributo "idade" seriam números inteiros positivos). Isso contribui para a integridade de dados.
  • Integridade de Dados: O modelo relacional tem regras claras para garantir que os dados sejam válidos e consistentes. Isso inclui:
    • Integridade de Entidade: Cada tupla em uma tabela precisa ser única e identificável.
    • Integridade Referencial: Garante que as relações entre tabelas sejam mantidas (ex: não dá pra ter um pedido sem um cliente associado).
  • Chaves Primárias (PRIMARY KEY - PK): Um atributo ou conjunto de atributos que identifica de forma única e não nula cada tupla em uma tabela. É a "identidade" de cada registro.
  • Chaves Estrangeiras (FOREIGN KEY - FK): Um atributo em uma tabela que estabelece um relacionamento com a chave primária de outra tabela. A chave estrangeira é o que "liga" as tabelas no modelo relacional, permitindo consultar dados relacionados facilmente.
db_admin@postgres:~#
-- Criando Tabelas Relacionais com Chaves Primárias e Estrangeiras
-- Tabela 'categorias': 'id' é a PRIMARY KEY.
CREATE TABLE categorias (
  id INT PRIMARY KEY,
  descricao VARCHAR(100) NOT NULL UNIQUE
);

-- Tabela 'produtos': 'id' é PRIMARY KEY, 'categoria_id' é FOREIGN KEY, referenciando 'categorias(id)'.
CREATE TABLE produtos (
  id INT PRIMARY KEY,
  nome VARCHAR(150) NOT NULL,
  preco DECIMAL(10, 2) CHECK (preco > 0),
  categoria_id INT,
  FOREIGN KEY (categoria_id) REFERENCES categorias(id)
);

-- Inserindo dados (tuplas) nas tabelas
INSERT INTO categorias (id, descricao) VALUES (1, 'Eletrônicos');
INSERT INTO categorias (id, descricao) VALUES (2, 'Livros');

INSERT INTO produtos (id, nome, preco, categoria_id) VALUES (101, 'Laptop Gamer', 4500.00, 1);
INSERT INTO produtos (id, nome, preco, categoria_id) VALUES (102, 'O Senhor dos Anéis', 80.00, 2);

-- Consultando dados relacionados usando JOINs (o poder das relações!)
SELECT p.nome AS NomeProduto, p.preco, c.descricao AS Categoria
FROM produtos p
JOIN categorias c ON p.categoria_id = c.id
WHERE p.preco > 100.00;
-- Resultado: Laptop Gamer | 4500.00 | Eletrônicos
-- Demonstra como dados de tabelas diferentes são facilmente combinados.
      
Atividade Prática: Relacionamentos e Consultas SQL
  1. Crie uma nova categoria na tabela categorias (ex: "Móveis", com id=3).
  2. Insira um novo produto na tabela produtos que esteja associado a esta nova categoria "Móveis".
  3. Em seguida, escreva e execute uma consulta SQL para listar todos os produtos e suas respectivas categorias, filtrando apenas os produtos da categoria "Móveis" que custam mais de R$ 50,00.

Modelo Orientado a Objetos (SGBDOO)

// Dados como Entidades Encapsuladas

Conceitos do Modelo Orientado a Objetos

O Modelo de Banco de Dados Orientado a Objetos (SGBDOO) surgiu buscando unir a programação orientada a objetos (POO) diretamente com o armazenamento de dados. A ideia era superar a "impedância de mismatch" — a dificuldade de mapear objetos complexos de linguagens de programação para as tabelas relacionais.

Em um SGBDOO, os dados são armazenados como objetos. Esses objetos encapsulam tanto os dados (seus atributos) quanto o comportamento (os métodos ou operações que podem ser realizadas sobre eles). Os principais conceitos incluem:

  • Classes e Objetos: Dados são organizados em classes, e cada registro no banco é uma instância (um objeto) dessa classe, assim como na POO.
  • Encapsulamento: Atributos e métodos são agrupados dentro do mesmo objeto. Você acessa esses dados e funções por meio de interfaces bem definidas, escondendo os detalhes internos.
  • Herança: Permite que classes (e, consequentemente, objetos) herdem propriedades e comportamentos de outras classes, criando hierarquias de dados.
  • Polimorfismo: Objetos de diferentes classes podem responder ao mesmo método de maneiras distintas, dependendo de sua própria implementação.
  • Complexidade de Objetos: Os SGBDOOs eram ideais para lidar com estruturas de dados muito complexas, como modelos de engenharia (CAD/CAM), sistemas de design de software ou aplicações multimídia, onde as relações internas de um objeto são mais importantes que as relações entre objetos simples.

Apesar de seu poder conceitual para objetos complexos, os SGBDOOs não alcançaram a popularidade dos bancos de dados relacionais. Isso ocorreu devido a desafios de desempenho em larga escala, a falta de uma linguagem de consulta padrão e, ironicamente, a própria evolução dos bancos de dados relacionais, que passaram a suportar tipos de dados mais complexos e recursos aproximados de objetos.

Simulando Conceitos Orientados a Objetos no SQL (PostgreSQL)

Embora não seja um SGBDOO puro, alguns bancos de dados relacionais modernos, como o PostgreSQL, oferecem recursos que simulam o encapsulamento de dados. Podemos usar tipos compostos para agrupar atributos, criando algo similar a um objeto que pode ser usado como tipo de uma coluna, aproximando-se do conceito de encapsulamento.

sql_objects@postgres:~#
-- 1. Criando um TIPO COMPOSTO 'endereco' (similar a uma 'classe' de endereço)
CREATE TYPE endereco AS (
  rua VARCHAR(100),
  cidade VARCHAR(50),
  cep VARCHAR(10)
);

-- 2. Criando uma tabela 'usuarios' que usa o tipo 'endereco' como uma COLUNA
CREATE TABLE usuarios (
  id SERIAL PRIMARY KEY,
  nome VARCHAR(100) NOT NULL,
  email VARCHAR(150),
  endereco endereco -- A coluna 'endereco' agora é do nosso tipo composto
);

-- 3. Inserindo dados na tabela 'usuarios', usando o construtor ROW para o tipo composto
INSERT INTO usuarios (nome, email, endereco)
VALUES (
  'João Silva',
  'joao.silva@example.com',
  ROW('Rua da Paz', 'São Paulo', '01000-000')::endereco
);

-- 4. Consultando dados e acessando atributos dentro do tipo composto
SELECT nome, (endereco).cidade AS Cidade, (endereco).rua AS Rua
FROM usuarios
WHERE (endereco).cidade = 'São Paulo';
-- Resultado: João Silva | São Paulo | Rua da Paz
-- Vemos como o SGBD "entende" a estrutura interna do 'objeto' endereço.
      
Atividade Prática: Modelando Contatos com Tipos Compostos
  1. Crie um novo tipo composto chamado contato_info que contenha dois atributos: telefone (VARCHAR(20)) e email_contato (VARCHAR(100)).
  2. Crie uma nova tabela chamada clientes_com_contato com as colunas id (SERIAL PRIMARY KEY), nome_cliente (VARCHAR(100) NOT NULL) e uma coluna do tipo contato_info.
  3. Insira um novo cliente nesta tabela, preenchendo os dados do tipo composto contato_info.
  4. Escreva e execute uma consulta SQL para listar o nome do cliente e o email de contato, acessando o atributo email_contato do tipo composto.

A Era NoSQL: Diversidade para o Big Data

// Flexibilidade, Escala e a Quebra do Paradigma Relacional

A Era NoSQL: Novas Respostas para Novos Desafios

A explosão do Big Data, a demanda por escalabilidade horizontal massiva e a necessidade de lidar com dados não estruturados ou semi-estruturados levaram ao surgimento dos bancos de dados NoSQL (Not Only SQL). Eles não são uma substituição, mas uma alternativa poderosa aos SGBDs relacionais para cenários específicos, focando em flexibilidade e desempenho em larga escala.

Os principais motivadores para a adoção do NoSQL incluem:

  • Escalabilidade Horizontal: Capacidade de distribuir o banco de dados entre muitos servidores commodity, adicionando mais máquinas para aumentar a capacidade.
  • Flexibilidade de Esquema (Schema-less): Não exigem um esquema rígido pré-definido, facilitando a evolução e o gerenciamento de dados com estruturas variadas.
  • Desempenho para Grandes Volumes: Otimizados para altas taxas de leitura/escrita e para lidar com grandes volumes de dados.
  • Variedade de Dados: Suporte nativo para diferentes tipos de dados (documentos, grafos, chave-valor, etc.).

Principais Categorias de Bancos de Dados NoSQL

Os bancos NoSQL são divididos em categorias, cada uma otimizada para diferentes padrões de dados e necessidades de aplicação:

  • 1. Bancos de Documento:

    Armazenam dados em documentos semi-estruturados, geralmente no formato JSON-like (BSON). Cada documento é uma unidade independente, permitindo estruturas flexíveis.

    Casos de Uso: Catálogos de produtos com atributos variáveis, perfis de usuário, sistemas de gerenciamento de conteúdo (CMS).

    Exemplos: MongoDB, Couchbase.

  • 2. Bancos Chave-Valor:

    São os mais simples, armazenando dados como pares de "chave" única e "valor" (que pode ser qualquer tipo de dado). Acesso ultrarrápido diretamente pela chave.

    Casos de Uso: Caching de dados, gerenciamento de sessões de usuário, leaderboards, contadores.

    Exemplos: Redis, DynamoDB, Memcached.

  • 3. Bancos Colunares (ou de Colunas Largas):

    Organizam os dados em "famílias de colunas", otimizando o armazenamento e o acesso para consultas que leem colunas específicas. Bom para dados que variam muito por linha.

    Casos de Uso: Big Data analytics, séries temporais (dados de IoT, logs), sistemas de mensagens em larga escala.

    Exemplos: Cassandra, HBase, Google Bigtable.

  • 4. Bancos de Grafo:

    Representam dados como nós (entidades) e arestas (relacionamentos) que conectam esses nós. Ideais para modelar e consultar relações complexas e interconectadas.

    Casos de Uso: Redes sociais (conexões entre pessoas), sistemas de recomendação, detecção de fraude, análise de redes.

    Exemplos: Neo4j, Amazon Neptune, OrientDB.

nosql_examples@terminal:~#
-- Exemplo 1: MongoDB (Documento) - Inserindo um produto
db.produtos.insertOne({
  nome: "Laptop Ultrabook",
  preco: 1200,
  fabricante: "TechCorp",
  especificacoes: { cpu: "i7", ram: "16GB", ssd: "512GB" },
  categorias: ["eletrônicos", "computadores", "portáteis"],
  disponivel: true
});
-- Observação: A estrutura pode variar para outros produtos.

-- Exemplo 2: Redis (Chave-Valor) - Gerenciando sessão de usuário
SET usuario:123:nome "João Silva"
SET usuario:123:last_login "2025-07-21T09:30:00Z"
GET usuario:123:nome
-- Resultado: "João Silva"

-- Exemplo 3: Neo4j (Grafo) - Criando relacionamento em uma rede social
CREATE (p1:Pessoa {nome: 'Ana'}),
       (p2:Pessoa {nome: 'Carlos'}),
       (p1)-[:AMIGO_DE]->(p2);
-- Consulta: Quem são os amigos de Ana?
MATCH (ana:Pessoa {nome: 'Ana'})-[:AMIGO_DE]->(amigo) RETURN amigo.nome;
          

Atividade em Duplas: Explorando um Banco NoSQL

Aprofundem seus conhecimentos sobre os bancos de dados NoSQL, essenciais para as arquiteturas modernas. Esta atividade visa explorar a diversidade e a aplicabilidade desses sistemas:

  1. Formem duplas.
  2. Escolham um dos tipos de banco de dados NoSQL abaixo (ou outro, com aprovação do professor):
    • MongoDB (Documento)
    • Redis (Chave-Valor)
    • Cassandra (Colunar)
    • Neo4j (Grafo)
    • CockroachDB (Considerado um "NewSQL", pode ser interessante para discutir escalabilidade de bancos SQL)
  3. Pesquisem e preparem uma breve apresentação (5-7 minutos) para a turma, abordando os seguintes pontos:
    • Características Principais: Como ele armazena dados, qual sua estrutura lógica, e para qual modelo CAP ele se inclina.
    • Casos de Uso Ideais: Para quais tipos de aplicações ele é mais indicado e por quê. Citem exemplos de empresas ou cenários reais que o utilizam.
    • Vantagens e Desvantagens: Em que ele se destaca e quais suas limitações em comparação com outros tipos de bancos de dados.
    • Exemplo de Comando Básico: Mostrem um comando simples de interação (inserção ou consulta) nesse SGBD, como os vistos nos terminais.
Preparação: Foquem na clareza e na capacidade de explicar o conceito para seus colegas que podem não ter explorado o mesmo tipo de banco de dados. A prática de explicar ajuda a consolidar o aprendizado!

Quiz Interativo

// Teste seus conhecimentos sobre a evolução dos bancos

Teste de Conhecimento

Responda às perguntas abaixo para consolidar o aprendizado sobre a evolução e tipos de bancos de dados.

1. Qual é uma limitação dos sistemas de arquivos tradicionais?

a) Suporte a transações ACID
b) Redundância de dados
c) Alta escalabilidade horizontal
d) Consultas otimizadas
Resposta Correta: b) Redundância de dados. Sistemas de arquivos frequentemente duplicam dados, causando desperdício e inconsistências.

2. O que motivou o surgimento dos SGBDs?

a) Aumentar redundância
b) Simplificar consultas complexas
c) Reduzir segurança
d) Limitar acesso concorrente
Resposta Correta: b) Simplificar consultas complexas. SGBDs eliminam a necessidade de programação manual para consultas.

3. Qual é uma característica do modelo hierárquico?

a) Uso de tabelas relacionais
b) Estrutura de árvore pai-filho
c) Consultas em SQL
d) Escalabilidade horizontal
Resposta Correta: b) Estrutura de árvore pai-filho. O modelo hierárquico organiza dados em uma árvore, limitando consultas complexas.

4. O que define o modelo relacional de Codd?

a) Estrutura de grafo
b) Uso de tabelas e chaves
c) Dados não estruturados
d) Ponteiros complexos
Resposta Correta: b) Uso de tabelas e chaves. O modelo relacional usa tabelas com chaves primárias e estrangeiras para relacionar dados.

5. Qual é uma vantagem dos bancos NoSQL do tipo grafo?

a) Armazenamento de tabelas fixas
b) Gerenciamento de relações complexas
c) Consultas em álgebra relacional
d) Estrutura hierárquica rígida
Resposta Correta: b) Gerenciamento de relações complexas. Bancos de grafo, como Neo4j, são ideais para dados com conexões complexas, como redes sociais.
db_quiz_results:~#
RUN db_evolution_check;
-- Quiz finalizado. 
Parabéns por explorar a evolução dos bancos de dados!