TL; DR: Is fĂ©idir le JSONB forbairt scĂ©imre bunachar sonraĂ a shimpliĂș go mĂłr gan feidhmĂocht na gceisteanna a Ăobairt.
Réamhrå
Tabhair dĂșinn sampla clasaiceach de dĂłcha gurb Ă© ceann de na cĂĄsanna ĂșsĂĄide is sine sa domhan de bhunachar sonraĂ coibhneasta (bunachar sonraĂ): tĂĄ eintiteas againn, agus nĂ mĂłr dĂșinn airĂonna ĂĄirithe (trĂ©ithe) an eintitis seo a shĂĄbhĂĄil. Ach nĂ fhĂ©adfaidh an tsraith maoine cĂ©anna a bheith ag gach cĂĄs, agus fĂ©adfar nĂos mĂł maoine a chur leis sa todhchaĂ.
Is Ă© an bealach is Ă©asca chun an fhadhb seo a rĂ©iteach nĂĄ colĂșn a chruthĂș sa tĂĄbla bunachar sonraĂ do gach luach maoine, agus go simplĂ lĂon isteach na cinn atĂĄ ag teastĂĄil le haghaidh sampla aonĂĄin ar leith. Go hiontach! Fadhb rĂ©itithe... go dtĂ go mbeidh na milliĂșin taifead ar do tĂĄbla agus go gcaithfidh tĂș taifead nua a chur leis.
Smaoinigh ar an bpatrĂșn EAV (), tarlaĂonn sĂ© sĂĄch minic. TĂĄ eintitis (taifid) i dtĂĄbla amhĂĄin, tĂĄ ainmneacha maoine (trĂ©ithe) i dtĂĄbla amhĂĄin, agus dĂ©anann an trĂĂș tĂĄbla aonĂĄin a chomhlachĂș lena dtrĂ©ithe agus tĂĄ luach na dtrĂ©ithe sin ann don aonĂĄn reatha. Tugann sĂ© seo an cumas duit tacair Ă©agsĂșla maoine a bheith agat le haghaidh rudaĂ Ă©agsĂșla, agus freisin airĂonna a chur ar an eitilt gan struchtĂșr an bhunachair sonraĂ a athrĂș.
Mar sin fĂ©in, nĂ bheinn ag scrĂobh an phoist seo mura mbeadh roinnt mĂbhuntĂĄistĂ ag baint le cur chuige EVA. Mar sin, mar shampla, chun aonĂĄn amhĂĄin nĂł nĂos mĂł a bhfuil 1 aitreabĂșid an ceann acu a fhĂĄil, tĂĄ 2 cheangal ag teastĂĄil sa cheist: is nasc Ă© an chĂ©ad cheann leis an tĂĄbla aitreabĂșide, is nasc Ă© an dara ceann leis an tĂĄbla luachanna. MĂĄ tĂĄ 2 airĂ ag aonĂĄn, beidh 4 nasc ag teastĂĄil! Ina theannta sin, dĂ©antar na trĂ©ithe go lĂ©ir a stĂłrĂĄil go hiondĂșil mar theaghrĂĄin, rud a fhĂĄgann cineĂĄl-rĂ©itigh don toradh agus don chlĂĄsal WHERE. MĂĄ scrĂobhann tĂș go leor ceisteanna, tĂĄ sĂ© seo go leor cur amĂș Ăł thaobh ĂșsĂĄid acmhainnĂ.
In ainneoin na n-easnamh soilĂ©ire seo, baineadh ĂșsĂĄid as EAV le fada chun na cineĂĄlacha fadhbanna seo a rĂ©iteach. Easnaimh dosheachanta a bhĂ iontu seo, agus nĂ raibh aon rogha eile nĂos fearr ann.
Ach ansin bhĂ âteicneolaĂochtâ nua le feiceĂĄil i PostgreSQL ...
Ag tosĂș le PostgreSQL 9.4, cuireadh an cineĂĄl sonraĂ JSONB leis chun sonraĂ dĂ©nĂĄrtha JSON a stĂłrĂĄil. CĂ© go dtĂłgann stĂłrĂĄil JSON san fhormĂĄid seo beagĂĄn nĂos mĂł spĂĄis agus ama nĂĄ gnĂĄth-thĂ©acs JSON, tĂĄ sĂ© i bhfad nĂos tapĂșla oibrĂochtaĂ a dhĂ©anamh air. TacaĂonn JSONB le hinnĂ©acsĂș freisin, rud a fhĂĄgann go bhfuil fiosruithe nĂos tapĂșla fĂłs.
Ligeann cineĂĄl sonraĂ JSONB dĂșinn an patrĂșn EAV achrannach a athsholĂĄthar trĂ cholĂșn JSONB amhĂĄin a chur lenĂĄr dtĂĄbla aonĂĄin, rud a shimplĂonn dearadh bunachar sonraĂ go mĂłr. Ach ĂĄitĂonn go leor gur chĂłir go mbeadh laghdĂș ar thĂĄirgiĂșlacht ag gabhĂĄil leis seo ... Sin an fĂĄth a scrĂobh mĂ© an t-alt seo.
Bunachar sonraĂ tĂĄstĂĄla a bhunĂș
Chun an chomparĂĄid seo a dhĂ©anamh, chruthaigh mĂ© an bunachar sonraĂ ar shuiteĂĄil Ășr PostgreSQL 9.5 ar an tĂłgĂĄil $80 Ubuntu 14.04 Tar Ă©is roinnt paraimĂ©adair a chumrĂș i postgresql.conf rith mĂ© Script ag baint ĂșsĂĄide as psql. CruthaĂodh na tĂĄblaĂ seo a leanas chun na sonraĂ a chur i lĂĄthair i bhfoirm EAV:
CREATE TABLE entity (
id SERIAL PRIMARY KEY,
name TEXT,
description TEXT
);
CREATE TABLE entity_attribute (
id SERIAL PRIMARY KEY,
name TEXT
);
CREATE TABLE entity_attribute_value (
id SERIAL PRIMARY KEY,
entity_id INT REFERENCES entity(id),
entity_attribute_id INT REFERENCES entity_attribute(id),
value TEXT
);
Anseo thĂos tĂĄ tĂĄbla ina stĂłrĂĄlfar na sonraĂ cĂ©anna, ach le trĂ©ithe i gcolĂșn den chineĂĄl JSONB - airĂonna.
CREATE TABLE entity_jsonb (
id SERIAL PRIMARY KEY,
name TEXT,
description TEXT,
properties JSONB
);
BreathnaĂonn sĂ© i bhfad nĂos simplĂ, nach ea? Ansin cuireadh leis na tĂĄblaĂ aonĂĄin Ă© (aonĂĄn & aonĂĄn_jsonb) 10 milliĂșn taifead, agus dĂĄ rĂ©ir sin, lĂonadh an tĂĄbla leis na sonraĂ cĂ©anna ag baint ĂșsĂĄide as patrĂșn EAV agus an cur chuige le colĂșn JSONB - eintiteas_jsonb.airĂonna. Mar sin, fuaireamar roinnt cineĂĄlacha sonraĂ Ă©agsĂșla i measc an tsraith iomlĂĄn maoine. SonraĂ samplacha:
{
id: 1
name: "Entity1"
description: "Test entity no. 1"
properties: {
color: "red"
lenght: 120
width: 3.1882420
hassomething: true
country: "Belgium"
}
}Mar sin anois tĂĄ na sonraĂ cĂ©anna againn don dĂĄ rogha. A ligean ar tĂșs a chur i gcomparĂĄid implementations ag an obair!
Simpligh do dhearadh
DĂșradh roimhe seo go ndearnadh dearadh an bhunachair sonraĂ a shimpliĂș go mĂłr: tĂĄbla amhĂĄin, trĂ cholĂșn JSONB a ĂșsĂĄid le haghaidh maoine, in ionad trĂ thĂĄbla a ĂșsĂĄid le haghaidh EAV. Ach conas a lĂ©irĂtear Ă© seo in iarratais? Is cosĂșil seo a leanas le rĂ©admhaoin aonĂĄin amhĂĄin a nuashonrĂș:
-- EAV
UPDATE entity_attribute_value
SET value = 'blue'
WHERE entity_attribute_id = 1
AND entity_id = 120;
-- JSONB
UPDATE entity_jsonb
SET properties = jsonb_set(properties, '{"color"}', '"blue"')
WHERE id = 120;
Mar a fheiceann tĂș, nĂl cuma nĂos simplĂ ar an iarratas deiridh. Chun luach airĂ i rĂ©ad JSONB a nuashonrĂș nĂ mĂłr dĂșinn an fheidhm a ĂșsĂĄid , agus ba cheart go n-Ă©ireodh linn ĂĄr luach nua mar rĂ©ad JSONB. Mar sin fĂ©in, nĂ gĂĄ aon aitheantĂłir a bheith ar eolas againn roimh rĂ©. Ag fĂ©achaint ar an sampla EAV, nĂ mĂłr dĂșinn an t-eintiteas_id agus an t-eintiteas_attribute_id araon a bheith ar an eolas chun an nuashonrĂș a dhĂ©anamh. MĂĄs mian leat airĂ i gcolĂșn JSONB a nuashonrĂș bunaithe ar ainm an rĂ©ada, dĂ©antar Ă© sin in aon lĂne shimplĂ amhĂĄin.
Anois roghnaigh muid an t-aonĂĄn a nuashonraĂomar bunaithe ar a dhath nua:
-- EAV
SELECT e.name
FROM entity e
INNER JOIN entity_attribute_value eav ON e.id = eav.entity_id
INNER JOIN entity_attribute ea ON eav.entity_attribute_id = ea.id
WHERE ea.name = 'color' AND eav.value = 'blue';
-- JSONB
SELECT name
FROM entity_jsonb
WHERE properties ->> 'color' = 'blue';
SĂlim gur fĂ©idir linn a aontĂș go bhfuil an dara ceann nĂos giorra (gan aon cheangal!), agus mar sin nĂos inlĂ©ite. Bhuaigh JSONB anseo! ĂsĂĄidimid an t-oibreoir JSON ->> chun an dath a fhĂĄil mar luach tĂ©acs Ăłn oibiacht JSONB. TĂĄ bealach eile ann freisin leis an toradh cĂ©anna a bhaint amach i mĂșnla JSONB ag baint ĂșsĂĄide as an oibreoir @>:
-- JSONB
SELECT name
FROM entity_jsonb
WHERE properties @> '{"color": "blue"}';
TĂĄ sĂ© seo beagĂĄn nĂos casta: dĂ©anaimid seiceĂĄil fĂ©achaint an bhfuil rĂ©ad atĂĄ ar thaobh na lĂĄimhe deise den oibreoir @> san oibiacht JSON ina cholĂșn airĂonna. NĂos lĂș inlĂ©ite, nĂos tĂĄirgiĂșla (fĂ©ach thĂos).
DĂ©anaimis nĂos fusa fĂłs JSONB a ĂșsĂĄid nuair is gĂĄ duit ilairĂonna a roghnĂș ag an am cĂ©anna. Seo an ĂĄit a dtagann an cur chuige JSONB isteach i ndĂĄirĂre: nĂ dhĂ©anaimid ach airĂonna a roghnĂș mar cholĂșin bhreise inĂĄr sraith torthaĂ gan gĂĄ le ceangail:
-- JSONB
SELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb
WHERE id = 120;
Le EAV beidh 2 cheangal uait le haghaidh gach rĂ©admhaoine is mian leat a cheistiĂș. Is Ă© mo thuairim go lĂ©irĂonn na ceisteanna thuas simpliĂș mĂłr i ndearadh bunachar sonraĂ. FĂ©ach ar nĂos mĂł samplaĂ de conas fiosrĂșchĂĄin JSONB a scrĂobh, freisin i post.
Anois tĂĄ sĂ© in am labhairt faoi fheidhmĂocht.
TĂĄirgiĂșlacht
Chun feidhmĂocht a chur i gcomparĂĄid a d'ĂșsĂĄid mĂ© i bhfiosruithe, chun am forghnĂomhaithe a rĂomh. Rinneadh gach ceist ar a laghad trĂ huaire mar go dtĂłgann an pleanĂĄlaĂ fiosrĂșchĂĄin nĂos faide den chĂ©ad uair. Ar dtĂșs rith mĂ© na ceisteanna gan aon innĂ©acsanna. Ar ndĂłigh, bhĂ sĂ© seo ina bhuntĂĄiste ag JSONB, mar nĂorbh fhĂ©idir leis na naisc a theastaĂonn le haghaidh EAV innĂ©acsanna a ĂșsĂĄid (nĂor innĂ©acsaĂodh prĂomhrĂ©imsĂ eachtracha). Ina dhiaidh seo chruthaigh mĂ© innĂ©acs ar an 2 cholĂșn eochair choigrĂche den tĂĄbla luach EAV, chomh maith le hinnĂ©acs le haghaidh colĂșn JSONB.
LĂ©irigh an nuashonrĂș sonraĂ na torthaĂ seo a leanas i dtĂ©armaĂ ama (in ms). Tabhair faoi deara gur scĂĄla logartamach Ă©:

