Bancos de Dados em C#: Guardando Informação de Verdade

Bancos de Dados em C#: Guardando Informação de Verdade

Por que arquivos de texto não bastam para sistemas reais e o que um banco de dados resolve: busca eficiente, atualização precisa, acesso simultâneo seguro, integridade e relações entre dados. A aula apresenta o modelo relacional, o papel de um ORM e uma menção ao SQL.
Linguagem C#

• • 11 min de leitura

Bem-vindo à primeira das extensões do curso. Você dominou a linguagem C#; agora vamos usá-la para construir coisas do mundo real, e começamos pela necessidade mais universal de qualquer sistema sério: guardar informação de forma robusta e permanente. No capstone do núcleo, você salvou tarefas num arquivo de texto — e funcionou, para um programa pequeno. Mas essa abordagem tem limites severos que aparecem rapidamente à medida que os programas crescem. Nesta aula, entenderemos por que os arquivos não bastam para sistemas reais, o que é um banco de dados e por que ele é a solução profissional para armazenar informação, e como o C# se conecta a esse mundo. É uma aula mais conceitual, que prepara o terreno para as próximas, onde conectaremos, de fato, seus programas a bancos de dados reais.

Por que arquivos não bastam

Comecemos entendendo os limites da abordagem que usamos no capstone. Salvar dados num arquivo de texto é simples e adequado para pouca informação, mas revela fragilidades sérias quando o sistema cresce. Considere um sistema com milhares de registros — clientes, produtos, pedidos. Se tudo estivesse num arquivo de texto, buscar um registro específico exigiria ler o arquivo inteiro e percorrê-lo linha a linha, o que se torna lento com o volume. Atualizar um único registro no meio do arquivo seria desajeitado, muitas vezes exigindo reescrever tudo. E há problemas mais graves: se duas partes do programa (ou dois usuários) tentassem escrever no arquivo ao mesmo tempo, os dados poderiam corromper-se. Não há garantia de integridade — nada impede que um registro fique pela metade ou inconsistente. E não há uma forma eficiente de estabelecer relações entre dados, como ligar um pedido ao cliente que o fez.

Em resumo, arquivos servem para persistência simples, mas não oferecem busca eficiente, atualização precisa, acesso simultâneo seguro, garantia de integridade nem relações entre dados — tudo o que sistemas reais exigem. Precisamos de algo projetado especificamente para armazenar e gerenciar informação em escala. Esse algo é o banco de dados.

O que é um banco de dados

Um banco de dados é um sistema especializado em armazenar, organizar e recuperar grandes quantidades de informação de forma eficiente, segura e íntegra. Em vez de guardar dados soltos num arquivo, um banco de dados os organiza segundo uma estrutura, permite buscá-los rapidamente por qualquer critério, atualizá-los com precisão, e garante que permaneçam consistentes mesmo com muitos acessos simultâneos. Pense na diferença entre uma pilha desorganizada de papéis (o arquivo) e um arquivo de escritório bem estruturado, com gavetas, pastas etiquetadas e um índice (o banco de dados): ambos guardam papéis, mas só o segundo permite encontrar rapidamente o que se procura, adicionar e remover documentos com ordem, e manter tudo coerente.

O tipo mais comum e tradicional de banco de dados é o banco de dados relacional, que organiza a informação em tabelas — estruturas de linhas e colunas, semelhantes a planilhas. Cada tabela guarda um tipo de coisa (uma tabela de clientes, uma de produtos), cada coluna é uma característica (nome, preço), e cada linha é um registro concreto (um cliente específico). As tabelas podem se relacionar entre si (daí o nome "relacional") — por exemplo, uma tabela de pedidos pode ligar cada pedido ao cliente correspondente na tabela de clientes. Essa organização em tabelas relacionadas é poderosa e é a base da maioria dos sistemas do mundo. Existem bancos de dados relacionais muito usados, como o PostgreSQL e o MySQL, que conheceremos nas próximas aulas.

Objetos e tabelas: dois mundos que precisam conversar

Aqui surge uma questão interessante e central para nós, programadores C#. O seu programa pensa em objetos — as classes que você aprendeu a criar, com properties e comportamentos. O banco de dados relacional pensa em tabelas — linhas e colunas. São duas formas diferentes de organizar a mesma informação: um objeto Cliente no seu programa corresponde, no banco, a uma linha na tabela de clientes, com cada property virando uma coluna. Fazer esses dois mundos conversarem — transformar objetos em linhas ao salvar, e linhas em objetos ao buscar — é um trabalho que precisa ser feito, e fazê-lo manualmente seria tedioso e propenso a erros.

