SQL Academy · Oppitunti

JSONB vai JSON: milloin kumpaakin käytetään

Valitse oikea tallennusmuoto JSONin (teksti, säilyttää tyhjätilan) ja JSONB:n (binäärinen, indeksoitava, avaimet deduplikoitu) välillä.

Oppitunti 1/413 vaihetta

JSONB vai JSON: milloin kumpaakin käytetään on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

PostgreSQL:n kaksi JSON-tyyppiä

  • JSON — tallentaa kirjoittamanne tarkan tekstin
  • JSONB — hajotettu binäärimuoto, jossa avaimet poistetaan duplikaateista ja joka voidaan indeksoida

JSON: tekstin tallennus

JSON säilyttää tyhjeet, avainten järjestyksen ja päällekkäiset avaimet. Se jäsennetään uudelleen jokaisella lukukerralla. GIN-indeksointia ei ole. Se on lähes koskaan väärä valinta uuteen koodiin.

INSERT INTO docs (data) VALUES ('{"a": 1, "a": 2}'::JSON);
SELECT data->'a' FROM docs;     -- whatever the parser picks

JSONB: binäärinen ja indeksoitava

JSONB:

  • Tallennetaan hajotettuna → uudelleenjäsennystä ei tarvita luettaessa
  • Päällekkäiset avaimet yhdistetään (viimeinen voittaa)
  • Avainten järjestystä ei säilytetä
  • Tukee GIN-indeksointia
  • Tukee monipuolisia polkuoperaattoreita

JSONB-esimerkki

Yksinkertainen tapahtumataulu:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  data JSONB NOT NULL
);

INSERT INTO events (data) VALUES
  ('{"type":"login","user_id":42,"ip":"1.2.3.4"}');

Polkuoperaattorit

JSONB:llä on monipuoliset operaattorit (joita käsitellään seuraavalla oppitunnilla):

SELECT data->'user_id'   FROM events;       -- → JSONB
SELECT data->>'user_id'  FROM events;       -- → TEXT
SELECT data #>> '{user,name}' FROM events;  -- nested text path

Sisältäminen

Hyödyllisin JSONB-operaattori: @> (sisältää).

SELECT * FROM events WHERE data @> '{"type":"login"}';

-- Combined with a GIN index, this is fast even on billions of rows.

JSONB:n yhtäsuuruus

Kaksi JSONB-arvoa ovat yhtä suuria, jos niiden sisältö täsmää — avainten järjestyksellä ei ole merkitystä:

SELECT '{"a":1,"b":2}'::JSONB = '{"b":2,"a":1}'::JSONB;    -- TRUE

Tyyppien välinen muunnos

Muuntaa voi vapaasti:

SELECT '{"a":1}'::JSONB->'a';                -- 1 (as JSONB)
SELECT ('{"a":1}'::JSONB)->>'a';             -- '1' (as TEXT)
SELECT ('{"a":1}'::JSONB)->'a'::INT;          -- 1 (as INT after extraction)

Milloin JSONB:tä EI pidä käyttää

Jos tiedolla on kiinteä rakenne, käyttäkää oikeita sarakkeita:

  • Nopeammat kyselyt (asiakirjaa ei jäsennetä jokaisella rivillä)
  • Vahvat tyypit ja rajoitteet
  • Pienempi tallennustilan tarve
  • Paremmat tilastot

JSONB on parhaimmillaan, kun rakenne vaihtelee tai kehittyy nopeasti.

Hybridirakenteen suunnittelu

Hyvä käytäntö: käyttäkää vakaille kentille rakenteisia sarakkeita ja vaihteleville lisätiedoille JSONB:tä:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  extra JSONB NOT NULL DEFAULT '{}'::JSONB
);

Validointi

JSONB tallentaa minkä tahansa kelvollisen JSON:n. Rakenteiset rajoitteet voitte toteuttaa CHECK-rajoitteilla tai sovelluskerroksen skeeman valvonnalla:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type');

Kertaus

JSONB > JSON lähes kaikissa tuotantotapauksissa.

  • JSONB: binäärinen, indeksoitu ja nopeat polut
  • JSON: vain tekstin mukainen tallennus ja palautus
  • Käyttäkää JSONB:tä vaihteleviin rakenteisiin ja oikeita sarakkeita kiinteisiin rakenteisiin

Pikatarkistus

Suunnittelette uutta taulua käyttäjien lataamien JSON-asiakirjojen tallentamiseen ja aiotte tehdä niistä sisältöön perustuvia hakuja. JSON vai JSONB?

Aloita maksutta

Opi SQL tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”JSONB vai JSON: milloin kumpaakin käytetään” ilmainen?

Kyllä – oppitunnin ”JSONB vai JSON: milloin kumpaakin käytetään” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”JSONB vai JSON: milloin kumpaakin käytetään”?

Valitse oikea tallennusmuoto JSONin (teksti, säilyttää tyhjätilan) ja JSONB:n (binäärinen, indeksoitava, avaimet deduplikoitu) välillä. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”JSONB vai JSON: milloin kumpaakin käytetään”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. JSONB vai JSON: milloin kumpaakin käytetään
  2. Polkuoperaattorit: -> ->> @>
  3. JSONB:n indeksointi GIN-indekseillä
  4. Tietomallinnus: milloin JSONB voittaa normalisoinnin
← Takaisin: SQL Academy