• Nenhum resultado encontrado

YesSQL. Como os recursos avançados do PostgreSQL podem ajudar o desenvolvedor de aplicações rails. quinta-feira, 3 de novembro de 11

N/A
N/A
Protected

Academic year: 2021

Share "YesSQL. Como os recursos avançados do PostgreSQL podem ajudar o desenvolvedor de aplicações rails. quinta-feira, 3 de novembro de 11"

Copied!
30
0
0

Texto

(1)

Como os recursos avançados do PostgreSQL podem ajudar o desenvolvedor de aplicações rails.

(2)

mas antes de mais nada...

• Essa palestra não é...

• ... um início de uma guerra com os entusiastas de opções

NoSQL (me considero um deles).

• ... uma tentativa de pintar o PostgreSQL como a cura de

todos os males.

(3)

prelúdio 2

• Eu, Diogo Biazus:

• Sócio fundador da Softa e

posteriormente Engage

• Equipe de

desenvolvimento do Mailee.me

(4)
(5)

Apresentando: PostgreSQL

• Um elefante? Pensem: Poderoso e robusto (e não gordo e

lento).

• O slogan “The world’s most advanced open source database”

não é exagero.

• https://github.com/postgres/postgres

(6)
(7)

E por que não seria?

• A tecnologia dos SGBDRs é muito madura e evoluiu muito

nos últimos 30 anos.

(8)

Desenvolvedores Rails

• “I don't want my database to be clever!” - DHH • Parecem gostar de DSLs.

• Compreendem “A ferramenta certa para o problema”.

(9)

Usando Constraints

• Se a integridade é importante, o SGDB é seu amigo. • https://github.com/matthuhiggins/foreigner

• add_foreign_key(from_table, to_table, options) • add_index(table, [fields], :unique => true)

(10)

Usando Constraints

• NOT NULL pelamordedeus!!!

• Se usamos um validates_presence_of, porque não usar um

NOT NULL?

• Se usamos um validates_uniqueness_of que tal um daqueles

(11)

Usando Visões no Banco

• Visões podem facilitar a modelagem, criar modelos em níveis

mais altos de abstração.

• Modelos do AR as enxergam normalmente (só para leitura). • Podemos relacioná-las com outros modelos e facilitar nossa

vida (pensem em agregações, slugs, etc...).

(12)

Colisões de Períodos

• Feio:

• Overlaps é um operador sexy e muito pouco usado

• Sexy:

SELECT *

FROM meetings m1, meetings m2

WHERE (m2.starts_at, m2.ends_at) OVERLAPS (m1.starts_at, m1.ends_at)

AND m1.id > m2.id; SELECT *

FROM meetings m1, meetings m2

WHERE (m2.starts_at BETWEEN m1.starts_at AND m1.ends_at OR m2.ends_at BETWEEN m1.starts_at AND m1.ends_at)

(13)
(14)

Geolocalização

• Como calcular distâncias usando lat/lng?

• Geokit: Faz várias coisas, muito bom para geocoding (e bem

popular segundo o ruby-toolbox.com).

• Earthdistance: É rápido para distâncias e áreas (com índices

GiST/GIN).

(15)

Geolocalização

• Todos gostamos de benchmarks!

• Pesquisa de vários raios de 1 a 1.000 metros com 1.590 locais • https://github.com/diogob/test_geokit

• query geokit (288.449,9ms)

(16)

Dados Hierárquicos

• Nested sets approach (https://github.com/collectiveidea/

awesome_nested_set)

• WITH RECURSIVE

(17)

Dados Desestruturados

• Campo serializado em coluna de texto.

• https://github.com/softa/activerecord-postgres-hstore • Hstore, podemos usar índices.

(18)

Dados Desestruturados

• Nesse caso o eixo x é

tempo

• Isso significa que o vermelho

é algumas ordens de magnitude mais rápido

• Claro que poderíamos usar

índices de trigramas para acelerar o azul :D

(19)

Dados Desestruturados

• O salvamento e atualização é transparente, basta salvar um hash

no campo do tipo hstore.

• Registros com chave foo: Person.where("data ? 'foo'")

