Banco de dados no Desenvolvimento Web
Published: 2023-10-17 15:56:44

## Introdução - Bancos de Dados como a Base do Desenvolvimento Web

O universo da tecnologia e do desenvolvimento web tem, como sua base fundamental, os dados. Em essência, as aplicações web são construídas para proporcionar a disponibilidade, organização e manipulação eficaz dessas informações. É por esse motivo que o entendimento sobre bancos de dados se torna crucial nesse contexto.

### Banco de Dados vs. Sistema de Gerenciamento de Banco de Dados (SGBD)

Antes de mergulharmos nos detalhes dos bancos de dados e dos SGBDs, é importante esclarecer as diferenças entre esses termos, frequentemente usados de forma intercambiável. Em essência, um banco de dados é uma estrutura que serve para armazenar informações, enquanto um Sistema de Gerenciamento de Banco de Dados (SGBD) é uma aplicação ou software específico projetado para gerenciar e facilitar o acesso a esses dados.

**Banco de Dados**: Esta é a entidade que atua como o repositório central para armazenar informações. Ele é o local onde os dados são organizados, estruturados e, em última análise, armazenados.

**SGBD**: Por outro lado, o SGBD é a ferramenta que permite aos usuários interagirem com o banco de dados. Ele oferece uma variedade de funcionalidades, como inserção, atualização, exclusão e recuperação de dados. O SGBD também é responsável por garantir a segurança, a integridade e a consistência dos dados.

Neste contexto, MySQL, PostgreSQL, Oracle, SQL Server, Firestore (Firebase), MongoDB e outros são SGBDs, softwares que facilitam e gerenciam o acesso aos dados contidos em seus repositórios (bancos de dados), sendo os dois últimos exemplos de SGBDs NoSQL (Not Only SQL).

## Bancos de Dados Relacionais e Não Relacionais

Na introdução acima, citamos os termos SQL e NoSQL. SQL é uma linguagem de consulta (*Structured Query Language*) desenvolvida para manipular e acessar dados contidos em bancos de dados relacionais. Um banco de dados relacional refere-se a uma forma de organização de dados que utiliza tabelas para armazenar informações. Essas tabelas são interconectadas por meio de chaves e relacionamentos definidos, seguindo um modelo predefinido.

No entanto, existem outros tipos de bancos de dados que não se encaixam nesse modelo relacional. Eles são conhecidos como bancos de dados NoSQL (Not Only SQL), e são projetados para lidar com tipos de dados mais variados e flexíveis, como documentos, gráficos, pares chave-valor, entre outros. Aqui estão algumas informações adicionais sobre essas categorias:

### Bancos de Dados Relacionais
Os bancos de dados relacionais são baseados em um modelo de dados tabular, onde as informações são organizadas em tabelas com linhas e colunas. As relações entre essas tabelas são estabelecidas por meio de chaves primárias e estrangeiras. Alguns exemplos populares de SGBDs relacionais incluem:

- **MySQL**: Um SGBD de código aberto amplamente usado que é conhecido por sua velocidade e confiabilidade.

- **PostgreSQL**: Um SGBD de código aberto conhecido por seu alto desempenho e suporte a recursos avançados.

- **Oracle**: Um SGBD comercial amplamente utilizado em empresas, conhecido por sua escalabilidade e recursos de segurança.

- **SQL Server**: Um SGBD da Microsoft com recursos avançados, como integração com o ambiente Windows.

### Bancos de Dados NoSQL

Os bancos de dados NoSQL se destacam por sua flexibilidade e capacidade de lidar com tipos de dados variados. Eles não dependem do modelo tabular rígido dos bancos de dados relacionais. Em vez disso, eles utilizam modelos de dados mais diversos, como:

- **Documentos**: Nesse modelo, os dados são armazenados em documentos semelhantes a JSON ou BSON. O **MongoDB** é um exemplo popular desse tipo.

- **Grafos**: Projetados para armazenar dados em forma de nós e arestas, excelentes para representar relações complexas. O **Neo4j** é um SGBD de gráfico bem conhecido.

- **Chave-Valor**: Eles armazenam dados como pares chave-valor simples, sendo ideais para cenários de armazenamento em cache e recuperação rápida de informações. O **Redis** é um exemplo notável.

- **Colunas amplas**: Esses bancos de dados armazenam dados em colunas, permitindo consultas eficientes em grandes conjuntos de dados. O **Cassandra** é um exemplo.

## Modelagem de Dados e Modelo Entidade-Relacionamento

