Te whakakapi i te EAV me JSONB i PostgreSQL

TL; DR: Ka taea e JSONB te whakangwari i te whanaketanga aronuinga raraunga me te kore e pau te mahi uiui.

Whakataki

Me homai he tauira matarohia o tetahi o nga keehi whakamahi tawhito rawa atu o te ao o te paaunga paaunga (papaunga raraunga): he hinonga to tatou, me tiaki e tatou etahi taonga (huanga) o tenei hinonga. Engari ehara i te mea he rite te huinga o nga waahi katoa, katahi ka taapirihia etahi atu taonga a muri ake nei.

Ko te huarahi ngawari ki te whakaoti i tenei raru ko te hanga i tetahi pou ki te ripanga papaa raraunga mo ia uara taonga, me te whakakii noa i nga mea e hiahiatia ana mo tetahi tauira hinonga motuhake. Rawe! Kua whakatauhia te raru... kia mau ra ano he miriona rekoata kei roto i to ripanga ka hiahia koe ki te taapiri i tetahi rekoata hou.

Whakaarohia te tauira EAV (Huanga-Huanga-Uara), he maha nga wa ka puta. Kei roto i tetahi ripanga nga hinonga (nga rekoata), kei roto i tetahi atu ripanga nga ingoa taonga (huanga), ka hono tetahi ripanga tuatoru i nga hinonga me o raatau huanga, kei roto hoki te uara o aua huanga mo te hinonga o naianei. Ma tenei ka taea e koe te whai huinga momo taonga mo nga taonga rereke, me te taapiri i nga taonga i runga i te rere me te kore e whakarereke i te hanganga papaarangi.

Heoi ano, kare au e tuhi i tenei panui mena karekau he kino o te huarahi EVA. Na, hei tauira, ki te whiwhi i tetahi, neke atu ranei nga hinonga he 1 nga huanga mo ia, e 2 nga hononga e hiahiatia ana i roto i te patai: ko te tuatahi he hono ki te ripanga huanga, ko te tuarua he hono ki te ripanga uara. Mēnā e 2 ngā huanga o tētahi hinonga, me 4 ngā hononga! I tua atu, ka penapena nga huanga katoa hei aho, ka puta he momo makanga mo te hua me te rara WHERE. Mena ka tuhia e koe te maha o nga patai, he tino moumou tenei mo te whakamahi rauemi.

Ahakoa enei ngoikoretanga kua kitea, kua roa te whakamahi a EAV ki te whakaoti i enei momo raru. Ko enei ngoikoretanga kare e taea te karo, karekau he huarahi pai ake.
Engari ka puta mai he "hangarau" hou i PostgreSQL...

Ka tiimata me te PostgreSQL 9.4, i taapirihia te momo raraunga JSONB ki te penapena i nga raraunga rua JSON. Ahakoa ko te penapena JSON ki tenei whakatakotoranga he iti ake te waahi me te waa atu i te JSON tuhinga noa, he tere ake te mahi i runga. Ka tautoko hoki a JSONB i te taupū, e tere ake ai nga patai.

Ko te momo raraunga JSONB ka taea e tatou te whakakapi i te tauira EAV uaua ma te taapiri i tetahi pou JSONB ki ta maatau ripanga hinonga, ka tino whakangwarihia te hoahoa papaa raraunga. Engari he tokomaha e tohe ana me whai tahi tenei me te heke o te hua... Koia ahau i tuhi ai i tenei tuhinga.

Te whakarite i te papaunga raraunga whakamatautau

Mo tenei whakataurite, i hanga e ahau te paataka korero mo te whakaurunga hou o PostgreSQL 9.5 i runga i te hanga $80 DigitalOcean Ubuntu 14.04. После настройки некоторых параметров в postgresql.conf я запустил tenei tuhi ma te whakamahi i te psql. I hangaia nga ripanga e whai ake nei hei whakaatu i nga raraunga ki te ahua 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
);

Kei raro nei he ripanga ka penapenahia nga raraunga kotahi, engari me nga huanga kei roto i te momo pou JSONB - āhuatanga.

CREATE TABLE entity_jsonb (
  id          SERIAL PRIMARY KEY, 
  name        TEXT, 
  description TEXT,
  properties  JSONB
);

