SlideShare a Scribd company logo
PostgreSQL для хипстеров
или почему ваш следующий проект должен быть на PostgreSQL
https://goo.gl/1uAZNi
Кто использует PostgreSQL
• по привычке
• по предложению заказчика
• на хайпе
Как мы выбираем БД?
• по привычке
• по предложению заказчика
• на хайпе
• Исходя из требований
Как мы выбираем БД?
NodeUkraine - Postgresql для хипстеров или почему ваш следующий проект должен быть на PostgreSQL
• 2003 — PG 8.2 - HSTORE
• 2012 — PG 9.2 - JSON
• 2013 — nested HSTORE (proposal) и
JSONB
• 2014 —PG 9.4 - JSONB, forget nested
hstore
• 2018? — SQL/JSON for 10.X or 11
JSON(B) в PostgreSQL
• select * from table where js->’field’ = 'foo' // field match
• where js @> '{"foo": "bar"}' // key-value match top-level
• where js ? 'b'// key exist
• {"a": 1} || {"b": 2} // {a: "1", b: "2"} - concat
• {a: "1", b: "2"} - "a" // {b: "2"} - delete key
JSON(B) в PostgreSQL
Найти "что-нибудь" красное
Table "public.js_test"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
value | jsonb |
select * from js_test;
id |
----+-----------------------------------------------------------------------
1 | [1, "a", true, {"b": "c", "f": false}]
2 | {"a": "blue", "t": [{"color": "red", "width": 100}]}
3 | [{"color": "red", "width": 100}]
4 | {"color": "red", "width": 100}
5 | {"a": "blue", "t": [{"color": "red", "width": 100}], "color": "red"}
6 | {"a": "blue", "t": [{"color": "blue", "width": 100}], "color": "red"}
7 | {"a": "blue", "t": [{"color": "blue", "width": 100}], "colr": "red"}
8 | {"a": "blue", "t": [{"color": "green", "width": 100}]}
9 | {"color": "green", "value": "red", "width": 100}
(9 rows)
WITH RECURSIVE t(id, value) AS (
SELECT * FROM js_test
UNION ALL (
SELECT
t.id,

COALESCE(kv.value, e.value) AS value
FROM t
LEFT JOIN LATERAL jsonb_each(
CASE WHEN jsonb_typeof(t.value) ='object'
THEN t.value ELSE NULL END
) kv ON true
LEFT JOIN LATERAL jsonb_array_elements(
CASE WHEN jsonb_typeof(t.value) = 'array'
THEN t.value ELSE NULL END

) e ON true
WHERE
kv.value IS NOT NULL
OR e.value IS NOT NULL
)
)
SELECT js_test.* FROM (
SELECT id FROM t
WHERE
value @> '{"color":"red"}'
GROUP BY id

) x
JOIN js_test ON js_test.id = x.id;
Найти "что-нибудь" красное
Want some SQL?
SELECT * FROM js_test
WHERE
value @@ '*.color = "red"';
JSQuery
https://github.com/postgrespro/jsquery
• Новый тип данных jsonpath
• Функции для конструирования JSON
• Функции для выполнения запросов к JSON-полям
SQL / JSON (SQL-2016)
SELECT * FROM js_test 

WHERE 

JSON_EXISTS(value, '$.**.color ? (@ == "red")');
JSON - агрегация
NodeUkraine - Postgresql для хипстеров или почему ваш следующий проект должен быть на PostgreSQL
JSON-агрегация
SELECT * FROM users 

LEFT JOIN comments ON comments.user_id = users.id
users.id users.name comments.id comments.text comments.user_id comments.created_at
1 alice 1 hello 1 31.12.2017 23:59:50
1 alice 2 Happy NY! 1 01.01.2018 00:00:10
2 bob 3 You too! 2 01.01.2018 00:00:50
JSON-агрегация
select 

users.*, json_agg(comments.*) as comments

from users
left join comments on comments.user_id = users.id
group by users.id
users.id users.name comments
1 alice [

{ id: 1, text: "hello", created_at: "31.12.2017 23:59:50" }, 

{ id: 2, text: "Happy NY!", created_at: "01.01.2018 00:00:10"}

]
2 bob [{ id: 3, text: "You too!", created_at: "01.01.2018 00:00:50"}]
JSON-агрегация
select 