Felizmente, existe uma categoria de ferramentas que automatiza essa ponte, chamada ORM (das iniciais, em inglês, de "mapeador objeto-relacional"). Um ORM permite que você trabalhe com objetos no seu código C# — criar, buscar, modificar objetos, como sempre fez — enquanto ele cuida, nos bastidores, de traduzir tudo isso em operações no banco de dados. Você programa pensando em objetos; o ORM fala com o banco por você. No mundo C#, o ORM oficial e mais usado chama-se Entity Framework Core (frequentemente abreviado EF Core), e é ele que usaremos nas próximas aulas. A grande vantagem, que você apreciará em breve: consultaremos o banco de dados usando o mesmo LINQ que você já domina — o EF Core traduz suas consultas LINQ em comandos de banco de dados, de modo que buscar dados no banco se pareça muito com buscar dados numa lista.

A linguagem dos bancos: SQL (uma menção)

Vale mencionar, para seu conhecimento, que os bancos de dados relacionais têm sua própria linguagem, chamada SQL (das iniciais, em inglês, de "linguagem de consulta estruturada"), usada para criar tabelas, inserir dados, buscar, atualizar e remover. É uma linguagem à parte, com valor próprio, e que muitos programadores aprendem. Neste curso, porém, não precisaremos escrevê-la diretamente na maior parte do tempo, porque o EF Core a gera para nós a partir do nosso código C# e das nossas consultas LINQ — essa é justamente uma das conveniências de um ORM. Menciono o SQL para que você saiba que ele existe e é a linguagem "nativa" dos bancos relacionais; se um dia quiser aprofundar-se em bancos de dados, aprender SQL será um passo natural e valioso. Por ora, deixaremos que o EF Core cuide dele nos bastidores, e trabalharemos no conforto dos objetos e do LINQ que já conhecemos.

Os limites do arquivo de texto ficaram explícitos: busca lenta, atualização desajeitada, risco de corrupção com acesso simultâneo, nenhuma garantia de integridade e nenhuma forma eficiente de relacionar dados. É o suficiente para um programa pequeno e claramente insuficiente para um sistema real.

O banco de dados relacional responde a tudo isso organizando a informação em tabelas que se relacionam. E a ponte entre o mundo dos objetos e o mundo das tabelas tem nome: um ORM traduz um pelo outro, permitindo trabalhar com objetos no código enquanto ele cuida das operações no banco — inclusive aceitando as mesmas consultas já familiares.

Fontes e leituras recomendadas

Exercícios

Exercício 1

Com suas palavras, liste três limitações de usar um arquivo de texto para guardar os dados de um sistema com muitos registros (como fizemos no capstone), e explique por que cada uma se torna um problema à medida que o sistema cresce.

Ver resposta

✓ Resposta: Três limitações: (a) Busca ineficiente — encontrar um registro específico exige ler o arquivo inteiro e percorrê-lo linha a linha, o que fica lento com muitos registros, ao contrário do banco, que busca rapidamente por qualquer critério. (b) Acesso simultâneo inseguro — se duas partes do programa ou dois usuários tentam escrever no arquivo ao mesmo tempo, os dados podem corromper-se, pois o arquivo não coordena acessos concorrentes. (c) Falta de integridade e de relações — nada garante que os dados fiquem consistentes (um registro pode ficar pela metade), e não há forma eficiente de ligar dados relacionados (como um pedido ao seu cliente). Cada uma se torna crítica com o crescimento porque o volume e a concorrência aumentam, e a ausência dessas garantias, tolerável em pouca escala, vira fonte de lentidão, corrupção e inconsistência em escala real.

Exercício 2

Explique, com a analogia dos papéis, a diferença entre guardar dados num arquivo simples e num banco de dados. Que capacidades o banco de dados oferece que o arquivo não oferece?

Ver resposta

