Ag cur JSONB in ​​ionad EAV in PostgreSQL

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 (AonĂĄn-TrĂ©ith-Luach), 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 AigĂ©an Digiteach Ubuntu 14.04 Tar Ă©is roinnt paraimĂ©adair a chumrĂș i postgresql.conf rith mĂ© seo 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 jsonb_set(), 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 seo 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Ă© ANAILÍS MÍNITHE 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 GIN 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 Ă©:

Ag cur JSONB in ​​ionad EAV in PostgreSQL

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):

Ag cur JSONB in ​​ionad EAV in PostgreSQL

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+

Ag cur JSONB in ​​ionad EAV in PostgreSQL

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

Ceannaigh ĂłstĂĄil iontaofa do shuĂ­mh le cosaint DDoS, freastalaithe VPS VDS đŸ”„ Ceannaigh ĂłstĂĄil grĂ©asĂĄin iontaofa le cosaint DDoS, freastalaithe VPS VDS | ProHoster