users.*, json_agg(comments.* ORDER BY created_at DESC) as comments

from users
left join comments on comments.user_id = users.id
group by users.id
users.id users.name comments
1 alice [

{ id: 1, text: "hello", created_at: "31.12.2017 23:59:50" }, 

{ id: 2, text: "Happy NY!", created_at: "01.01.2018 00:00:10"}

]
2 bob [{ id: 3, text: "You too!", created_at: "01.01.2018 00:00:50"}]
Оконные функции
select * from events
id type source_id created_at
1 foo 1
2 bar 2
3 a 1
4 b 2
5 c 3
6 d 1
7 e 1
Последние два события по каждому source_id?
Оконные функции
SELECT ROW_NUMBER() OVER (PARTITION by source_id) as row_number, * from events
row_number id type source_id created_at
1 7 e 1
2 6 d 1
3 3 a 1
4 1 foo 1
1 4 b 2
2 2 bar 2
1 5 c 3
Последние два события по каждому source_id?
Оконные функции
WITH events_cte AS (
SELECT
row_number() OVER (PARTITION by source_id) AS row_number, *
FROM events
) SELECT * FROM events_cte WHERE row_number <= 2
row_nunmber id type source_id created_at
1 7 e 1
2 6 d 1
1 4 b 2
2 2 bar 2
1 5 c 3
Оконные функции
• Все агрегирующие функции
• row_number, rank, dense_rank, percent_rank, cum_dist
• ntile(n)
• lag(value), lead(value)
• first_value, last_value, nth_value
• Много процессов
• Много серверов
Advisory locking
Advisory locking
1.Start transaction
2.pg_try_advisory_lock?
3.if success - start_operation()
4.else abort transaction
5.commit transaction -> release lock
1. Start transaction
2. pg_try_advisory_lock?
3. if success - start_operation()
4. else abort transaction
5. commit transaction -> release lock
process 1 process n…
Foreign Data Wrappers
• csv
• json
• mysql / postgres / oracle
• mongo
• elastic
• rest api
• whatever *
Foreign Data Wrappers
• MongoDB 3.2 now powered by PostgreSQL
• https://www.linkedin.com/pulse/mongodb-32-now-powered-
postgresql-john-de-goes/
Last but not least
• materialized view
• full text search
• pl/v8
• listen / notify
• native partitioning
• PostGIS
• where created_at <= NOW() - interval '5 weeks 2 hours 12
minutes'
• RDS / Aurora
node_modules
• MassiveJS - https://github.com/dmfay/massive-js
• MQL - https://github.com/marpple/MQL



const posts = await QUERY `SELECT * FROM posts WHERE id = ${id}`
• Postgraphile - https://www.graphile.org/postgraphile/
Links
• https://postgresweekly.com
• https://dbweekly.com
• https://github.com/dhamaniasad/awesome-postgres
• https://nodeweekly.com
Статистика переходов
Вопросы?
Спасибо!

More Related Content

What's hot (20)

PPTX
NetPonto - The Future Of C# - NetConf Edition
Paulo Morgado
 
PDF
Async Microservices with Twitter's Finagle
Vladimir Kostyukov
 
PPTX
(Rx).NET' way of async programming (.NET summit 2017 Belarus)
Stas Rivkin
 
PDF
JavaScript 2016 for C# Developers
Rick Beerendonk
 
PPTX
Rx.NET, from the inside out - Codemotion 2018
Stas Rivkin
 
PPTX
Advanced JavaScript
Mahmoud Tolba
 
PPTX
Type Driven Development with TypeScript
Garth Gilmour
 
PDF
Introduction of ES2015
Nakajima Shigeru
 
PDF
Letswift19-clean-architecture
Jung Kim
 
KEY
サイ本 文
Takashi Takizawa
 
PDF
Justjava 2007 Arquitetura Java EE Paulo Silveira, Phillip Calçado
Paulo Silveira
 
PDF
C++ programs
Mukund Gandrakota
 
