Kad imaš PostgreSQL ne treba ti NoSQL
Transcript of Kad imaš PostgreSQL ne treba ti NoSQL
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