A modelagem de dados é um processo essencial no projeto de bancos de dados. Ela envolve a definição de como os dados serão estruturados, organizados e relacionados. Um dos métodos mais comuns de modelagem de dados é o Modelo Entidade-Relacionamento (ER), que utiliza diagramas para representar entidades, atributos e relacionamentos entre eles.

**Entidades**: São objetos ou conceitos que armazenam informações e que visam modelar "coisas" do mundo real. Por exemplo, em um sistema de gerenciamento escolar, "Aluno" e "Professor" seriam entidades.

**Atributos**: São as características ou propriedades das entidades. No caso de um aluno, os atributos podem incluir "Nome", "Idade" e "Endereço".

**Relacionamentos**: Definem como as entidades estão conectadas umas às outras. Por exemplo, um relacionamento "Ensina" pode conectar a entidade "Professor" à entidade "Matéria".

A modelagem de dados é crucial para garantir que o banco de dados atenda aos requisitos do sistema e que as consultas possam ser executadas de maneira eficiente.

## Mais alguns conceitos sobre Bancos de Dados

### Modelo Físico

Além do modelo lógico, que descreve a estrutura de dados em um nível abstrato, existe o modelo físico, que se concentra na implementação real do banco de dados em hardware específico. Isso inclui considerações sobre como os dados serão armazenados em disco, quais índices serão usados para otimizar as consultas e como os backups e a recuperação serão gerenciados.

### Transações

As transações são operações de banco de dados que envolvem uma ou mais ações. Elas garantem que um conjunto de operações seja executado de forma atômica, ou seja, todas as operações são bem-sucedidas ou nenhuma delas é executada. Isso garante a integridade dos dados, especialmente em ambientes de bancos de dados multiusuário.

## Conexão com o SGBD

Como falamos, o SGBD é um software que visa facilitar o acesso aos dados. Ao invés de tratarmos com arquivos CSV como fizemos em exemplos anteriores nesta série, podemos manter os dados de nossa aplicação dentro de um banco de dados, sendo este banco gerenciado por um SGBD.

Num nível mais baixo de abstração, um SGBD (relacional ou não) funciona como um software servidor, que espera por uma conexão de um cliente. No caso de SGBDs relacionais, o cliente que fará a conexão será a interface a partir da qual o desenvolvedor irá enviar os comandos em SQL e, eventualmente, ler os dados retornados pelo servidor do SGBD.

Este software cliente pode ser uma interface visual, como o MySQL Workbench, uma interface de linha de comando (CLI - *command line interface*) como o `psql` ou o `mysql` (executáveis a partir de um terminal de comando) ou um outro software qualquer, escrito em alguma linguagem de programação e que interage com um driver de acesso.

### Driver

Um driver, no contexto de conexão com um Sistema de Gerenciamento de Banco de Dados (SGBD), é um componente de software responsável por permitir que uma aplicação se comunique e interaja com o banco de dados. Ele age como uma ponte entre a aplicação, que está escrita em uma linguagem de programação específica, e o SGBD, que pode ter seu próprio conjunto de protocolos de comunicação.

#### Funcionalidade dos Drivers

Os drivers desempenham várias funções essenciais:

- **Conexão com o Banco de Dados**: O driver estabelece a conexão inicial entre a aplicação e o banco de dados. Ele lida com os detalhes de comunicação, como endereço do servidor, autenticação e configurações de segurança.

- **Tradução de Comandos**: Quando a aplicação envia comandos SQL para o SGBD, o driver traduz esses comandos para um formato que o banco de dados possa entender e processar. Isso é fundamental, pois diferentes SGBDs podem ter dialetos SQL ligeiramente diferentes.

- **Gerenciamento de Conexão**: Os drivers gerenciam a alocação e o encerramento de conexões com o banco de dados. Isso inclui a criação de novas conexões quando necessário e a reutilização de conexões existentes para melhorar o desempenho.

- **Prevenção de Injeção SQL**: Muitos drivers têm medidas de segurança embutidas para evitar ataques de injeção SQL. Eles garantem que os comandos SQL inseridos pela aplicação sejam seguros e não representem uma ameaça à integridade dos dados.

- **Manipulação de Resultados**: Quando o SGBD retorna resultados de consultas, o driver os processa e os transforma em um formato compreensível para a aplicação. Isso pode incluir a conversão de tipos de dados e a estruturação dos resultados em objetos ou arrays utilizáveis.

#### Onde os Drivers São "Instalados"