PPTX
Hacking Go Compiler Internals / GoCon 2014 Autumn
Moriyoshi Koizumi
 
PPTX
MongoDB
hyun soomyung
 
PDF
Reactive, component 그리고 angular2
Jeado Ko
 
PDF
Testing (eng)
Derrick Chao
 
PDF
All I know about rsc.io/c2go
Moriyoshi Koizumi
 
PPTX
Category theory, Monads, and Duality in the world of (BIG) Data
greenwop
 
PDF
CodeFest 2014. Axel Rauschmayer — JavaScript’s variables: scopes, environment...
CodeFest
 
PDF
2016 gunma.web games-and-asm.js
Noritada Shimizu
 
NetPonto - The Future Of C# - NetConf Edition
Paulo Morgado
 
Async Microservices with Twitter's Finagle
Vladimir Kostyukov
 
(Rx).NET' way of async programming (.NET summit 2017 Belarus)
Stas Rivkin
 
JavaScript 2016 for C# Developers
Rick Beerendonk
 
Rx.NET, from the inside out - Codemotion 2018
Stas Rivkin
 
Advanced JavaScript
Mahmoud Tolba
 
Type Driven Development with TypeScript
Garth Gilmour
 
Introduction of ES2015
Nakajima Shigeru
 
Letswift19-clean-architecture
Jung Kim
 
サイ本 文
Takashi Takizawa
 
Justjava 2007 Arquitetura Java EE Paulo Silveira, Phillip Calçado
Paulo Silveira
 
C++ programs
Mukund Gandrakota
 
Hacking Go Compiler Internals / GoCon 2014 Autumn
Moriyoshi Koizumi
 
MongoDB
hyun soomyung
 
Reactive, component 그리고 angular2
Jeado Ko
 
Testing (eng)
Derrick Chao
 
All I know about rsc.io/c2go
Moriyoshi Koizumi
 
Category theory, Monads, and Duality in the world of (BIG) Data
greenwop
 
CodeFest 2014. Axel Rauschmayer — JavaScript’s variables: scopes, environment...
CodeFest
 
2016 gunma.web games-and-asm.js
Noritada Shimizu
 

Similar to NodeUkraine - Postgresql для хипстеров или почему ваш следующий проект должен быть на PostgreSQL (20)

PDF
NoSQL для PostgreSQL: Jsquery — язык запросов
CodeFest
 
PDF
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
Ontico
 
PDF
Postgres vs Mongo / Олег Бартунов (Postgres Professional)
Ontico
 
PDF
Oh, that ubiquitous JSON !
Alexander Korotkov
 
PPTX
Angular2 for Beginners
Oswald Campesato
 
PDF
JSON Processing in the Database using PostgreSQL 9.4 :: Data Wranglers DC :: ...
Ryan B Harvey, CSDP, CSM
 
PDF
Mongoskin - Guilin
Jackson Tian
 
PDF
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Jonathan Katz
 
KEY
PostgreSQLからMongoDBへ
Basuke Suzuki
 
PDF
OrientDB - The 2nd generation of (multi-model) NoSQL
Roberto Franchini
 
PDF
Structure on a freeform world
Ikai (藍奕凱) Lan
 
PPTX
C# 6 and 7 and Futures 20180607
Kevin Hazzard
 
PDF
Python postgre sql a wonderful wedding
Stéphane Wirtel
 
PPTX
PostgreSQL 9.4 JSON Types and Operators
Nicholas Kiraly
 
PDF
JSLT: JSON querying and transformation
Lars Marius Garshol
 
PDF
greenDAO
Mu Chun Wang
 
PDF
Angular Weekend
Troy Miles
 
PDF
Postgre(No)SQL - A JSON journey
Nicola Moretto
 
PDF
Json at work overview and ecosystem-v2.0
Boulder Java User's Group
 
PDF
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Sages
 
NoSQL для PostgreSQL: Jsquery — язык запросов
CodeFest
 
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
Ontico
 
Postgres vs Mongo / Олег Бартунов (Postgres Professional)
Ontico
 
Oh, that ubiquitous JSON !
Alexander Korotkov
 
Angular2 for Beginners
Oswald Campesato
 