He maamaa ake te ahua, kaore? Kātahi ka tāpirihia ki ngā ripanga hinonga (hinonga & entity_jsonb) 10 miriona nga rekoata, na reira, i whakakiia te teepu ki nga raraunga ano ma te whakamahi i te tauira EAV me te huarahi ki te pou JSONB - entity_jsonb.properties. No reira, he maha nga momo raraunga rereke i whakawhiwhia ki a matou i roto i te huinga katoa o nga taonga. Tauira raraunga:

{
  id:          1
  name:        "Entity1"
  description: "Test entity no. 1"
  properties:  {
    color:        "red"
    lenght:       120
    width:        3.1882420
    hassomething: true
    country:      "Belgium"
  } 
}

Na inaianei he rite nga raraunga mo nga whiringa e rua. Me timata taatau ki te whakataurite i nga whakatinanatanga i te mahi!

Whakangwarihia to hoahoa

I korerohia i mua ko te hoahoa papaa raraunga i tino ngawari: kotahi tepu, ma te whakamahi i te pou JSONB mo nga taonga, kaua ki te whakamahi i nga ripanga e toru mo te EAV. Engari me pehea e whakaatuhia ai tenei i roto i nga tono? He penei te ahua o te whakahōu i tetahi taonga hinonga:

-- 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;

Ka taea e koe te kite, ko te tono whakamutunga kaore i te ahua ngawari. Hei whakahou i te uara o tetahi taonga i roto i te ahanoa JSONB me whakamahi te mahi jsonb_set(), me tuku to tatou uara hou hei ahanoa JSONB. Heoi, karekau e tika kia mohio tatou ki tetahi tohu i mua. Ma te titiro ki te tauira EAV, me mohio tatou ki te entity_id me te entity_attribute_id kia taea ai te whakahou. Mena kei te hiahia koe ki te whakahou i tetahi taonga i roto i te pou JSONB i runga i te ingoa ahanoa, ka oti katoa i roto i te raina ngawari.

Inaianei me kowhiria te hinonga katahi ano ka whakahoutia i runga i tana tae hou:

-- 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';

Ki taku whakaaro ka taea e tatou te whakaae he poto ake te tuarua (kaore he whakauru!), na reira ka pai ake te panui. Ka toa a JSONB i konei! Ka whakamahia e matou te JSON ->> kaiwhakahaere ki te tiki i te tae hei uara kuputuhi mai i te ahanoa JSONB. He huarahi tuarua ano ki te whakatutuki i taua hua i roto i te tauira JSONB ma te whakamahi i te @> operator:

-- JSONB 
SELECT name 
FROM entity_jsonb 
WHERE properties @> '{"color": "blue"}';

He uaua ake tenei: ka tirohia mena kei roto i te ahanoa JSON i roto i ona pou taonga he ahanoa kei te taha matau o te @> kaiwhakahaere. He iti ake te panui, he hua ake (tirohia i raro).

Kia ngawari ake te whakamahi i a JSONB ina hiahia koe ki te kowhiri i nga taonga maha i te wa kotahi. Koinei te waahi ka uru mai te huarahi JSONB: ka tohua noa e matou nga taonga hei pou taapiri i roto i ta matou huinga hua kaore he hiahia ki te whakauru:

-- JSONB 
SELECT name
  , properties ->> 'color'
  , properties ->> 'country'
FROM entity_jsonb 
WHERE id = 120;

Ma te EAV ka hiahia koe kia 2 hono mo ia rawa e hiahia ana koe ki te patai. Ki taku whakaaro, ko nga patai i runga ake nei e whakaatu ana i te tino ngawari ki te hoahoa papaunga raraunga. Tirohia etahi atu tauira mo te tuhi patai JSONB, kei roto hoki tenei pou.
Inaianei kua tae ki te wa ki te korero mo te mahi.

Te whai hua

Hei whakataurite i nga mahi i whakamahia e au WHAKAMAHI TE WHAKAMAHI i roto i nga patai, hei tatau i te wa mahi. E toru nga wa i mahia ai ia patai na te mea he roa ake te wa tuatahi mo te kaiwhakatakoto uiui. Tuatahi ka whakahaerehia e au nga patai kaore he tohu. Ae, he painga tenei mo JSONB, i te mea kaore e taea e nga hononga e hiahiatia ana mo te EAV te whakamahi i nga tohu (kaore nga waahanga matua o kee i taurangi). I muri i tenei ka hanga e ahau he taurangi i runga i nga pou matua e 2 o kee o te ripanga uara EAV, me tetahi tohu tohu. rore mo te tīwae JSONB.