• Registros onde foo = bar: Person.where("data -> 'foo' = 'bar'") • Agora com índices: Person.where("data @> 'foo=>bar'")

(20)

Full Text Search

• Mecanismo nativo para busca de palavras chave. • Desacentuação (contrib).

• Análise de trigramas (contrib).

• https://github.com/Casecommons/pg_search • https://github.com/tenderlove/texticle

(21)

pg_search

• Multisearch e Search Scopes

• Multisearch: Escopo de pesquisa global, cria tabela adicional :( • Ótimo suporte aos recursos de FTS nativos do PostgreSQL • Suporte aos contribs pg_trgm, fuzzystrmatch e unaccent

(22)

pg_search

class BlogPost < ActiveRecord::Base include PgSearch

pg_search_scope :search_by_title, :against => :title end

class Beer < ActiveRecord::Base include PgSearch

pg_search_scope :search_name, :against => :name, :using => [:tsearch, :trigram, :dmetaphone]

(23)

pg_search e o tsearch

class Superhero < ActiveRecord::Base include PgSearch

pg_search_scope :whose_name_starts_with, :against => :name,

:using => {

:tsearch => {:prefix => true} }

end

batman = Superhero.create :name => 'Batman' batgirl = Superhero.create :name => 'Batgirl' robin = Superhero.create :name => 'Robin'

(24)

Tabelas sem Log de Transação

• Modificação rápida

• Tabela é truncada em caso de falha • Pequeno teste

(25)

Importação em Warp Speed

• A importação de dados de CSV inocente:

require 'csv'

ActiveRecord::Base.transaction do

CSV.foreach("#{Rails.root}/db/test100.csv") do |row|

self.create!(:data1 => row[0], :data2 => row[1], :data3 => row[2], :data4 => row[3])

end end

(26)

Importação em Warp Speed

• A importação de dados de CSV usando copy:

self.pg_copy_from("#{Rails.root}/db/test100.csv", {:delimiter => ','})

(27)

Enquanto isso no mundo

assíncrono

• A libpq implementa chamadas assíncronas há muitos anos, e

elas estão disponíveis na gem pg para ruby

• As conexões do PostgreSQL suportam notificações

assíncronas com LISTEN e NOTIFY, o que o torna uma opção atraente para o pessoal trabalhando com EM, Goliath,

(28)

Precisamos de mais buzzwords

• A Nuvem!

• https://postgres.heroku.com/ • em beta na EY

(29)

Referências

• http://www.postgresql.org • http://david.heinemeierhansson.com/arc/2005_09.html • http://zoomquiet.org/res/scrapbook/ZqFLOSS/data/ 20101118093144/index.html • https://www.ruby-toolbox.com/ •

(30)

http://stackoverflow.com/questions/689458/find-overlapping-Muito Obrigado

Diogo Biazus (@dbiazus) Engage (http://engage.is)

Referências

Documentos relacionados

O pagamento das taxas relativas à emissão de lavarás ou comunicação prévia previstas nos artigos 3.º, 9.º a 10.º e 23.º a 24.º da (TU) pode, por deliberação da

A psicanálise foi acusada de normatizadora (FOUCAULT, 1996) por haver mantido o modelo familiar burguês nuclear como o centro de sua teoria como é manifestado

Se você vai para o mundo da fantasia e não está consciente de que está lá, você está se alienando da realidade (fugindo da realidade), você não está no aqui e

Our contributions are: a set of guidelines that provide meaning to the different modelling elements of SysML used during the design of systems; the individual formal semantics for

2. Identifica as personagens do texto.. Indica o tempo da história. Indica o espaço da história. Classifica as palavras quanto ao número de sílabas. Copia do texto três

Fugiu – forma verbal do verbo “fugir”, no Pretérito Perfeito do Indicativo, na 3.ª pessoa do singular. Forma afirmativa: Eu

Combinaram encontrar-se às 21h

Quero ir com o avô Markus buscar a Boneca-Mais-Linda-do-Mundo, quero andar de trenó, comer maçãs assadas e pão escuro com geleia (17) de framboesa (18).... – Porque é tão