TOP5 – Falsas Suposições de Programadores
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Apresentado no
15 de Maio de 2015
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
DBA PostgreSQL – consultorias e suportes
24x7/8x5
Instrutor dos treinamentos PostgreSQL
Concepção, desenvolvimento e suporte à
produção
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
Instrutor dos treinamentos PostgreSQL
Concepção, desenvolvimento e suporte à
produção
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na prática”
Concepção, desenvolvimento e suporte à
produção
Matheus de Oliveira
<matheus.oliveira@dextra.com.br>
Mais de 15 anos trabalhando de suporte e
consultoria PostgreSQL
http://www.dextra.com.br/
“Crafting Software, Transforming Business”
10 anos e mais de 10 mil profissionais
capacitados em todo o Brasil.
http://www.dextraining.com.br/
“Aprenda com quem faz na prática”
SaaS para análise e monitoramento PostgreSQL
http://www.pganalytics.com.br/
“Facilitando a vida do DBA”
TOP5 
Falsas
Suposições de
Progra-
madores
1. Tratamento
de Data/hora
Tratamento de data/hora
• todo dia tem 24 horas?
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• todo dia tem 24 horas?
◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o
mesmo resultado, certo?
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• todo dia tem 24 horas?
◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o
mesmo resultado, certo?
postgres =# SELECT ts , ts - i n t e r v a l ’1 day’ FROM
datahora;
ts | ?column?
------------------------+------------------------
2015 -10 -19 00:00:00 -02 | 2015 -10 -18 01:00:00 -02
(1 row)
postgres =# SELECT ts , ts - i n t e r v a l ’24 hours ’ FROM
datahora;
ts | ?column?
------------------------+------------------------
2015 -10 -19 00:00:00 -02 | 2015 -10 -17 23:00:00 -03
(1 row)
5 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
◦ a data/hora do servidor não volta, só avança
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Tratamento de data/hora
• Falsa suposições sobre fuso horários:
◦ minha aplicação nunca vai ser usada com diferentes fuso horários
◦ Ok, mas pelo menos os offsets vão ser próximos
◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00,
12:00
◦ a data/hora do cliente e do servidor são iguais
◦ Ok, não iguais, mas bem próximas
◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre!
◦ os servidores estarão todos com o mesmo fuso horário
◦ o fuso horário do servidor não vai mudar
◦ a data/hora do servidor não volta, só avança
◦ ... http://infiniteundo.com/post/25326999628/
falsehoods-programmers-believe-about-time
6 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Não existem “apenas” 24 fuso horários
7 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
2. Pessoas têmnomes, nem sempre
tão simples como
você imagina
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome,
sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome
◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente
compartilhado entre irmãos), nome
◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome,
sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe
◦ José Eduardo Santos Tavares Melo Silva – Brasil
9 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai,
sobrenome, casta
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Pessoas têm nomes, nem sempre tão simples como você
imagina
• É possível validar os caracteres de um nome?
• É possível separar os componentes de um nome (nome, sobrenome,
etc.)?
◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do
pai, nome
◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome
do pai, nome, sobrenome
◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai,
sobrenome, casta
• OBS: Exemplos aproximados, sobrenome é o nome da família ou
como deve-se referenciar com Sr./Sra./etc. Mais detalhes, com
mesmos exemplos, em http:
//www.w3.org/International/questions/qa-personal-names
10 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
◦ Se eu uso “Matheus”, “de Oliveira”:
Autor: DE OLIVEIRA, Matheus.
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Primeiro nome, último nome?
◦ e a senhora “María-Jose Carreño Quiñones”?
◦ e o caro “Mao Ze Dong”?
• Nome, sobrenome?
◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”?
◦ Se eu uso “Matheus”, “de Oliveira”:
Autor: DE OLIVEIRA, Matheus.
◦ “Matheus de”, “Oliveira”:
e-mail: Olá Matheus de, você acaba de ganhar 1 milhão de reais!
11 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
• Legal, e o campo para tratamento Sr./Sra./Dr./etc.?
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Ok, e como devemos criar nossos formulários?
• Não há solução então?
◦ A verdade é que depende do uso, uma solução aceita é pedir:
• Nome completo: ...
• Como devemos chamá-lo: ...
• Legal, e o campo para tratamento Sr./Sra./Dr./etc.?
◦ Alguns tratamentos vêm no início (Dr./Sr./Sra./etc.), outros no fim
(“, PhD”)
12 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
3. Endereços
também não são
tão simples assim
Endereços também não são tão simples assim
• Errado:
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
◦ Nome de rua, cidade, bairro, nunca muda
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Endereços também não são tão simples assim
• Errado:
◦ todo endereço possui um número
◦ Ok, mas se tem número então é numérico (ah?)
◦ pessoas com CEPs semelhantes moram na mesma região
◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram
próximas uma da outra
◦ No mesmo logradouro não existe mais de um CEP
◦ Nome de cidade é único no país
◦ Tá, mas nome de rua é único dentro cidade
◦ Nome de rua, cidade, bairro, nunca muda
◦ ... https://www.mjt.me.uk/posts/
falsehoods-programmers-believe-about-addresses/
14 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
4. Precisão de
pontos utuantes
Precisão de pontos flutuantes
• Devemos usar os tipos double,float,real,... sempre que
trabalhamos com decimais (moeda, volume, etc.)?
16 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Precisão de pontos flutuantes
• Devemos usar os tipos double,float,real,... sempre que
trabalhamos com decimais (moeda, volume, etc.)?
UPDATE venda_item
SET valor_real = valor , qtd_real = qtd ,
valor_double = valor , qtd_double = qtd;
SELECT sum(valor * qtd) AS soma ,
sum(valor_real * qtd_real) AS soma_real ,
sum(valor_double * qtd_double) AS soma_double
FROM venda_item;
soma | soma_real | soma_double
-------------+-----------+------------------
183802.5000 | 183804 | 183802.499999927
◦ soma = numeric/decimal
◦ soma_real = float (4 bytes)
◦ soma_double = double precision (8 bytes)
16 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
5. Concorrência em
bancos de dados
(relacionais)
Concorrência em bancos de dados (relacionais)
• Errado:
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
◦ Inserir ou atualizar um registro:
UPDATE acesso SET contador = contador + 1
WHERE url = p_url AND usuario = p_usuario;
IF (NOT FOUND) THEN
INSERT INTO acesso(url , usuario , contador)
VALUES (p_url , p_usuario , 1);
END IF ;
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Pegar o próximo “id” único para autoincremento:
SELECT max(id) + 1 FROM minha_tabela;
Solução: sequence, serial, auto_increment
◦ Inserir ou atualizar um registro:
UPDATE acesso SET contador = contador + 1
WHERE url = p_url AND usuario = p_usuario;
IF (NOT FOUND) THEN
INSERT INTO acesso(url , usuario , contador)
VALUES (p_url , p_usuario , 1);
END IF ;
Solução: tratamento de erro (falha no INSERT, tenta UPDATE
novamente), MERGE, INSERT OR REPLACE, INSERT ... ON
CONFLICT UPDATE, ...
18 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
Solução: um único UPDATE
UPDATE produtos
SET qtd_estoque = qtd_estoque - NEW.qtd
WHERE produto_id = NEW.produto_id;
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Trigger para atualizar estoque:
SELECT qtd_estoque INTO v_qtd
FROM produtos
WHERE produto_id = NEW.produto_id;
UPDATE produtos
SET qtd_estoque = v_qtd - NEW.qtd
WHERE produto_id = NEW.produto_id;
Solução: um único UPDATE
UPDATE produtos
SET qtd_estoque = qtd_estoque - NEW.qtd
WHERE produto_id = NEW.produto_id;
Ou então, use a cláusula FOR UPDATE no SELECT
19 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
• Ok, mas pelo menos ORDER BY id me traz a ordem de inserção
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Concorrência em bancos de dados (relacionais)
• Errado:
◦ Incoerências relativas à sequências (sequences ou campos
autoincrementais) em ids:
• ids são contínuos (sem buracos)
• SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção
• Ok, mas pelo menos ORDER BY id me traz a ordem de inserção
• Sério? Ah, mas ORDER BY id e ORDER BY data_insercao são
equivalentes
20 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Resumindo...
1. Marcar tempo é complexo, use sempre valor absoluto (ou um tipo
que use-o internamente)
2. Pessoas têm nomes “estranhos”, e não gostam quando você os erra!
3. Vida de carteiro não é fácil
4. float/double/real/... não têm boa precisão
5. Vai ter mais de um usuário em produção, pense sempre em
concorrência
21 / 22
TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
Obrigado!
Dúvidas?
Matheus de Oliveira
matheus.oliveira@dextra.com.br
IRC – irc.freenode.net:
/join #postgresql,#postgresql-br,#dextra
Meu nick: MatheusOl
Twitter: @matioli_matheus
LinkedIn: br.linkedin.com/in/matheusdeoliveira/
SlideShare: slideshare.net/matheus_de_oliveira