I whakaatuhia e te whakahou raraunga nga hua e whai ake nei mo te wa (i roto i te ms). Kia mahara he taurite te tauine:

Te whakakapi i te EAV me JSONB i PostgreSQL

Ka kite matou he nui ake te JSONB (> 50000-x) tere atu i te EAV mena kaore koe e whakamahi i nga tohu, mo te take kua whakahuahia i runga ake nei. Ina tohuhia e matou nga pou me nga taviri tuatahi, ka tata ngaro te rereketanga, engari he 1,3 nga wa tere ake a JSONB i te EAV. Kia mahara ko te taurangi i runga i te pou JSONB karekau he paanga ki konei i te mea kaore matou i te whakamahi i te pou taonga i roto i nga paearu aro mātai.

Mo te kowhiri raraunga i runga i te uara rawa, ka whiwhi tatou i nga hua e whai ake nei (tauine noa):

Te whakakapi i te EAV me JSONB i PostgreSQL

Ka taea e koe te kite he tere ake te mahi a JSONB i te EAV kaore he tohu, engari ki te EAV me nga tohu, ka tere ake te mahi i a JSONB. Engari ka kite ahau he rite tonu nga wa mo nga patai JSONB, na tenei i akiaki ahau ki te kore e mahi nga tohu tohu GIN. Ko te ahua ka whakamahia e koe he tohu GIN i runga i te pou me nga taonga kua kapi, ka whai mana anake ina whakamahi i te whakauru operator @>. I whakamahia e ahau tenei i roto i te whakamatautau hou a he nui te paanga o te waa: 0,153ms anake! Ko tenei 15000 nga wa tere atu i te EAV me te 25000 nga wa tere atu i te kaiwhakahaere ->>.

Ki taku whakaaro he tere rawa!

Rahi ripanga pātengi raraunga

Kia whakatauritea nga rahi o te ripanga mo nga huarahi e rua. I roto i te psql ka taea e tatou te whakaatu i te rahi o nga ripanga me nga tohu tohu ma te whakamahi i te whakahau dti+

Te whakakapi i te EAV me JSONB i PostgreSQL

Mo te huarahi EAV, tata ki te 3068 MB te rahi o te ripanga me te taurangi ki te 3427 MB mo te katoa o te 6,43 GB. Ko te huarahi JSONB e whakamahi ana i te 1817 MB mo te ripanga me te 318 MB mo nga tohu, ko te 2,08 GB. Ka kitea e 3 nga wa iti ake! I tino miharo ahau na te mea kei te rongoa matou i nga ingoa taonga ki ia mea JSONB.

Heoi ano, ko nga nama te korero mo ratou ano: i roto i te EAV ka penapenahia e matou nga taviri kee 2 mo ia uara huanga, ka puta he 8 paita o nga raraunga taapiri. Hei taapiri, ka tiakina e EAV nga uara taonga katoa hei tuhinga, ka whakamahia e JSONB nga uara tau me nga uara boolean ki roto i nga waahi ka taea, ka iti ake te tapuwae.

Ngā putanga

I te katoa, ki taku whakaaro ko te penapena i nga rawa hinonga ki te whakatakotoranga JSONB ka ngawari ake te hoahoa me te pupuri i to papaunga raraunga. Mena kei te whakahaere koe i te maha o nga patai, katahi ka pupuri i nga mea katoa ki te teepu kotahi ka pai ake te mahi a te hinonga. A ko te meka he maamaa te taunekeneke i waenga i nga raraunga he taapiri kee, engari ko te hua o te paataka e 3 nga wa iti ake te rahinga.

Ano, i runga i nga whakamatautau i mahia, ka taea e tatou te whakatau he iti rawa te ngaro o nga mahi. I etahi wa, he tere ake a JSONB i te EAV, ka pai ake. Heoi, ko tenei tohu tohu o te akoranga kaore e kapi i nga waahanga katoa (hei tauira, nga hinonga he nui rawa nga taonga, he pikinga nui o te maha o nga taonga o nga raraunga o naianei,...), na mena kei a koe etahi whakaaro mo te whakapai ake. , tena koa waiho mai i roto i nga korero!

Source: will.com

Hokona te manaaki pono mo nga waahi me te tiaki DDoS, nga kaiwhakarato VPS VDS 🔥 Hokona he manaaki paetukutuku pono me te tiakitanga DDoS, ngā tūmau VPS VDS | ProHoster