TL; DR: JSONB nwere ike ime ka mmepe atụmatụ nchekwa data dị mfe na-enweghị ịchụ ọrụ ajụjụ.
Okwu Mmalite
Ka anyị nye ihe atụ ama ama nke eleghị anya otu n'ime ikpe kacha ochie eji eme ihe n'ụwa nke nchekwa data mmekọrịta (database): anyị nwere ihe, na anyị kwesịrị ịchekwa ụfọdụ akụrụngwa (àgwà) nke ihe a. Mana ọ bụghị ọnọdụ niile nwere ike ịnwe otu ihe akụrụngwa, yana enwere ike ịgbakwunye ihe ndị ọzọ n'ọdịnihu.
Ụzọ kachasị mfe iji dozie nsogbu a bụ ịmepụta kọlụm na tebụl nchekwa data maka uru ihe onwunwe ọ bụla, ma jupụta naanị ndị achọrọ maka ihe atụ kpọmkwem. Nnukwu! A doziri nsogbu ... ruo mgbe tebụl gị nwere ọtụtụ nde ndekọ ma ịkwesịrị ịgbakwunye ndekọ ọhụrụ.
Tụlee ụkpụrụ EAV (), ọ na-emekarị ọtụtụ ugboro. Otu tebụl nwere ụlọ ọrụ (ndekọ), tebụl ọzọ nwere aha ihe onwunwe (àgwà), na tebụl nke atọ na-ejikọta ụlọ ọrụ na njirimara ha ma nwee uru nke àgwà ndị ahụ maka ihe dị ugbu a. Nke a na-enye gị ike inwe ụdị dị iche iche nke ihe dị iche iche maka ihe dị iche iche, ma tinyekwa ihe onwunwe na ofufe na-enweghị ịgbanwe usoro nchekwa data.
Agbanyeghị, agaghị m ede akwụkwọ ozi a ma ọ bụrụ na enweghị mbelata na ụzọ EVA. Ya mere, dịka ọmụmaatụ, iji nweta otu ma ọ bụ karịa ụlọ ọrụ nwere àgwà 1 nke ọ bụla, a chọrọ njikọ 2 na ajụjụ: nke mbụ bụ njikọ na tebụl àgwà, nke abụọ bụ njikọ na tebụl ụkpụrụ. Ọ bụrụ na otu ụlọ ọrụ nwere njirimara 2, mgbe ahụ 4 sonyere chọrọ! Na mgbakwunye, a na-echekwa njirimara niile dị ka eriri, nke na-ebute ụdị nkedo maka nsonaazụ ya na nkebiokwu WHERE. Ọ bụrụ na ị na-ede ọtụtụ ajụjụ, mgbe ahụ, nke a bụ nnọọ na-ala n'iyi n'usoro nke akụ iji.
N'agbanyeghị adịghị ike ndị a doro anya, EAV adịla anya iji dozie ụdị nsogbu ndị a. Ndị a bụ adịghị ike a na-apụghị izere ezere, ọ dịghịkwa nnọọ ihe ọzọ ka mma.
Mana "teknụzụ" ọhụrụ pụtara na PostgreSQL ...
Malite na PostgreSQL 9.4, agbakwunyere ụdị data JSONB iji chekwaa data ọnụọgụ abụọ JSON. Ọ bụ ezie na ịchekwa JSON n'ụdị a na-ewe ntakịrị ohere na oge karịa ederede JSON dị larịị, ịrụ ọrụ na ya na-adị ngwa ngwa. JSONB na-akwado indexing, nke na-eme ka ajụjụ dị ngwa ngwa.
Ụdị data JSONB na-enye anyị ohere iji dochie ụkpụrụ EAV dị egwu site n'ịgbakwunye naanị otu kọlụm JSONB na tebụl ụlọ ọrụ anyị, na-eme ka nhazi nchekwa data dị mfe. Ma ọtụtụ ndị na-arụ ụka na nke a kwesịrị iso na mbelata arụpụtaghị ihe ... Ya mere m dere isiokwu a.
Ịtọlite nnwale nchekwa data
Maka ntụnyere a, m mepụtara nchekwa data na ntinye ọhụrụ nke PostgreSQL 9.5 na ụlọ $ 80. Ubuntu 14.04 Mgbe m hazie ụfọdụ paramita na postgresql.conf, agbaala m ọsọ script iji psql. Emebere tebụl ndị a iji weta data n'ụdị 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
);
N'okpuru ebe a bụ tebụl ebe a ga-echekwa otu data ahụ, mana nwere njirimara na kọlụm ụdị JSONB - Njirimara.
CREATE TABLE entity_jsonb (
id SERIAL PRIMARY KEY,
name TEXT,
description TEXT,
properties JSONB
);
Ọ dị ka ọ dị mfe karị, ọ bụghị ya? Mgbe ahụ, agbakwunyere ya na tebụl ụlọ ọrụ (agabiga mbara igwe & entity_jsonb) Ndekọ nde 10, ya mere, tebụl ahụ jupụtara na otu data site na iji ụkpụrụ EAV na ụzọ ya na kọlụm JSONB - entity_jsonb.property. Ya mere, anyị nwetara ọtụtụ ụdị data dị iche iche n'etiti ihe niile. Ihe atụ data:
{
id: 1
name: "Entity1"
description: "Test entity no. 1"
properties: {
color: "red"
lenght: 120
width: 3.1882420
hassomething: true
country: "Belgium"
}
}Yabụ ugbu a, anyị nwere otu data maka nhọrọ abụọ ahụ. Ka anyị malite atụnyere mmejuputa iwu na ọrụ!
Mee ka imewe gị dị mfe
Ekwuru na mbụ na imewe nchekwa data dị mfe: otu tebụl, site na iji kọlụm JSONB maka akụrụngwa, kama iji tebụl atọ maka EAV. Ma olee otú nke a si egosipụta na arịrịọ? Imelite otu akụrụngwa dị ka nke a:
-- 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;
Dị ka ị na-ahụ, arịrịọ ikpeazụ anaghị adị mfe karị. Ka imelite uru nke ihe onwunwe dị na ihe JSONB anyị ga-eji ọrụ ahụ , na kwesịrị ịgafe uru ọhụrụ anyị dị ka ihe JSONB. Agbanyeghị, anyị achọghị ịma ihe njirimara ọ bụla tupu oge eruo. N'ilele ihe atụ EAV, anyị kwesịrị ịma ma entity_id na entity_attribute_id iji mee mmelite ahụ. Ọ bụrụ na ịchọrọ imelite akụrụngwa na kọlụm JSONB dabere na aha ihe ahụ, emechara ya n'otu ahịrị dị mfe.
Ugbu a, ka anyị họrọ ihe ndị anyị melitere dabere na agba ọhụrụ ya:
-- 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';
Echere m na anyị nwere ike ikweta na nke abụọ dị mkpụmkpụ (enweghị njikọ!), Ya mere enwere ike ịgụ ya. JSONB meriri ebe a! Anyị na-eji onye ọrụ JSON ->> nweta agba dị ka uru ederede sitere na ihe JSONB. Enwekwara ụzọ nke abụọ iji nweta otu nsonaazụ ahụ na ụdị JSONB site na iji onye ọrụ @>:
-- JSONB
SELECT name
FROM entity_jsonb
WHERE properties @> '{"color": "blue"}';
Nke a dị ntakịrị mgbagwoju anya: anyị na-elele iji hụ ma ihe JSON dị na kọlụm akụrụngwa nwere ihe dị n'aka nri nke onye ọrụ @>. Enwechaghị ike ịgụ ya, na-arụpụtakwu ihe (lee n'okpuru).
Ka anyị mee ka iji JSONB dị mfe karị mgbe ịchọrọ ịhọrọ ọtụtụ akụrụngwa n'otu oge. Nke a bụ ebe usoro JSONB na-abata n'ezie: anyị na-ahọrọ ihe onwunwe dị ka ogidi ndị ọzọ na nsonaazụ anyị setịpụrụ na-enweghị mkpa ijikọ:
-- JSONB
SELECT name
, properties ->> 'color'
, properties ->> 'country'
FROM entity_jsonb
WHERE id = 120;
Site na EAV ị ga-achọ njikọ 2 maka akụrụngwa ọ bụla ịchọrọ ịjụ. N'uche nke m, ajụjụ ndị a dị n'elu na-egosi ịdị mfe na nhazi nchekwa data. Hụ ihe atụ ndị ọzọ nke otu esi ede ajuju na JSONB, dịkwa ike na biputere.
Ugbu a ọ bụ oge ikwu maka arụmọrụ.
Ubu oke
Iji tụnyere arụmọrụ m ji na ajụjụ, iji gbakọọ oge igbu. Emere ajụjụ ọ bụla opekata mpe ugboro atọ n'ihi na onye nhazi ajụjụ na-ewe ogologo oge nke mbụ. Mbụ, agbagara m ajụjụ ndị ahụ n'enweghị index. N'ụzọ doro anya, nke a bụ uru JSONB dị, ebe ọ bụ na njikọ ndị achọrọ maka EAV enweghị ike iji ndeksi (akara igodo mba ọzọ adịghị index). Mgbe nke a gasịrị, m mepụtara ndeksi na kọlụm igodo mba ọzọ 2 nke tebụl uru EAV, yana ndeksi. maka kọlụm JSONB.
Mmelite data gosipụtara nsonaazụ ndị a n'usoro oge (na ms). Rịba ama na ọnụ ọgụgụ ahụ bụ logarithmic:

Anyị na-ahụ na JSONB dị ukwuu (> 50000-x) ngwa ngwa karịa EAV ma ọ bụrụ na ị naghị eji index, n'ihi na ihe mere e kwuru n'elu. Mgbe anyị na-edepụta kọlụm nwere igodo isi, ọdịiche ahụ fọrọ nke nta ka ọ pụọ, mana JSONB ka dị 1,3 ugboro ngwa ngwa karịa EAV. Rịba ama na ndeksi dị na kọlụm JSONB enweghị mmetụta ebe a ebe anyị anaghị eji kọlụm akụrụngwa na njirisi nyocha.
Maka ịhọrọ data dabere na uru akụrụngwa, anyị na-enweta nsonaazụ ndị a (ọkọlọtọ nkịtị):

Ị nwere ike ịhụ na JSONB na-arụ ọrụ ngwa ngwa karịa EAV na-enweghị index, ma mgbe EAV nwere index, ọ ka na-arụ ọrụ ngwa ngwa karịa JSONB. Ma mgbe ahụ ahụrụ m na oge ajụjụ JSONB bụ otu, nke a kpaliri m n'eziokwu na ndepụta GIN anaghị arụ ọrụ. O doro anya na mgbe ị na-eji ndeksi GIN na kọlụm nwere akụrụngwa mmadụ, ọ na-arụ ọrụ naanị mgbe ị na-eji onye ọrụ gụnyere @>. M na-eji nke a na ule ọhụrụ na ọ nwere mmetụta dị ukwuu na oge: naanị 0,153ms! Nke a bụ 15000 ugboro ngwa ngwa karịa EAV na 25000 ugboro ngwa ngwa karịa onye ọrụ ->>.
Echere m na ọ bụ ngwa ngwa zuru oke!
Nha tebụl nchekwa data
Ka anyị tulee nha tebụl maka ụzọ abụọ a. Na psql anyị nwere ike igosi nha nke tebụl na ndeksi niile site na iji iwu ahụ dti+