Feicimid go bhfuil JSONB i bhfad (> 50000-x) nĂos tapĂșla nĂĄ EAV mura n-ĂșsĂĄideann tĂș innĂ©acsanna, ar an gcĂșis atĂĄ luaite thuas. Nuair a dhĂ©anaimid innĂ©acsĂș ar cholĂșin le heochracha prĂomhĂșla, imĂonn an difrĂocht beagnach, ach tĂĄ JSONB fĂłs 1,3 huaire nĂos tapĂșla nĂĄ EAV. Tabhair faoi deara nach bhfuil aon Ă©ifeacht ag an innĂ©acs ar an gcolĂșn JSONB anseo toisc nach bhfuilimid ag baint ĂșsĂĄide as an gcolĂșn maoine sna critĂ©ir mheastĂłireachta.
Chun sonraĂ a roghnĂș bunaithe ar luach maoine, faighimid na torthaĂ seo a leanas (gnĂĄthscĂĄla):

FĂ©adfaidh tĂș a thabhairt faoi deara go n-oibrĂonn JSONB arĂs nĂos tapĂșla nĂĄ EAV gan innĂ©acsanna, ach nuair a bhĂonn EAV le hinnĂ©acsanna, oibrĂonn sĂ© nĂos tapĂșla fĂłs nĂĄ JSONB. Ach ansin chonaic mĂ© go raibh na hamanna le haghaidh fiosrĂșchĂĄin JSONB mar an gcĂ©anna, spreag sĂ© seo dom nach n-oibrĂonn innĂ©acsanna GIN. De rĂ©ir dealraimh, nuair a ĂșsĂĄideann tĂș innĂ©acs GIN ar cholĂșn a bhfuil airĂonna daonra ann, nĂ bhĂonn Ă©ifeacht leis ach nuair a bhĂonn oibreoir san ĂĄireamh @> in ĂșsĂĄid. Bhain mĂ© ĂșsĂĄid as seo i dtĂĄstĂĄil nua agus bhĂ tionchar mĂłr aige ar an am: ach 0,153ms! TĂĄ sĂ© seo 15000 uair nĂos tapĂșla nĂĄ EAV agus 25000 uair nĂos tapĂșla nĂĄ an ->> oibreoir.
Ceapaim go raibh sé tapa go leor!
Bunachar sonraà méid tåbla
DĂ©anaimis comparĂĄid idir na mĂ©ideanna tĂĄbla don dĂĄ chur chuige. I psql is fĂ©idir linn mĂ©id na dtĂĄblaĂ agus na n-innĂ©acs go lĂ©ir a thaispeĂĄint ag baint ĂșsĂĄide as an ordĂș dti+

