Kad imaš PostgreSQL ne treba ti NoSQL Stjepan Zlodi, Styria medijski servisi
Kad imaš PostgreSQL ne trebati 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,000downloads! Or, as their other two partitionsreported, 9,999,323 and 10,001,403downloads.via Twitter
5
Students find 40k unprotected MongoDBdatabases, 8 million telco customer recordsexposedThree 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 spremanjeJSON-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