Os drivers geralmente fazem parte da pilha de tecnologia da aplicação e são incluídos no código ou referenciados como bibliotecas externas, dependendo da linguagem de programação utilizada. Eles são específicos para cada SGBD, o que significa que você precisa do driver correto para se conectar a um determinado banco de dados.

Por exemplo, em PHP, você pode utilizar extensões como `mysqli` ou `PDO` (PHP Data Objects) para se conectar a diferentes SGBDs, e essas extensões incluem os drivers necessários para cada SGBD.

### Exemplos de Conexão com MySQL em PHP

Em PHP, a conexão com um banco de dados é frequentemente feita usando drivers específicos. Aqui estão dois exemplos de como se conectar a um banco de dados MySQL e PostgreSQL usando as extensões `mysqli` e `PDO`:

#### `mysqli`

```php
<?php
$host = "localhost"; // host onde o servidor de MySQL estará escutando
$port = 3306; // porta TCP onde o servidor escuta
$username = "seu_usuario"; // usuário do SGBD
$password = "sua_senha"; // senha do usuário
$database = "seu_banco"; // base de dados que será utilizada

// Criar uma conexão
$mysqli = new mysqli($host, $username, $password, $database, $port); // o argumento $port é opcional; o valor default é a porta padrão (3306 para o MySQL)

// Verificar se a conexão foi bem-sucedida
if ($mysqli->connect_error) {
    die("Erro de conexão: " . $mysqli->connect_error);
}

// Exemplo de comando INSERT
$insertQuery = "INSERT INTO tabela (coluna1, coluna2) VALUES ('valor1', 'valor2')";
if ($mysqli->query($insertQuery) === true) {
    echo "Inserção bem-sucedida.";
} else {
    echo "Erro na inserção: " . $mysqli->error;
}

// Exemplo de comando SELECT
$selectQuery = "SELECT coluna1, coluna2 FROM tabela WHERE algum_criterio";
$result = $mysqli->query($selectQuery);

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        echo "Coluna1: " . $row["coluna1"] . " - Coluna2: " . $row["coluna2"] . "<br>";
    }
} else {
    echo "Nenhum resultado encontrado.";
}

// Fechar a conexão
$mysqli->close();
?>
```

#### PDO

```php
<?php
// Dados de conexão
$host = "localhost";
$port = 3306;
$username = "seu_usuario";
$password = "sua_senha";
$database = "seu_banco";

try {
    // Criar uma conexão
    $pdo = new PDO("mysql:host=$host;port=$port;dbname=$database", $username, $password); // a porta aqui também é opcional
} catch (PDOException $e) {
    die("Erro de conexão: " . $e->getMessage());
}

// Exemplo de comando INSERT
$insertQuery = "INSERT INTO tabela (coluna1, coluna2) VALUES (?, ?)";
$stmt = $pdo->prepare($insertQuery);
$valor1 = "valor1";
$valor2 = "valor2";
$stmt->execute([$valor1, $valor2]);
echo "Inserção bem-sucedida.";

// Exemplo de comando SELECT
$selectQuery = "SELECT coluna1, coluna2 FROM tabela WHERE algum_criterio";
$stmt = $pdo->query($selectQuery);

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "Coluna1: " . $row["coluna1"] . " - Coluna2: " . $row["coluna2"] . "<br>";
}
?>

```

Esses exemplos ilustram como os drivers são usados em PHP para conectar-se a diferentes SGBDs e interagir com eles. Cada linguagem de programação tem suas próprias maneiras de lidar com drivers de banco de dados, mas o princípio geral é semelhante: o driver atua como a interface entre a aplicação e o SGBD, facilitando a comunicação e a manipulação de dados.

Esses exemplos também são uma base sólida para realizar operações de banco de dados em PHP. Certifique-se de adaptá-los às suas necessidades específicas, substituindo os nomes de tabela, colunas e valores de acordo com o seu banco de dados e aplicação.

## Conclusão

Os bancos de dados desempenham um papel central no desenvolvimento web, fornecendo a estrutura para armazenar e recuperar dados de forma eficiente. Compreender os aspectos fundamentais, como a modelagem entidade-relacionamento, é essencial para projetar sistemas de bancos de dados que atendam aos requisitos de desempenho e confiabilidade. Saber conectar aos SGBDs e manipular bancos de dados utilizando linguagens de programação pode ser inicialmente desafiador, por requerer conhecimentos em duas áreas distintas (às vezes mais, quando tratamos de aplicações mais complexas), mas é um aspecto fundamental no desenvolvimento de aplicações em geral, principalmente no universo Web.