Maka usoro EAV, nha tebụl dị gburugburu 3068 MB yana ndeksi ruo 3427 MB maka ngụkọta nke 6,43 GB. Usoro JSONB na-eji 1817 MB maka tebụl yana 318 MB maka ndeksi, nke bụ 2,08 GB. Ọ na-apụta ugboro 3 obere! Eziokwu a tụrụ m n'anya ntakịrị n'ihi na anyị na-echekwa aha akụrụngwa n'ihe ọ bụla JSONB.
Ma ka, ọnụ ọgụgụ na-ekwu maka onwe ha: na EAV anyị na-echekwa 2 integer mba ọzọ igodo kwa àgwà uru, na-akpata 8 bytes nke ọzọ data. Na mgbakwunye, EAV na-echekwa ụkpụrụ ihe onwunwe niile dị ka ederede, ebe JSONB ga-eji ọnụọgụ ọnụọgụ na ụkpụrụ boolean n'ime ebe enwere ike, na-ebute obere akara ukwu.
Nsonaazụ
N'ozuzu, echere m na ịchekwa ihe onwunwe n'ụdị JSONB nwere ike ime ka ịmepụta na idobe nchekwa data gị dịkwuo mfe. Ọ bụrụ na ị na-agba ọsọ ọtụtụ ajụjụ, mgbe ahụ idobe ihe niile na otu tebụl dị ka ụlọ ọrụ ga-arụ ọrụ nke ọma karị. Na eziokwu na nke a na-eme ka mmekọrịta dị n'etiti data dị mfe, ma ihe nchekwa data na-akpata bụ ugboro 3 dị ntakịrị na olu.
Ọzọkwa, dabere na ule ndị e mere, anyị nwere ike ikwubi na mfu arụmọrụ adịchaghị mkpa. N'ọnọdụ ụfọdụ, JSONB dị ọbụna ngwa ngwa karịa EAV, na-eme ka ọ dịkwuo mma. Otú ọ dị, akara ngosi a n'ezie anaghị ekpuchi akụkụ niile (dịka ụlọ ọrụ nwere ọnụ ọgụgụ dị ukwuu nke ihe onwunwe, mmụba dị ịrịba ama na ọnụọgụ njirimara nke data dị adị, ...), yabụ ọ bụrụ na ị nwere aro ọ bụla maka otu esi emeziwanye ha. , biko nweere onwe gị ịhapụ na nkwupụta!
isi: www.habr.com
