O documento apresenta os conceitos básicos de banco de dados, como são aplicados em aplicações web e possíveis problemas. Explica que bancos de dados armazenam dados em tabelas, podem ser relacionais ou não relacionais e são gerenciados por SGBDs. Também mostra como modelar bancos de dados e como aplicações se comunicam com eles diretamente ou via ORM, além de possíveis causas de problemas como buscas ineficientes.
2. SOBRE MIM
• Graduado em Engenharia Eletrônica e de Computação pela UFRJ
• Engenheiro Desenvolvedor Ruby On Rails desde 2016
3. OBJETIVOS
• Apresentar aos espectadores os conceitos básicos de banco de dados
• Explicar como bancos de dados são aplicados em aplicações web
• Mostrar como navegar em um banco de dados
• Expor possíveis problemas que uma aplicação pode ter devido a banco de
dados
4. O QUE É UM BANCO DE DADOS?
• É um conjunto de dados armazenados em tabelas
• Exemplo de tabela: Tabela de usuários em um e-commerce
Nome Idade e-mail Sexo
João 23 joao@exemplo.com M
Maria 19 maria@exemplo.com F
5. O QUE É UM BANCO DE DADOS?
• Eles podem ser relacionais ou não relacionais
• Bancos Relacionais: As tabelas podem ter relações entre si ou não
• Bancos Não Relacionais: As tabelas não podem ter relacionamentos entre si
costumam ser mais leves e mais rápidas que as relacionais
• São gerenciados através de um Sistema de Gestão de Banco de Dados (SGBD)
6. • Exemplo de tabelas em um banco de dados relacional:
id id_cliente Id_produto
1 1 2
2 2 1
id_cliente Nome email
1 José jose@ex.com
2 Joaquim Joaquim@ex.com
id_produto nome preco
1 Bacalhau 1200
2 Vinho do porto 1500
Clientes:Vendas:
Produtos:
7. • Exemplo de tabelas em um banco de dados não relacional:
id Nome_cliente email_cliente nome_produto preco_produto
1 Manoel manoel@ex.com Bacalhau 1200
2 Joaquim joaquim@ex.com Vinho 1500
Vendas:
8. SGBD
• É um conjunto de softwares responsáveis pelo gerenciamento de um banco
de dados e permitir uma comunicação facilitada com o banco
• O SGBD disponibiliza uma interface para que seus clientes possam incluir,
alterar ou consultar dados previamente armazenados
• As principais de operações de um SGBD são conhecidas como CRUD( Create,
Read, Update, Delete)
9. SGBD
• Os SGBDs se comunicam com o banco de dados através de uma ‘API’ interna
que aceita solicitações escritas em um console específico ou um software
feito para receber um script de solicitações ao banco
• Essas solicitações são feitas em linguagens específicas dependendo do banco
de dados utilizado
• Exemplos de linguagens: SQL e noSQL
10. SQL
• O nome é a abreviação de Structured Query Language ou Linguagem de
Consulta Estruturada
• Possui múltiplas variações dependendo do SGBD utilizado, cada um tendo
funções e tipos únicos de dados suportados
• Existe um padrão comum seguido pela grande maioria para permitir a fácil
migração e comunicação entre diferentes bancos
• O padrão comum é conhecido como SQL Ansi
11. EXEMPLOS DE OPERAÇÕES SQL
• SELECT * FROM usuarios where deleted_at IS NOT NULL
• DESC usuarios
• INSERT INTO usuarios (‘josé’, ‘josé@exemplo.com’)
12. COMO MODELAR UM BANCO DE DADOS
• Elaborando um diagrama entidade relacionamento
• Serve para prever as entidades ( tabelas) presente no banco com os seus
atributos e as possíveis relações entre eles
• Útil para mapear quais são as informações devem ser armazenadas na tabela
13. DIAGRAMA ENTIDADE RELACIONAMENTO(ERD)
Ex:
Tabela clientes
id: int
nome: varchar(25)
Email: varchar(25)
Idade: int
Tabela compras
id_usuário: int
Id_produto: int
Tabela produto
id: int
nome: varchar(25)
1:n 1:n
14. COMO UMA APLICAÇÃO SE COMUNICA COM UM BD?
• 2 formas:
• Fazendo solicitações diretamente ao banco de dados
• Fazendo uso de ORM:
• Object-Relational Mapping: É uma técnica de programação para fazer a conversão de dados
de tabelas no banco de dados em instâncias de objetos
• Muitas linguagens de programação orientada a objeto possuem algum método de
implementar ORM.
• Faz com que o desenvolvedor não precise utilizar uma linguagem específica para fazer a
comunicação entre a aplicação e o BD
15. PROBLEMAS QUE UMA APLICAÇÃO PODE TER DEVIDO
A BANCO
• Um banco com muitas informações e informações espalhadas de formas
complexas podem levar a buscas mais longas
• Buscas mais longas aumentam o tempo necessário para um sistema
responder a uma solicitação
• O aumento na demora para responder uma solicitação faz com que a conexão
ao banco de dados fique ocupada por mais tempo
• Uma aplicação respondendo a solicitações de usuário pode ser representado
como um atendente numa loja de roupas
16. CAUSAS
• Buscas pouco eficientes
• Fazem com que o sistema faça múltiplas buscas ao banco para pegar todas as
informações necessárias
• Ex em rails:
• Temos uma tabela de vendedores que possui uma relação 1:1 com uma tabela de endereços e
queremos uma contagem dos vendedores por cidade
• vendedores = {cariocas: Vendedor.joins(:addresses).where(addresses: { city: 'Rio de Janeiro'
}).size, paulistas: Vendedor.joins(:addresses).where(addresses: { city: 'São Paulo' }).size}
• Essa operação realiza 2 buscas ao banco de dados
17. SOLUÇÃO
• Para essa situação, vale criar uma busca mais complexa retornando todos os
resultados em uma única busca usando SQL puro
• Ex: resultado = ActiveRecord::Baseconnect.execute(“SELECT SUM(CASE WHEN
addresses.city='Rio de Janeiro' THEN 1 ELSE 0 END) AS cariocas, SUM(CASE WHEN
addresses.city='São Paulo' THEN 1 ELSE 0 END) AS paulistas FROM vendedores INNER
JOIN addresses on users.address_id = addresses.id”)
• Já essa operação faz apenas uma única busca no banco de dados
18. AGORA UM CÓDIGO DE EXEMPLO
• Link para o repositório: https://github.com/RafaelPrallon/exemplo_bd
• No app de exemplo temos as seguintes tabelas com os seus atributos e associações:
1:1
Tabela shops
id: int
codinome: string
Tabela addresses
id: int
rua: string
numero: string
complemento: string
bairro: string
cidade: string
shop_id: int
19. NO APLICATIVO DE EXEMPLO USAREMOS 2 MÉTODOS
PARA EXIBIR AS LOJAS COM AS SUAS CIDADES:
Método 1: Coletando apenas as lojas e usando o ActiveRecord para coletar informações sobre as associações:
No controller:
• def list_method_1
• @shops = Shop.all
• End
Na view:
• @shops.each do |shop|
• puts shop.codinome + " - " + shop.address.cidade
• end
20. Método 2: Utilizando um método do ActiveRecord que nos permite fazer a busca diretamente por SQL
No controller:
•def list_method_1
•@shops = Shop.special_list
•End
No modelo:
•def self.special_list
•find_by_sql('SELECT shops.id, shops.codinome, addresses.cidade FROM shops INNER JOIN addresses ON
addresses.shop_id = shops.id')
•end
Na view:
•@shops.each do |shop|
•puts shop.codinome + " - " + shop.address.cidade
•end
21. DIFERENÇA NO CARREGAMENTO DA PÁGINA
Método 1:
Log:
Processing by ShopsController#list_method_1 as HTML
Rendering shops/list_method_1.html.erb within layouts/application
[1m[36mShop Load (0.8ms)[0m [1m[34mSELECT "shops".* FROM "shops"[0m
↳ app/views/shops/list_method_1.html.erb:2
[1m[36mAddress Load (0.5ms)[0m [1m[34mSELECT "addresses".* FROM "addresses" WHERE
"addresses"."shop_id" = $1 LIMIT $2[0m [["shop_id", 2], ["LIMIT", 1]]
↳ app/views/shops/list_method_1.html.erb:3 ( esse trecho se repete para cada loja no banco)
Rendered shops/list_method_1.html.erb within layouts/application (125.0ms)
Completed 200 OK in 162ms (Views: 133.8ms | ActiveRecord: 27.3ms)
22. DIFERENÇA NO CARREGAMENTO DA PÁGINA
Método 2:
Log:
Processing by ShopsController#list_method_2 as HTML
[1m[36mShop Load (0.8ms)[0m [1m[34mSELECT shops.id, shops.codinome, addresses.cidade FROM shops
INNER JOIN addresses ON addresses.shop_id = shops.id[0m
↳ app/models/shop.rb:7
Rendering shops/list_method_2.html.erb within layouts/application
Rendered shops/list_method_2.html.erb within layouts/application (1.6ms)
Completed 200 OK in 30ms (Views: 21.8ms | ActiveRecord: 0.8ms)
23. VANTAGENS DE CADA MÉTODO
Método 1
• Maior simplicidade para a escrita do código
• Demanda o conhecimento de apenas uma
linguagem
• Caso você precise exibir mais uma informação
da tabela associada basta chamar o valor
• Recomendado para quando você não precisa
coletar informações de tabelas associadas
Método 2
• Permite você coletar apenas as informações
necessárias para exibição
• Por fazer apenas uma única busca no banco de
dados
• Recomendado para quando você precisar
coletar informações de tabelas associadas
24. DESVANTAGENS DE CADA MÉTODO
Método 1
• Pode levar o sistema a realizar múltiplas buscas
no banco de dados tornando a solicitação mais
demorada
• Por carregar tanto instancias da classe Shop
quanto da classe Address, demanda maior
espaço na memória
Método 2
• Requer familiaridade com uma segunda
linguagem
• Qualquer parâmetro adicional que precise ser
exibido exige alterações na busca
• Um má elaboração da busca pode fazer com que
a mesma acabe demandando mais meméria
Função 1: Seleciona todos os atributos de entradas da tabela chamada usuários onde o atributo deleted_at não é nuloFunção 2: Descreve a tabela usuariosFunção 3: Insere na tabela usuários uma entrada com os atributos presentes dentro do parênteses em ordem de exposição