Kad imaš PostgreSQL ne treba
ti NoSQL
Stjepan Zlodi, Styria medijski servisi
Tko sam ja?
• 21 godina iskustva s bazama, aplikacijama...
• 6 godina rada na najvećim .hr portalima (24sata.hr, vecernji.hr,
poslovni.hr)
• korisnik i promotor otvorenog koda
• Linux na desktopu 18 godina
• bloger: http://wolfwoodscrowd.info
2
Zašto ljudi koriste NoSQL
• Nema zadane šeme, bez potrebe za migracijom
• Nema skupih JOIN-a
• Brzi razvoj/brži rad
• Lako skaliranje
• Velike baze, BigData
• Analitika (MapReduce)
3
Zašto se to pretvori u horror?
• Hrpa podataka, nered, neočekivana iznenađenja
• Nepovezani podaci
• Brže greške
• Većina koristi samo jedan server
• Najveće baze na svijetu su RDBMS (2 Gb podataka u sekundi)
• MapReduce je spor
4
MongoDB announced 10,000,000
downloads! Or,as their other two partitions
reported,9,999,323 and 10,001,403
downloads.
via Twitter
5
Students find 40k unprotected MongoDB
databases,8 million telco customer records
exposed
Three students from University of Saarland in Germany at the Centre for
IT Security – Kai Greshake, Eric Petryka and Jens Heyens – discovered that
MongoDB databases running at TCP port 27017 as a service on several
thousands of commercial web servers are easily accessible on the
Internet.
6
Trebamo li koristiti NoSQL?
• Naravno, ali...
7
Use case: dodaj još jedno polje
• korisnik.my_space, korisnik.orkut
• ...još twitter, facebook
• ...još google+, linkedin
• ...još instagram, pinterest, tumblr, vk, flickr, bika
• Neka korisnici sami dodaju profile s društvenih mreža!!!
8
Use case: dodaj još jedno polje -rješenje
• Tablica drustvene_mreze
• Tablica korisnicki_profili AS kp
• kp.drustvene_mreze (fk)
• kp.profil
• http://en.wikipedia.org/wiki/Entity–attribute–value_model
9
Use case: opravdani razlog za spremanje
JSON-a
• Django primjer: JSONField
• Ispod haube: TextField (PostgreSQL: text)
• Spremanje u bazu: json.encode
• Vraćanje iz baze: json.decode
10
A PostgreSQL?
Spora autentifikacija?
• Najveći dio vremena kod upita troši se na autentifikaciju
• Koristite connection pool
• Django u zadnjim verzijama ima svoje rješenje
• pgpool, PgBouncer
12
PostgreSQL je sporiji
13
Native JSON podrška
• PostgreSQL 9.2 JSON
• JSON tip polja
• validacija, spremanje
• funkcije za dohvat elemenata
• upiti na JSON
14
JSON primjer
CREATE TABLE profili (podaci JSONB);
INSERT INTO profili (podaci) VALUES ('
"name": "Stjepan Zlodi",
"google+": "https://plus.google.com/u/0/+StjepanZlodi",
"twitter": "https://twitter.com/ylodi"
')
15
JSON primjer
SELECT podaci->>'twitter'
FROM profili
WHERE podaci->>'name' == 'Stjepan Zlodi'
16
PostgresSQL 9.3
• Dodan JSON parser i dodatne funkcije
• Direktno slanje JSON podataka u bazu i iz baze
17
PostgresSQL 9.4
• BSON - binary format za spremanje JSON-a
• Ne podržava 64-bitne brojeve s pomičnim zarezom
• Nema veze s MongoDB stvari istog imena
18
Kombinacija ANSI SQL i JSON upita
• SELECT, čak i JOIN
• ROW_TO_JSON funkcija
19
Test
• 50m JSON dokumenata, 60% random tekst, import, 50m unosa, random
upiti
• Import 2.1x brži u Postgresu
• MongoDB zauzima 33% više mjesta na disku
• Insert 3x duže u MongoDB-u
• Upiti 2.5x duži u MongoDB-u
20
HSTORE -key-value
• PostgreSQL 8.2 (2006)
• indeksiranje podataka
• Podrška u Djangu tek od 1.8 (HStoreField)
21
HSTORE primjer
CREATE TABLE profili (podaci HSTORE);
INSERT INTO profili (podaci) VALUES ('
"name": "Stjepan Zlodi",
"google+": "https://plus.google.com/u/0/+StjepanZlodi",
"twitter": "https://twitter.com/ylodi"
');
SELECT hstore_to_json(podaci) FROM profili;
22
Još nekoliko stvari
• Full text search
• Geo podaci, upiti - MongoDB vs. PostGIS
23
Kako mi koristimo NoSQL?
• Memorija je još uvijek brža od diska
• Redis
• Možda RethinkDB - optimiziran za SSD
24
Pitanja?
• e-mail: stjepan@gmail.com
• twitter: https://twitter.com/Ylodi
25

Kad imaš PostgreSQL ne treba ti NoSQL

  • 1.
    Kad imaš PostgreSQLne treba ti NoSQL Stjepan Zlodi, Styria medijski servisi
  • 2.
    Tko sam ja? •21 godina iskustva s bazama, aplikacijama... • 6 godina rada na najvećim .hr portalima (24sata.hr, vecernji.hr, poslovni.hr) • korisnik i promotor otvorenog koda • Linux na desktopu 18 godina • bloger: http://wolfwoodscrowd.info 2
  • 3.
    Zašto ljudi koristeNoSQL • Nema zadane šeme, bez potrebe za migracijom • Nema skupih JOIN-a • Brzi razvoj/brži rad • Lako skaliranje • Velike baze, BigData • Analitika (MapReduce) 3
  • 4.
    Zašto se topretvori u horror? • Hrpa podataka, nered, neočekivana iznenađenja • Nepovezani podaci • Brže greške • Većina koristi samo jedan server • Najveće baze na svijetu su RDBMS (2 Gb podataka u sekundi) • MapReduce je spor 4
  • 5.
    MongoDB announced 10,000,000 downloads!Or,as their other two partitions reported,9,999,323 and 10,001,403 downloads. via Twitter 5
  • 6.
    Students find 40kunprotected MongoDB databases,8 million telco customer records exposed Three students from University of Saarland in Germany at the Centre for IT Security – Kai Greshake, Eric Petryka and Jens Heyens – discovered that MongoDB databases running at TCP port 27017 as a service on several thousands of commercial web servers are easily accessible on the Internet. 6
  • 7.
    Trebamo li koristitiNoSQL? • Naravno, ali... 7
  • 8.
    Use case: dodajjoš jedno polje • korisnik.my_space, korisnik.orkut • ...još twitter, facebook • ...još google+, linkedin • ...još instagram, pinterest, tumblr, vk, flickr, bika • Neka korisnici sami dodaju profile s društvenih mreža!!! 8
  • 9.
    Use case: dodajjoš jedno polje -rješenje • Tablica drustvene_mreze • Tablica korisnicki_profili AS kp • kp.drustvene_mreze (fk) • kp.profil • http://en.wikipedia.org/wiki/Entity–attribute–value_model 9
  • 10.
    Use case: opravdanirazlog za spremanje JSON-a • Django primjer: JSONField • Ispod haube: TextField (PostgreSQL: text) • Spremanje u bazu: json.encode • Vraćanje iz baze: json.decode 10
  • 11.
  • 12.
    Spora autentifikacija? • Najvećidio vremena kod upita troši se na autentifikaciju • Koristite connection pool • Django u zadnjim verzijama ima svoje rješenje • pgpool, PgBouncer 12
  • 13.
  • 14.
    Native JSON podrška •PostgreSQL 9.2 JSON • JSON tip polja • validacija, spremanje • funkcije za dohvat elemenata • upiti na JSON 14
  • 15.
    JSON primjer CREATE TABLEprofili (podaci JSONB); INSERT INTO profili (podaci) VALUES (' "name": "Stjepan Zlodi", "google+": "https://plus.google.com/u/0/+StjepanZlodi", "twitter": "https://twitter.com/ylodi" ') 15
  • 16.
    JSON primjer SELECT podaci->>'twitter' FROMprofili WHERE podaci->>'name' == 'Stjepan Zlodi' 16
  • 17.
    PostgresSQL 9.3 • DodanJSON parser i dodatne funkcije • Direktno slanje JSON podataka u bazu i iz baze 17
  • 18.
    PostgresSQL 9.4 • BSON- binary format za spremanje JSON-a • Ne podržava 64-bitne brojeve s pomičnim zarezom • Nema veze s MongoDB stvari istog imena 18
  • 19.
    Kombinacija ANSI SQLi JSON upita • SELECT, čak i JOIN • ROW_TO_JSON funkcija 19
  • 20.
    Test • 50m JSONdokumenata, 60% random tekst, import, 50m unosa, random upiti • Import 2.1x brži u Postgresu • MongoDB zauzima 33% više mjesta na disku • Insert 3x duže u MongoDB-u • Upiti 2.5x duži u MongoDB-u 20
  • 21.
    HSTORE -key-value • PostgreSQL8.2 (2006) • indeksiranje podataka • Podrška u Djangu tek od 1.8 (HStoreField) 21
  • 22.
    HSTORE primjer CREATE TABLEprofili (podaci HSTORE); INSERT INTO profili (podaci) VALUES (' "name": "Stjepan Zlodi", "google+": "https://plus.google.com/u/0/+StjepanZlodi", "twitter": "https://twitter.com/ylodi" '); SELECT hstore_to_json(podaci) FROM profili; 22
  • 23.
    Još nekoliko stvari •Full text search • Geo podaci, upiti - MongoDB vs. PostGIS 23
  • 24.
    Kako mi koristimoNoSQL? • Memorija je još uvijek brža od diska • Redis • Možda RethinkDB - optimiziran za SSD 24
  • 25.
    Pitanja? • e-mail: stjepan@gmail.com •twitter: https://twitter.com/Ylodi 25