Нетрадиционное                  использование Ruby и                       PostgreSQL                            Иван Евту...
вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
вторник, 18 декабря 12 г.
О чем этот доклад?                    • О смерти Ruby?                    • О чем-то, что будет полезно?вторник, 18 декабр...
• ruby внутри vim                    • ruby и PostgreSQL (полезная часть)                    • ruby и PostgreSQL (бесполез...
Ruby и Vim                    • :help ruby                    • 200 строк документации                    • пару десятков ...
$ pwd         /Users/brun/Projects/vim/src        $ wc if_ruby.c           1346 3621 35552 if_ruby.cвторник, 18 декабря 12...
Этого достаточно                    • волшебные методы Vim.command и                            Vim.evaluateвторник, 18 де...
Vim.command                    • выполняет любую команду командного                            режима Vim             :rub...
Vim.evaluate                    • вычисляет любое выражение в vim         :ruby puts Vim.evaluate(‘2012’).class         Fi...
Проблемы                    • нет eval, но есть pyeval() :-(                    • я не нашел хороших примеров             ...
вторник, 18 декабря 12 г.
function! Serpinski()     ruby << EOF     def draw(arr, x, y)       arr[x][y] = *     end     def carpet(arr, size, x, y) ...
• :call Serpinski()                    • :nmap <F7> :call Serpinski() <CR>вторник, 18 декабря 12 г.
HSTORE                    • расширение в PostgreSQL                    • хранить ключ-значение                    • нет вл...
CREATE table test(id serial, value hstore); “ заполним таблицу тестовыми данными CREATE INDEX ON test USING GIN(value); EX...
serialize                    • http://apidock.com/rails/ActiveRecord/Base/                            serialize/class     ...
Спецсредства  https://github.com/engageis/activerecord-postgres-hstore rails	  g	  model	  User	  email:string	  value:hst...
explain SELECT "users".* FROM "users"     WHERE (value @> name=>Ivan);                    QUERY PLAN     -----------------...
Arrays                    • В PostgreSQL есть массивы однотипных                            элементов                    •...
class CreateBooks <  ActiveRecord::Migration    def change      create_table :books do |t|        t.text :name        t.te...
create index on books using  gin(authors);  Book.create! :authors => ["Ivan  Evtukhovich", "Ivan Samsonov"]  Book.where("a...
explain select * from books whereauthors @> ARRAY[Ivan Samsonov];QUERY PLAN---------------------------------- Bitmap Heap ...
Хипстерское                             хранилище                    • документоориентированное                    • schem...
Имя?                    • rake                    • rdebug                    • rmagick                    • rdocвторник, ...
Имя?                    • cruisecontrol.rb                    • perftools.rb                    • gdb.rbвторник, 18 декабр...
r_____.rbвторник, 18 декабря 12 г.
rmongo.rbвторник, 18 декабря 12 г.
Прообраз                    • http://docs.mongodb.org/manual/tutorial/                            getting-started/        ...
вторник, 18 декабря 12 г.
Реализовано                    • find                    • insert                    • count                    • ensureInd...
Live           Demoвторник, 18 декабря 12 г.
Формат документа?вторник, 18 декабря 12 г.
YAMLвторник, 18 декабря 12 г.
Как и обещал                    • документоориентированное √                    • schemaless √                    • быстры...
Что внутри?вторник, 18 декабря 12 г.
pl/ruby                    • https://github.com/globegit/postgresql-                            plruby                    ...
Table "public.things"                Column | Type    |               --------+---------+                id     | integer ...
• Со вставкой все понятно                    • А с поиском?вторник, 18 декабря 12 г.
db.things.find("title" => "Книга")      SELECT * FROM things WHERE        rmongorb_get_key(title::text, value) = Книга    ...
Быстрый поиск                    • функциональные индексы в PostgreSQL                    • http://www.postgresql.org/docs...
db.things.ensureIndex(      {"last_name" => 1})    CREATE INDEX ON things    (rmongorb_get_key(      last_name::text, valu...
EXPLAIN SELECT * FROM things WHERE rmongorb_get_key(last_name::text, value) =   Сидоров ; QUERY PLAN ---------------------...
Быстрая запись                    • synchronous_commit = on                    • http://www.postgresql.org/docs/9.2/static...
Что еще можно                               сделать?                    • вложенные ключи                    • join на сам...
Спасибо!                                 @rubynoname                                  @evtuhovich                         ...
Upcoming SlideShare
Loading in …5
×

Нетрадиционное использование Ruby и PostgreSQL

1,637 views

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,637
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Нетрадиционное использование Ruby и PostgreSQL

  1. 1. Нетрадиционное использование Ruby и PostgreSQL Иван Евтуховичвторник, 18 декабря 12 г.
  2. 2. вторник, 18 декабря 12 г.
  3. 3. вторник, 18 декабря 12 г.
  4. 4. вторник, 18 декабря 12 г.
  5. 5. О чем этот доклад? • О смерти Ruby? • О чем-то, что будет полезно?вторник, 18 декабря 12 г.
  6. 6. • ruby внутри vim • ruby и PostgreSQL (полезная часть) • ruby и PostgreSQL (бесполезная часть)вторник, 18 декабря 12 г.
  7. 7. Ruby и Vim • :help ruby • 200 строк документации • пару десятков функцийвторник, 18 декабря 12 г.
  8. 8. $ pwd /Users/brun/Projects/vim/src $ wc if_ruby.c 1346 3621 35552 if_ruby.cвторник, 18 декабря 12 г.
  9. 9. Этого достаточно • волшебные методы Vim.command и Vim.evaluateвторник, 18 декабря 12 г.
  10. 10. Vim.command • выполняет любую команду командного режима Vim :ruby Vim.command(‘help ruby’) :help rubyвторник, 18 декабря 12 г.
  11. 11. Vim.evaluate • вычисляет любое выражение в vim :ruby puts Vim.evaluate(‘2012’).class Fixnumвторник, 18 декабря 12 г.
  12. 12. Проблемы • нет eval, но есть pyeval() :-( • я не нашел хороших примеров использования • VimLвторник, 18 декабря 12 г.
  13. 13. вторник, 18 декабря 12 г.
  14. 14. function! Serpinski() ruby << EOF def draw(arr, x, y) arr[x][y] = * end def carpet(arr, size, x, y) if size == 1 draw(arr, x, y) else new_size = size / 3 carpet(arr, new_size, x, y) carpet(arr, new_size, x + new_size, y) carpet(arr, new_size, x + new_size * 2, y) carpet(arr, new_size, x, y + new_size) carpet(arr, new_size, x + new_size * 2, y + new_size) carpet(arr, new_size, x, y + new_size * 2) carpet(arr, new_size, x + new_size, y + new_size * 2) carpet(arr, new_size, x + new_size * 2, y + new_size * 2) end end arr = Array.new(27) { Array.new } carpet(arr, 27, 0, 0) arr.each_with_index do |line, i| l = line.map { |e| e.nil? ? : e } Vim::Buffer.current.append(Vim::Buffer.current.line_number + i, l.join()) end EOF endfunctionвторник, 18 декабря 12 г.
  15. 15. • :call Serpinski() • :nmap <F7> :call Serpinski() <CR>вторник, 18 декабря 12 г.
  16. 16. HSTORE • расширение в PostgreSQL • хранить ключ-значение • нет вложенности • ключ и значение — строки • CREATE EXTENSION hstoreвторник, 18 декабря 12 г.
  17. 17. CREATE table test(id serial, value hstore); “ заполним таблицу тестовыми данными CREATE INDEX ON test USING GIN(value); EXPLAIN SELECT value -> 111 FROM test WHERE value ? 111; QUERY PLAN ------------------------------------------------------------------------------ Bitmap Heap Scan on test (cost=12.01..16.02 rows=1 width=114) Recheck Cond: (value ? 111::text) -> Bitmap Index Scan on test_value_idx (cost=0.00..12.01 rows=1 width=0) Index Cond: (value ? 111::text)вторник, 18 декабря 12 г.
  18. 18. serialize • http://apidock.com/rails/ActiveRecord/Base/ serialize/class class User < ActiveRecord::Base serialize :preferences endвторник, 18 декабря 12 г.
  19. 19. Спецсредства https://github.com/engageis/activerecord-postgres-hstore rails  g  model  User  email:string  value:hstore User.where("value ? name") User.where("value @> name=>Ivan") SELECT "users".* FROM "users" WHERE (value @> name=>Ivan)вторник, 18 декабря 12 г.
  20. 20. explain SELECT "users".* FROM "users" WHERE (value @> name=>Ivan); QUERY PLAN ------------------------------------------ Index Scan using test_value_idx on users (cost=0.00..8.27 rows=1 width=182) Index Cond: (value @> "name"=>"Ivan"::hstore)вторник, 18 декабря 12 г.
  21. 21. Arrays • В PostgreSQL есть массивы однотипных элементов • Поддержка массивов pg появилась в rails 4 • Есть бэкпорт в rails 3 • https://github.com/tlconnor/activerecord- postgres-arrayвторник, 18 декабря 12 г.
  22. 22. class CreateBooks < ActiveRecord::Migration def change create_table :books do |t| t.text :name t.text_array :authors t.timestamps end end endвторник, 18 декабря 12 г.
  23. 23. create index on books using gin(authors); Book.create! :authors => ["Ivan Evtukhovich", "Ivan Samsonov"] Book.where("authors @> ARRAY[Ivan Samsonov]")вторник, 18 декабря 12 г.
  24. 24. explain select * from books whereauthors @> ARRAY[Ivan Samsonov];QUERY PLAN---------------------------------- Bitmap Heap Scan on books(cost=8.03..16.49 rows=4 width=84) Recheck Cond: (authors @> {"IvanSamsonov"}::text[]) -> Bitmap Index Scan onbooks_authors_idx (cost=0.00..8.03rows=4 width=0) Index Cond: (authors @> {"IvanSamsonov"}::text[])вторник, 18 декабря 12 г.
  25. 25. Хипстерское хранилище • документоориентированное • schemaless • быстрый поиск • быстрая запись • без join-ов • web scaleвторник, 18 декабря 12 г.
  26. 26. Имя? • rake • rdebug • rmagick • rdocвторник, 18 декабря 12 г.
  27. 27. Имя? • cruisecontrol.rb • perftools.rb • gdb.rbвторник, 18 декабря 12 г.
  28. 28. r_____.rbвторник, 18 декабря 12 г.
  29. 29. rmongo.rbвторник, 18 декабря 12 г.
  30. 30. Прообраз • http://docs.mongodb.org/manual/tutorial/ getting-started/ • early pre alfa version • продукт не будет развиватьсявторник, 18 декабря 12 г.
  31. 31. вторник, 18 декабря 12 г.
  32. 32. Реализовано • find • insert • count • ensureIndexвторник, 18 декабря 12 г.
  33. 33. Live Demoвторник, 18 декабря 12 г.
  34. 34. Формат документа?вторник, 18 декабря 12 г.
  35. 35. YAMLвторник, 18 декабря 12 г.
  36. 36. Как и обещал • документоориентированное √ • schemaless √ • быстрый поиск √ • быстрая запись √ • без join-ов √ • web scale √вторник, 18 декабря 12 г.
  37. 37. Что внутри?вторник, 18 декабря 12 г.
  38. 38. pl/ruby • https://github.com/globegit/postgresql- plruby • хрен поставишь • только ruby 1.8.x • не завелся на PostgreSQL 9.2 • добровольцы?вторник, 18 декабря 12 г.
  39. 39. Table "public.things" Column | Type | --------+---------+ id | integer | value | text |вторник, 18 декабря 12 г.
  40. 40. • Со вставкой все понятно • А с поиском?вторник, 18 декабря 12 г.
  41. 41. db.things.find("title" => "Книга") SELECT * FROM things WHERE rmongorb_get_key(title::text, value) = Книга CREATE OR REPLACE FUNCTION rmongorb_get_key(key text, value text) RETURNS text AS require "yaml" obj = YAML.load(value) obj[key] LANGUAGE plruby IMMUTABLE;вторник, 18 декабря 12 г.
  42. 42. Быстрый поиск • функциональные индексы в PostgreSQL • http://www.postgresql.org/docs/9.2/static/ indexes-expressional.htmlвторник, 18 декабря 12 г.
  43. 43. db.things.ensureIndex( {"last_name" => 1}) CREATE INDEX ON things (rmongorb_get_key( last_name::text, value))вторник, 18 декабря 12 г.
  44. 44. EXPLAIN SELECT * FROM things WHERE rmongorb_get_key(last_name::text, value) = Сидоров ; QUERY PLAN ------------------------------------- Index Scan using things_rmongorb_get_key_idx2 on things (cost=0.25..20.53 rows=4 width=222) Index Cond: (rmongorb_get_key(last_name::text, value) = Сидоров::text)вторник, 18 декабря 12 г.
  45. 45. Быстрая запись • synchronous_commit = on • http://www.postgresql.org/docs/9.2/static/ wal-async-commit.htmlвторник, 18 декабря 12 г.
  46. 46. Что еще можно сделать? • вложенные ключи • join на самом деле есть :-) • sharding • http://ssql-railsconf.herokuapp.com/вторник, 18 декабря 12 г.
  47. 47. Спасибо! @rubynoname @evtuhovich evtuhovich@gmail.com http://blog.evtuhovich.ru/вторник, 18 декабря 12 г.

×