Maidir leis an gcur chuige EAV, tĂĄ mĂ©ideanna tĂĄbla thart ar 3068 MB agus innĂ©acsanna suas le 3427 MB le haghaidh iomlĂĄn de 6,43 GB. ĂsĂĄideann cur chuige JSONB 1817 MB don tĂĄbla agus 318 MB do na hinnĂ©acsanna, is Ă© sin 2,08 GB. Casadh sĂ© amach 3 huaire nĂos lĂș! Chuir an fhĂric seo ionadh beag orm mar go stĂłrĂĄlann muid ainmneacha maoine i ngach rĂ©ad JSONB.
Ach fĂłs fĂ©in, labhraĂonn na huimhreacha ar a son fĂ©in: in EAV stĂłrĂĄlaimid 2 eochair choigrĂche slĂĄnuimhir in aghaidh an luach aitreabĂșide, as a dtagann 8 mbeart de shonraĂ breise. Ina theannta sin, stĂłrĂĄlann EAV gach luach maoine mar thĂ©acs, agus ĂșsĂĄidfidh JSONB luachanna uimhriĂșla agus boolean go hinmheĂĄnach nuair is fĂ©idir, agus beidh lorg nĂos lĂș mar thoradh air.
TorthaĂ
Ar an iomlĂĄn, ceapaim go bhfĂ©adfar i bhfad nĂos Ă©asca do bhunachar sonraĂ a dhearadh agus a chothabhĂĄil mĂĄ shĂĄbhĂĄlann tĂș airĂonna aonĂĄin i bhformĂĄid JSONB. MĂĄ tĂĄ go leor ceisteanna ĂĄ rith agat, oibreoidh gach rud sa tĂĄbla cĂ©anna leis an eintiteas i ndĂĄirĂre ar bhealach nĂos Ă©ifeachtaĂ. Agus is buntĂĄiste Ă© an bhfĂric go simplĂonn sĂ© seo an t-idirghnĂomhĂș idir sonraĂ cheana fĂ©in, ach tĂĄ an bunachar sonraĂ mar thoradh air 3 huaire nĂos lĂș i mĂ©id.
Chomh maith leis sin, bunaithe ar na tĂĄstĂĄlacha a rinneadh, is fĂ©idir linn a thabhairt i gcrĂch go bhfuil na caillteanais feidhmĂochta an-neamhshuntasach. I gcĂĄsanna ĂĄirithe, tĂĄ JSONB fiĂș nĂos tapĂșla nĂĄ EAV, rud a fhĂĄgann go bhfuil sĂ© nĂos fearr fĂłs. Mar sin fĂ©in, ar ndĂłigh, nĂ chlĂșdaĂonn an tagarmharc seo gach gnĂ© (m.sh. eintitis a bhfuil lĂon an-mhĂłr maoine acu, mĂ©adĂș suntasach ar lĂon maoine na sonraĂ atĂĄ ann cheana fĂ©in,...), mar sin mĂĄ tĂĄ aon mholtaĂ agat maidir le conas iad a fheabhsĂș , bĂodh leisce ort fĂĄgĂĄil sna tuairimĂ!
Foinse: will.com