TOP5 - Falsas Suposições de Programadores

  • 1.
    TOP5 – FalsasSuposições de Programadores Matheus de Oliveira <matheus.oliveira@dextra.com.br> Apresentado no 15 de Maio de 2015
  • 2.
    Matheus de Oliveira <matheus.oliveira@dextra.com.br> DBAPostgreSQL – consultorias e suportes 24x7/8x5 Instrutor dos treinamentos PostgreSQL Concepção, desenvolvimento e suporte à produção
  • 3.
    Matheus de Oliveira <matheus.oliveira@dextra.com.br> Maisde 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” Instrutor dos treinamentos PostgreSQL Concepção, desenvolvimento e suporte à produção
  • 4.
    Matheus de Oliveira <matheus.oliveira@dextra.com.br> Maisde 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” 10 anos e mais de 10 mil profissionais capacitados em todo o Brasil. http://www.dextraining.com.br/ “Aprenda com quem faz na prática” Concepção, desenvolvimento e suporte à produção
  • 5.
    Matheus de Oliveira <matheus.oliveira@dextra.com.br> Maisde 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ “Crafting Software, Transforming Business” 10 anos e mais de 10 mil profissionais capacitados em todo o Brasil. http://www.dextraining.com.br/ “Aprenda com quem faz na prática” SaaS para análise e monitoramento PostgreSQL http://www.pganalytics.com.br/ “Facilitando a vida do DBA”
  • 6.
  • 7.
  • 8.
    Tratamento de data/hora •todo dia tem 24 horas? 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 9.
    Tratamento de data/hora •todo dia tem 24 horas? ◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o mesmo resultado, certo? 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 10.
    Tratamento de data/hora •todo dia tem 24 horas? ◦ Então, se subtrairmos 1 dia de uma data/hora, ou 24 horas, teremos o mesmo resultado, certo? postgres =# SELECT ts , ts - i n t e r v a l ’1 day’ FROM datahora; ts | ?column? ------------------------+------------------------ 2015 -10 -19 00:00:00 -02 | 2015 -10 -18 01:00:00 -02 (1 row) postgres =# SELECT ts , ts - i n t e r v a l ’24 hours ’ FROM datahora; ts | ?column? ------------------------+------------------------ 2015 -10 -19 00:00:00 -02 | 2015 -10 -17 23:00:00 -03 (1 row) 5 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 11.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 12.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 13.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 14.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 15.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 16.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 17.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 18.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário ◦ o fuso horário do servidor não vai mudar 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 19.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário ◦ o fuso horário do servidor não vai mudar ◦ a data/hora do servidor não volta, só avança 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 20.
    Tratamento de data/hora •Falsa suposições sobre fuso horários: ◦ minha aplicação nunca vai ser usada com diferentes fuso horários ◦ Ok, mas pelo menos os offsets vão ser próximos ◦ os possíveis offsets são -12:00, -11:00, -10:00, ..., 10:00, 11:00, 12:00 ◦ a data/hora do cliente e do servidor são iguais ◦ Ok, não iguais, mas bem próximas ◦ Ok, ok, mas pelo menos a diferença permanece a mesma, sempre! ◦ os servidores estarão todos com o mesmo fuso horário ◦ o fuso horário do servidor não vai mudar ◦ a data/hora do servidor não volta, só avança ◦ ... http://infiniteundo.com/post/25326999628/ falsehoods-programmers-believe-about-time 6 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 21.
    Não existem “apenas”24 fuso horários 7 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 22.
    2. Pessoas têmnomes,nem sempre tão simples como você imagina
  • 23.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 24.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 25.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 26.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome ◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente compartilhado entre irmãos), nome 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 27.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome ◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente compartilhado entre irmãos), nome ◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome, sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 28.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Björk Guðmundsdóttir – Islândia – ordem: nome, sobrenome ◦ Mao Ze Dong – China – ordem: sobrenome, genérico (geralmente compartilhado entre irmãos), nome ◦ María-Jose Carreño Quiñones – Países que falam espanhol – nome, sobrenome do pai (será o sobrenome “principal”), sobrenome da mãe ◦ José Eduardo Santos Tavares Melo Silva – Brasil 9 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 29.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 30.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome ◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome do pai, nome, sobrenome 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 31.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome ◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome do pai, nome, sobrenome ◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai, sobrenome, casta 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 32.
    Pessoas têm nomes,nem sempre tão simples como você imagina • É possível validar os caracteres de um nome? • É possível separar os componentes de um nome (nome, sobrenome, etc.)? ◦ Velikkakathu Sankaran Achuthanandan – Índia – sobrenome, nome do pai, nome ◦ Kogaddu Birappa Timappa Nair – Índia – ordem: nome da vila, nome do pai, nome, sobrenome ◦ Aditya Pratap Singh Chauhan – Índia – ordem: nome, nome do pai, sobrenome, casta • OBS: Exemplos aproximados, sobrenome é o nome da família ou como deve-se referenciar com Sr./Sra./etc. Mais detalhes, com mesmos exemplos, em http: //www.w3.org/International/questions/qa-personal-names 10 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 33.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 34.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 35.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 36.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 37.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? ◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”? 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 38.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? ◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”? ◦ Se eu uso “Matheus”, “de Oliveira”: Autor: DE OLIVEIRA, Matheus. 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 39.
    Ok, e comodevemos criar nossos formulários? • Primeiro nome, último nome? ◦ e a senhora “María-Jose Carreño Quiñones”? ◦ e o caro “Mao Ze Dong”? • Nome, sobrenome? ◦ E como concatenar? “Dong Mao” ao invés de “Mao Dong”? ◦ Se eu uso “Matheus”, “de Oliveira”: Autor: DE OLIVEIRA, Matheus. ◦ “Matheus de”, “Oliveira”: e-mail: Olá Matheus de, você acaba de ganhar 1 milhão de reais! 11 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 40.
    Ok, e comodevemos criar nossos formulários? • Não há solução então? 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 41.
    Ok, e comodevemos criar nossos formulários? • Não há solução então? ◦ A verdade é que depende do uso, uma solução aceita é pedir: • Nome completo: ... • Como devemos chamá-lo: ... 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 42.
    Ok, e comodevemos criar nossos formulários? • Não há solução então? ◦ A verdade é que depende do uso, uma solução aceita é pedir: • Nome completo: ... • Como devemos chamá-lo: ... • Legal, e o campo para tratamento Sr./Sra./Dr./etc.? 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 43.
    Ok, e comodevemos criar nossos formulários? • Não há solução então? ◦ A verdade é que depende do uso, uma solução aceita é pedir: • Nome completo: ... • Como devemos chamá-lo: ... • Legal, e o campo para tratamento Sr./Sra./Dr./etc.? ◦ Alguns tratamentos vêm no início (Dr./Sr./Sra./etc.), outros no fim (“, PhD”) 12 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 44.
    3. Endereços também nãosão tão simples assim
  • 45.
    Endereços também nãosão tão simples assim • Errado: 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 46.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 47.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 48.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 49.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 50.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 51.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 52.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país ◦ Tá, mas nome de rua é único dentro cidade 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 53.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país ◦ Tá, mas nome de rua é único dentro cidade ◦ Nome de rua, cidade, bairro, nunca muda 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 54.
    Endereços também nãosão tão simples assim • Errado: ◦ todo endereço possui um número ◦ Ok, mas se tem número então é numérico (ah?) ◦ pessoas com CEPs semelhantes moram na mesma região ◦ Mas pelo menos duas pessoas com exatamente o mesmo CEP moram próximas uma da outra ◦ No mesmo logradouro não existe mais de um CEP ◦ Nome de cidade é único no país ◦ Tá, mas nome de rua é único dentro cidade ◦ Nome de rua, cidade, bairro, nunca muda ◦ ... https://www.mjt.me.uk/posts/ falsehoods-programmers-believe-about-addresses/ 14 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 55.
  • 56.
    Precisão de pontosflutuantes • Devemos usar os tipos double,float,real,... sempre que trabalhamos com decimais (moeda, volume, etc.)? 16 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 57.
    Precisão de pontosflutuantes • Devemos usar os tipos double,float,real,... sempre que trabalhamos com decimais (moeda, volume, etc.)? UPDATE venda_item SET valor_real = valor , qtd_real = qtd , valor_double = valor , qtd_double = qtd; SELECT sum(valor * qtd) AS soma , sum(valor_real * qtd_real) AS soma_real , sum(valor_double * qtd_double) AS soma_double FROM venda_item; soma | soma_real | soma_double -------------+-----------+------------------ 183802.5000 | 183804 | 183802.499999927 ◦ soma = numeric/decimal ◦ soma_real = float (4 bytes) ◦ soma_double = double precision (8 bytes) 16 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 58.
    5. Concorrência em bancosde dados (relacionais)
  • 59.
    Concorrência em bancosde dados (relacionais) • Errado: 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 60.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 61.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; Solução: sequence, serial, auto_increment 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 62.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; Solução: sequence, serial, auto_increment ◦ Inserir ou atualizar um registro: UPDATE acesso SET contador = contador + 1 WHERE url = p_url AND usuario = p_usuario; IF (NOT FOUND) THEN INSERT INTO acesso(url , usuario , contador) VALUES (p_url , p_usuario , 1); END IF ; 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 63.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Pegar o próximo “id” único para autoincremento: SELECT max(id) + 1 FROM minha_tabela; Solução: sequence, serial, auto_increment ◦ Inserir ou atualizar um registro: UPDATE acesso SET contador = contador + 1 WHERE url = p_url AND usuario = p_usuario; IF (NOT FOUND) THEN INSERT INTO acesso(url , usuario , contador) VALUES (p_url , p_usuario , 1); END IF ; Solução: tratamento de erro (falha no INSERT, tenta UPDATE novamente), MERGE, INSERT OR REPLACE, INSERT ... ON CONFLICT UPDATE, ... 18 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 64.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Trigger para atualizar estoque: SELECT qtd_estoque INTO v_qtd FROM produtos WHERE produto_id = NEW.produto_id; UPDATE produtos SET qtd_estoque = v_qtd - NEW.qtd WHERE produto_id = NEW.produto_id; 19 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 65.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Trigger para atualizar estoque: SELECT qtd_estoque INTO v_qtd FROM produtos WHERE produto_id = NEW.produto_id; UPDATE produtos SET qtd_estoque = v_qtd - NEW.qtd WHERE produto_id = NEW.produto_id; Solução: um único UPDATE UPDATE produtos SET qtd_estoque = qtd_estoque - NEW.qtd WHERE produto_id = NEW.produto_id; 19 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 66.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Trigger para atualizar estoque: SELECT qtd_estoque INTO v_qtd FROM produtos WHERE produto_id = NEW.produto_id; UPDATE produtos SET qtd_estoque = v_qtd - NEW.qtd WHERE produto_id = NEW.produto_id; Solução: um único UPDATE UPDATE produtos SET qtd_estoque = qtd_estoque - NEW.qtd WHERE produto_id = NEW.produto_id; Ou então, use a cláusula FOR UPDATE no SELECT 19 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 67.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 68.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) • SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 69.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) • SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção • Ok, mas pelo menos ORDER BY id me traz a ordem de inserção 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 70.
    Concorrência em bancosde dados (relacionais) • Errado: ◦ Incoerências relativas à sequências (sequences ou campos autoincrementais) em ids: • ids são contínuos (sem buracos) • SELECT ... FROM tabela (sem ORDER BY), traz na ordem de inserção • Ok, mas pelo menos ORDER BY id me traz a ordem de inserção • Sério? Ah, mas ORDER BY id e ORDER BY data_insercao são equivalentes 20 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 71.
    Resumindo... 1. Marcar tempoé complexo, use sempre valor absoluto (ou um tipo que use-o internamente) 2. Pessoas têm nomes “estranhos”, e não gostam quando você os erra! 3. Vida de carteiro não é fácil 4. float/double/real/... não têm boa precisão 5. Vai ter mais de um usuário em produção, pense sempre em concorrência 21 / 22 TOP5 – Falsas Suposićões de Programadores | Matheus de Oliveira | DevCamp 2015
  • 72.
    Obrigado! Dúvidas? Matheus de Oliveira matheus.oliveira@dextra.com.br IRC– irc.freenode.net: /join #postgresql,#postgresql-br,#dextra Meu nick: MatheusOl Twitter: @matioli_matheus LinkedIn: br.linkedin.com/in/matheusdeoliveira/ SlideShare: slideshare.net/matheus_de_oliveira