JSON Processing in the Database using PostgreSQL 9.4 :: Data Wranglers DC :: ...
Ryan B Harvey, CSDP, CSM
 
Mongoskin - Guilin
Jackson Tian
 
Webscale PostgreSQL - JSONB and Horizontal Scaling Strategies
Jonathan Katz
 
PostgreSQLからMongoDBへ
Basuke Suzuki
 
OrientDB - The 2nd generation of (multi-model) NoSQL
Roberto Franchini
 
Structure on a freeform world
Ikai (藍奕凱) Lan
 
C# 6 and 7 and Futures 20180607
Kevin Hazzard
 
Python postgre sql a wonderful wedding
Stéphane Wirtel
 
PostgreSQL 9.4 JSON Types and Operators
Nicholas Kiraly
 
JSLT: JSON querying and transformation
Lars Marius Garshol
 
greenDAO
Mu Chun Wang
 
Angular Weekend
Troy Miles
 
Postgre(No)SQL - A JSON journey
Nicola Moretto
 
Json at work overview and ecosystem-v2.0
Boulder Java User's Group
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Sages
 
Ad

Recently uploaded (20)

PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PPTX
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
Ad

NodeUkraine - Postgresql для хипстеров или почему ваш следующий проект должен быть на PostgreSQL

  • 1. PostgreSQL для хипстеров или почему ваш следующий проект должен быть на PostgreSQL https://goo.gl/1uAZNi
  • 3. • по привычке • по предложению заказчика • на хайпе Как мы выбираем БД?
  • 4. • по привычке • по предложению заказчика • на хайпе • Исходя из требований Как мы выбираем БД?
  • 6. • 2003 — PG 8.2 - HSTORE • 2012 — PG 9.2 - JSON • 2013 — nested HSTORE (proposal) и JSONB • 2014 —PG 9.4 - JSONB, forget nested hstore • 2018? — SQL/JSON for 10.X or 11 JSON(B) в PostgreSQL
  • 7. • select * from table where js->’field’ = 'foo' // field match • where js @> '{"foo": "bar"}' // key-value match top-level • where js ? 'b'// key exist • {"a": 1} || {"b": 2} // {a: "1", b: "2"} - concat • {a: "1", b: "2"} - "a" // {b: "2"} - delete key JSON(B) в PostgreSQL
  • 8. Найти "что-нибудь" красное Table "public.js_test" Column | Type | Modifiers --------+---------+----------- id | integer | not null value | jsonb | select * from js_test; id | ----+----------------------------------------------------------------------- 1 | [1, "a", true, {"b": "c", "f": false}] 2 | {"a": "blue", "t": [{"color": "red", "width": 100}]} 3 | [{"color": "red", "width": 100}] 4 | {"color": "red", "width": 100} 5 | {"a": "blue", "t": [{"color": "red", "width": 100}], "color": "red"} 6 | {"a": "blue", "t": [{"color": "blue", "width": 100}], "color": "red"} 7 | {"a": "blue", "t": [{"color": "blue", "width": 100}], "colr": "red"} 8 | {"a": "blue", "t": [{"color": "green", "width": 100}]} 9 | {"color": "green", "value": "red", "width": 100} (9 rows)
  • 9. WITH RECURSIVE t(id, value) AS ( SELECT * FROM js_test UNION ALL ( SELECT t.id,
 COALESCE(kv.value, e.value) AS value FROM t LEFT JOIN LATERAL jsonb_each( CASE WHEN jsonb_typeof(t.value) ='object' THEN t.value ELSE NULL END ) kv ON true LEFT JOIN LATERAL jsonb_array_elements( CASE WHEN jsonb_typeof(t.value) = 'array' THEN t.value ELSE NULL END
 ) e ON true WHERE kv.value IS NOT NULL OR e.value IS NOT NULL ) ) SELECT js_test.* FROM ( SELECT id FROM t WHERE value @> '{"color":"red"}' GROUP BY id
 ) x JOIN js_test ON js_test.id = x.id; Найти "что-нибудь" красное
  • 11. SELECT * FROM js_test WHERE value @@ '*.color = "red"'; JSQuery https://github.com/postgrespro/jsquery
  • 12. • Новый тип данных jsonpath • Функции для конструирования JSON • Функции для выполнения запросов к JSON-полям SQL / JSON (SQL-2016) SELECT * FROM js_test 
 WHERE 
 JSON_EXISTS(value, '$.**.color ? (@ == "red")');
  • 15. JSON-агрегация SELECT * FROM users 
 LEFT JOIN comments ON comments.user_id = users.id users.id users.name comments.id comments.text comments.user_id comments.created_at 1 alice 1 hello 1 31.12.2017 23:59:50 1 alice 2 Happy NY! 1 01.01.2018 00:00:10 2 bob 3 You too! 2 01.01.2018 00:00:50
  • 16. JSON-агрегация select 
 users.*, json_agg(comments.*) as comments
 from users left join comments on comments.user_id = users.id group by users.id users.id users.name comments 1 alice [
 { id: 1, text: "hello", created_at: "31.12.2017 23:59:50" }, 
 { id: 2, text: "Happy NY!", created_at: "01.01.2018 00:00:10"}
 ] 2 bob [{ id: 3, text: "You too!", created_at: "01.01.2018 00:00:50"}]
  • 17. JSON-агрегация select 
 users.*, json_agg(comments.* ORDER BY created_at DESC) as comments
 from users left join comments on comments.user_id = users.id group by users.id users.id users.name comments 1 alice [
 { id: 1, text: "hello", created_at: "31.12.2017 23:59:50" }, 
 { id: 2, text: "Happy NY!", created_at: "01.01.2018 00:00:10"}
 ] 2 bob [{ id: 3, text: "You too!", created_at: "01.01.2018 00:00:50"}]
  • 18. Оконные функции select * from events id type source_id created_at 1 foo 1 2 bar 2 3 a 1 4 b 2 5 c 3 6 d 1 7 e 1 Последние два события по каждому source_id?
  • 19. Оконные функции SELECT ROW_NUMBER() OVER (PARTITION by source_id) as row_number, * from events row_number id type source_id created_at 1 7 e 1 2 6 d 1 3 3 a 1 4 1 foo 1 1 4 b 2 2 2 bar 2 1 5 c 3 Последние два события по каждому source_id?
  • 20. Оконные функции WITH events_cte AS ( SELECT row_number() OVER (PARTITION by source_id) AS row_number, * FROM events ) SELECT * FROM events_cte WHERE row_number <= 2 row_nunmber id type source_id created_at 1 7 e 1 2 6 d 1 1 4 b 2 2 2 bar 2 1 5 c 3
  • 21. Оконные функции • Все агрегирующие функции • row_number, rank, dense_rank, percent_rank, cum_dist • ntile(n) • lag(value), lead(value) • first_value, last_value, nth_value
  • 22. • Много процессов • Много серверов Advisory locking
  • 23. Advisory locking 1.Start transaction 2.pg_try_advisory_lock? 3.if success - start_operation() 4.else abort transaction 5.commit transaction -> release lock 1. Start transaction 2. pg_try_advisory_lock? 3. if success - start_operation() 4. else abort transaction 5. commit transaction -> release lock process 1 process n…
  • 24. Foreign Data Wrappers • csv • json • mysql / postgres / oracle • mongo • elastic • rest api • whatever *
  • 25. Foreign Data Wrappers • MongoDB 3.2 now powered by PostgreSQL • https://www.linkedin.com/pulse/mongodb-32-now-powered- postgresql-john-de-goes/
  • 26. Last but not least • materialized view • full text search • pl/v8 • listen / notify • native partitioning • PostGIS • where created_at <= NOW() - interval '5 weeks 2 hours 12 minutes' • RDS / Aurora
  • 27. node_modules • MassiveJS - https://github.com/dmfay/massive-js • MQL - https://github.com/marpple/MQL
 
 const posts = await QUERY `SELECT * FROM posts WHERE id = ${id}` • Postgraphile - https://www.graphile.org/postgraphile/
  • 28. Links • https://postgresweekly.com • https://dbweekly.com • https://github.com/dhamaniasad/awesome-postgres • https://nodeweekly.com