✓ Resposta: Um arquivo simples é como uma pilha desorganizada de papéis: guarda a informação, mas para encontrar algo é preciso vasculhar tudo, adicionar e remover é desajeitado, e manter a coerência é difícil. Um banco de dados é como um arquivo de escritório bem estruturado, com gavetas, pastas etiquetadas e um índice: além de guardar os papéis, permite encontrar rapidamente o que se procura, adicionar e remover com ordem, e manter tudo consistente. O banco oferece o que o arquivo não oferece: busca eficiente por qualquer critério, atualização precisa de registros individuais, acesso simultâneo seguro, garantia de integridade dos dados, e a capacidade de relacionar informações entre si.

Exercício 3

Explique, com suas palavras, o que é um banco de dados relacional e como ele organiza a informação. O que são, nesse contexto, uma tabela, uma coluna e uma linha, e como isso se relaciona com um objeto do seu programa?

Ver resposta

✓ Resposta: Um banco de dados relacional é um tipo de banco que organiza a informação em tabelas — estruturas de linhas e colunas, semelhantes a planilhas. Uma tabela guarda um tipo de coisa (por exemplo, clientes); uma coluna representa uma característica desse tipo (nome, e-mail); e uma linha é um registro concreto (um cliente específico, com seus valores em cada coluna). As tabelas podem se relacionar entre si (daí "relacional"), ligando dados de uma a dados de outra. Isso se relaciona com os objetos do programa assim: um objeto (por exemplo, um Cliente) corresponde a uma linha na tabela de clientes, e cada property do objeto corresponde a uma coluna — ou seja, a classe é o molde da tabela, e cada objeto é uma linha nela.

Exercício 4

Explique o que é um ORM e qual problema ele resolve. Por que "objetos" e "tabelas" precisam de uma ponte, e como o Entity Framework Core facilita a vida do programador C#?

Ver resposta

✓ Resposta: Um ORM (mapeador objeto-relacional) é uma ferramenta que faz a ponte automática entre o mundo dos objetos (como o programa C# pensa) e o mundo das tabelas (como o banco relacional guarda os dados). Ele resolve o problema de que essas duas formas de organizar a informação são diferentes: um objeto precisa virar uma linha ao ser salvo, e uma linha precisa virar um objeto ao ser buscado — uma tradução que, feita manualmente, seria tediosa e propensa a erros. Objetos e tabelas precisam dessa ponte porque o programa trabalha naturalmente com objetos, mas o banco só entende tabelas e sua linguagem própria (SQL). O Entity Framework Core facilita a vida do programador C# ao cuidar dessa tradução nos bastidores: você cria, busca e modifica objetos no seu código como sempre, e o EF Core converte tudo isso em operações no banco, poupando-o de escrever a tradução à mão.

Exercício 5

Sem código: a aula afirma que consultaremos o banco de dados "usando o mesmo LINQ que você já domina". Explique por que isso é uma vantagem para você, e o que significa dizer que o EF Core "traduz suas consultas LINQ em comandos de banco de dados".

Ver resposta

✓ Resposta: É uma vantagem porque significa que você não precisa aprender uma forma nova de consultar dados para trabalhar com bancos de dados: as mesmas ferramentas do LINQ (Where, OrderBy, Select, etc.) que você já domina para filtrar e transformar listas servirão para buscar dados no banco. Dizer que o EF Core "traduz suas consultas LINQ em comandos de banco de dados" significa que, quando você escreve uma consulta LINQ sobre os dados do banco, o EF Core não a executa como faria numa lista em memória; ele a converte na linguagem que o banco entende (SQL) e a envia ao banco, que executa a busca de forma eficiente e devolve apenas os resultados. Assim, você escreve no conforto do LINQ, e o EF Core cuida de conversar com o banco na linguagem dele — você aproveita o poder do banco de dados sem sair do estilo de programação que já conhece.

Comentários

Mais em Linguagem C#

Projeto: Um Sistema de Formas de Pagamento
Projeto: Um Sistema de Formas de Pagamento

Um projeto integrador que reúne toda a fase de objetos num sistema de formas…

A Instrução switch: Escolhendo Entre Muitas Opções
A Instrução switch: Escolhendo Entre Muitas Opções

Quando comparar um mesmo valor contra muitas opções, encadear condições fica…

Operadores e Expressões: Fazendo Contas e Combinando Valores
Operadores e Expressões: Fazendo Contas e Combinando Valores

Como fazer contas e combinar valores em C#: os operadores aritméticos, o resto…