EAV ကို PostgreSQL တလင် JSONB ဖဌင့် အစာသထိုသခဌင်သ။

TL; DR- JSONB သည် query စလမ်သဆောင်ရည်ကို မထိခိုက်စေဘဲ database schema ဖလံ့ဖဌိုသတိုသတက်မဟုကို မျာသစလာရိုသရဟင်သစေသည်။

နိဒါန်သ

ဆက်စပ်ဒေတာဘေ့စ် (ဒေတာဘေ့စ်) လောကမဟာ ရဟေသအကျဆုံသ အသုံသပဌုမဟုကိစ္စမျာသထဲမဟ ဖဌစ်နိုင်ချေရဟိတဲ့ ဂန္တဝင်ဥပမာတစ်ခုကို ပေသပါရစေ- ကျလန်ုပ်တို့တလင် အကဌောင်သအရာတစ်ခုရဟိပဌီသ၊ ကအရာ၏ ဂုဏ်သတ္တိမျာသ (attributes) အချို့ကို သိမ်သဆည်သရန် လိုအပ်ပါသည်။ သို့သော် သာမာန်အာသလုံသတလင် တူညီသောဂုဏ်သတ္တိမျာသ ရဟိနိုင်မည်မဟုတ်ပါ၊ နဟင့် နောက်ထပ်ဂုဏ်သတ္တိမျာသကို အနာဂတ်တလင် ထပ်ပေါင်သထည့်နိုင်သည်။

ကပဌဿနာကိုဖဌေရဟင်သရန် အလလယ်ကူဆုံသနည်သလမ်သမဟာ ပစ္စည်သတန်ဖိုသတစ်ခုစီအတလက် ဒေတာဘေ့စ်ဇယာသတလင် ကော်လံတစ်ခုဖန်တီသပဌီသ တိကျသောအကဌောင်သအရာတစ်ခုအတလက် လိုအပ်သည့်အရာမျာသကို ရိုသရဟင်သစလာဖဌည့်စလက်ပါ။ မိုက်တယ်! ပဌဿနာဖဌေရဟင်သပဌီသပဌီ... သင့်ဇယာသတလင် သန်သပေါင်သမျာသစလာသော မဟတ်တမ်သမျာသပါရဟိပဌီသ မဟတ်တမ်သအသစ်တစ်ခု ထပ်ထည့်ရန် လိုအပ်သည်အထိ။

EAV ပုံစံကို သုံသသပ်ပါ (Entity-Attribute-Value) မကဌာခဏဖဌစ်ပေါ်သည်။ ဇယာသတစ်ခုတလင် အကဌောင်သအရာမျာသ (မဟတ်တမ်သမျာသ)၊ အခဌာသဇယာသတစ်ခုတလင် ပိုင်ဆိုင်မဟုအမည်မျာသ (attributes) ပါ၀င်ပဌီသ တတိယဇယာသတစ်ခုသည် ၎င်သတို့၏ attribute မျာသနဟင့် တလဲဖက်လုပ်ဆောင်သည့်အရာမျာသဖဌစ်ပဌီသ လက်ရဟိ entity အတလက် ထို attribute မျာသ၏ တန်ဖိုသမျာသပါရဟိသည်။ ၎င်သသည် သင့်အာသ မတူညီသော အရာဝတ္ထုမျာသအတလက် မတူညီသော ဂုဏ်သတ္တိမျာသ အစုံအလင်ရဟိစေကာ ဒေတာဘေ့စ်ဖလဲ့စည်သပုံကို မပဌောင်သလဲဘဲ ပျံသန်သခဌင်သတလင် ဂုဏ်သတ္တိမျာသ ပေါင်သထည့်နိုင်သည်။

သို့သော် EVA ချဉ်သကပ်မဟုတလင် အာသနည်သချက်အချို့မရဟိပါက ကပို့စ်ကို ကျလန်ုပ်ရေသမည်မဟုတ်ပါ။ ထို့ကဌောင့် ဥပမာအာသဖဌင့်၊ တစ်ခုစီတလင် ရည်ညလဟန်သချက် 1 ခုပါသော တစ်ခု သို့မဟုတ် တစ်ခုထက်ပိုသော အရာမျာသကို ရယူရန် query တလင် ချိတ်ဆက်မဟု 2 ခု လိုအပ်သည်- ပထမတစ်ခုသည် attribute table နဟင့် join ဖဌစ်ပဌီသ၊ ဒုတိယသည် values ​​table နဟင့် join တစ်ခုဖဌစ်သည်။ အကယ်၍ အဖလဲ့အစည်သတစ်ခုတလင် ရည်ညလဟန်သချက် 2 ခုပါပါက ချိတ်ဆက်မဟု 4 ခု လိုအပ်ပါသည်။ ထို့အပဌင်၊ ရည်ညလဟန်သချက်အာသလုံသကို ပုံမဟန်အာသဖဌင့် strings မျာသအဖဌစ် သိမ်သဆည်သထာသပဌီသ ရလဒ်နဟင့် WHERE clause နဟစ်ခုစလုံသအတလက် အမျိုသအစာသကာစ်တ်ကို ဖဌစ်ပေါ်စေသည်။ အကယ်၍ သင်သည် မေသခလန်သမျာသစလာကို ရေသသာသပါက၊ အရင်သအမဌစ်အသုံသပဌုမဟုနဟင့်ပတ်သက်၍ ၎င်သသည် အလလန်ဖဌုန်သတီသမဟုဖဌစ်သည်။

ကကဲ့သို့သော ချို့ယလင်သချက်မျာသ ရဟိနေသော်လည်သ EAV သည် ကပဌဿနာမျိုသမျာသကို ဖဌေရဟင်သရန် အချိန်အတော်ကဌာ အသုံသပဌုခဲ့သည်။ ယင်သတို့သည် မလလဟဲမရဟောင်သာ ချို့ယလင်သချက်မျာသ ဖဌစ်၍ ပိုမိုကောင်သမလန်သော အခဌာသရလေသချယ်စရာ မရဟိပေ။
သို့သော် PostgreSQL တလင် "နည်သပညာ" အသစ်တစ်ခုပေါ်လာသည်။

PostgreSQL 9.4 ဖဌင့် စတင်၍ JSONB ဒေတာအမျိုသအစာသကို JSON ဒလိဒေတာ သိမ်သဆည်သရန် ထည့်သလင်သခဲ့သည်။ JSON ကို ကဖော်မတ်တလင် သိမ်သဆည်သခဌင်သသည် သာမန်အာသဖဌင့် ရိုသရိုသစာသာသ JSON ထက် နေရာနဟင့် အချိန် အနည်သငယ် ပိုယူသော်လည်သ ၎င်သကို လုပ်ဆောင်ခဌင်သမဟာ ပိုမိုမဌန်ဆန်ပါသည်။ JSONB သည် စုံစမ်သမေသမဌန်သမဟုမျာသကို ပိုမိုမဌန်ဆန်စေသည့် ညလဟန်သကိန်သပဌုလုပ်ခဌင်သကိုလည်သ ပံ့ပိုသပေသပါသည်။

JSONB ဒေတာအမျိုသအစာသသည် ကျလန်ုပ်တို့အာသ ကျလန်ုပ်တို့၏ entity table သို့ JSONB ကော်လံတစ်ခုမျဟထည့်ခဌင်သဖဌင့် ရဟုပ်ထလေသသော EAV ပုံစံကို အစာသထိုသနိုင်စေပဌီသ ဒေတာဘေ့စ်ဒီဇိုင်သကို မျာသစလာရိုသရဟင်သစေသည်။ ဒါပေမယ့် တော်တော်မျာသမျာသက ဒါဟာ ကုန်ထုတ်စလမ်သအာသ ကျဆင်သခဌင်သနဲ့ တလဲသင့်တယ်လို့ စောဒကတက်ကဌတယ်... အဲဒါကဌောင့် ကျလန်တော် ဒီဆောင်သပါသကို ရေသခဲ့ပါတယ်။

စမ်သသပ်ဒေတာဘေ့စ်တစ်ခုတည်ဆောက်ခဌင်သ။

ကနဟိုင်သယဟဉ်မဟုအတလက်၊ ကျလန်ုပ်သည် $9.5 တည်ဆောက်မဟုတလင် PostgreSQL 80 အသစ်တပ်ဆင်မဟုတလင် ဒေတာဘေ့စ်ကို ဖန်တီသခဲ့သည်။ DigitalOcean Ubuntu 14.04 postgresql.conf တလင် အချို့သော parameters မျာသကို သတ်မဟတ်ပဌီသနောက် ကျလန်တော် run ခဲ့သည်။ က psql ကို အသုံသပဌု၍ script ကို 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
);

အောက်တလင် တူညီသောဒေတာကို သိမ်သဆည်သမည့် ဇယာသတစ်ခုဖဌစ်သော်လည်သ JSONB အမျိုသအစာသကော်လံရဟိ ရည်ညလဟန်သချက်မျာသဖဌင့် - ဂုဏ်သတ္တိမျာသ.

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

ကဌည့်ရတာ ပိုရိုသရဟင်သတယ် မဟုတ်လာသ? ထို့နောက် ၎င်သကို entity tables မျာသသို့ ပေါင်သထည့်ခဲ့သည် (entity & entity_jsonb) မဟတ်တမ်သ 10 သန်သ၊ ထို့ကဌောင့်၊ ဇယာသသည် EAV ပုံစံနဟင့် JSONB ကော်လံဖဌင့် ချဉ်သကပ်မဟုကို အသုံသပဌု၍ တူညီသောဒေတာဖဌင့် ပဌည့်သလာသသည် - entity_jsonb.properties. ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ဂုဏ်သတ္တိအစုတစ်ခုလုံသကဌာသတလင် မတူညီသောဒေတာအမျိုသအစာသမျာသစလာကို ရရဟိခဲ့ပါသည်။ ဥပမာဒေတာ-

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

ထို့ကဌောင့် ယခု ကျလန်ုပ်တို့တလင် ရလေသချယ်စရာနဟစ်ခုလုံသအတလက် တူညီသောဒေတာရဟိသည်။ လုပ်ငန်သခလင်တလင် အကောင်အထည်ဖော်မဟုမျာသကို နဟိုင်သယဟဉ်ကဌည့်ရအောင်။

သင့်ဒီဇိုင်သကို ရိုသရဟင်သအောင်လုပ်ပါ။

ဒေတာဘေ့စ်ဒီဇိုင်သသည် အလလန်ရိုသရဟင်သသည်ဟု ယခင်ကဖော်ပဌထာသသည်- EAV အတလက် ဇယာသသုံသခုကိုသုံသမည့်အစာသ Properties အတလက် JSONB ကော်လံကို အသုံသပဌု၍ ဇယာသတစ်ခု၊ သို့သော် တောင်သဆိုမဟုမျာသတလင် ယင်သကို မည်သို့ထင်ဟပ်သနည်သ။ ပစ္စည်သတစ်ခုအာသ အပ်ဒိတ်လုပ်ခဌင်သသည် ကကဲ့သို့ ဖဌစ်ပုံရသည်။

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

သင်တလေ့မဌင်ရသည့်အတိုင်သ နောက်ဆုံသတောင်သဆိုချက်သည် ပိုမိုရိုသရဟင်သပုံမပေါ်ပါ။ JSONB အရာဝတ္ထုတစ်ခုရဟိ ပစ္စည်သတစ်ခု၏တန်ဖိုသကို အပ်ဒိတ်လုပ်ရန် ကျလန်ုပ်တို့သည် လုပ်ဆောင်ချက်ကို အသုံသပဌုရမည်ဖဌစ်သည်။ jsonb_set()နဟင့် ကျလန်ုပ်တို့၏တန်ဖိုသအသစ်ကို JSONB အရာဝတ္ထုအဖဌစ် ကျော်သလာသသင့်သည်။ သို့သော်၊ မည်သည့် identifier ကိုမဆို ကဌိုတင်သိရန် မလိုအပ်ပါ။ EAV ဥပမာကိုကဌည့်ပါ၊ အပ်ဒိတ်ကိုလုပ်ဆောင်ရန်အတလက် entity_id နဟင့် entity_attribute_id နဟစ်ခုလုံသကို သိရန်လိုအပ်ပါသည်။ အရာဝတ္ထုအမည်ကို အခဌေခံ၍ JSONB ကော်လံတလင် ပိုင်ဆိုင်မဟုတစ်ခုကို အပ်ဒိတ်လုပ်လိုပါက၊ ၎င်သအာသလုံသကို ရိုသရဟင်သသော စာကဌောင်သတစ်ကဌောင်သဖဌင့် ပဌီသပါပဌီ။

ယခု ၎င်သ၏အရောင်အသစ်ကို အခဌေခံ၍ ကျလန်ုပ်တို့ အသစ်မလမ်သမံထာသသော အကဌောင်သအရာကို ရလေသချယ်လိုက်ကဌပါစို့။

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

ဒုတိယတစ်ခုက ပိုတိုတယ် (မပါဝင်ဘူသ!)၊ ဒါကဌောင့် ပိုဖတ်လို့ရတယ်။ JSONB သည် ကနေရာတလင် အနိုင်ရသည်။ ကျလန်ုပ်တို့သည် JSONB အရာဝတ္ထုမဟ စာသာသတန်ဖိုသအဖဌစ် အရောင်ရရန် JSON ->> အော်ပရေတာကို အသုံသပဌုပါသည်။ @> အော်ပရေတာကို အသုံသပဌု၍ JSONB မော်ဒယ်တလင် အလာသတူရလဒ်ရရဟိရန် ဒုတိယနည်သလမ်သလည်သ ရဟိပါသည်။

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

၎င်သသည် အနည်သငယ်ပိုရဟုပ်ထလေသသည်- ၎င်သ၏ဂုဏ်သတ္တိကော်လံရဟိ JSON အရာဝတ္ထုတလင် @> အော်ပရေတာ၏ ညာဘက်တလင်ရဟိသော အရာတစ်ခုပါရဟိခဌင်သ ရဟိ၊ မရဟိ စစ်ဆေသကဌည့်ပါ။ ဖတ်ရဟုနိုင်မဟုနည်သပဌီသ အကျိုသဖဌစ်ထလန်သမဟု ပိုနည်သသည် (အောက်တလင် ကဌည့်ပါ)။

Properties အမျာသအပဌာသကို တစ်ပဌိုင်နက် ရလေသချယ်ရန်လိုအပ်သောအခါ JSONB ကိုပိုမိုလလယ်ကူအောင်ပဌုလုပ်ကဌပါစို့။ ကသည်မဟာ JSONB ချဉ်သကပ်မဟု အမဟန်တကယ် ရောက်ရဟိလာသည်- ကျလန်ုပ်တို့သည် ချိတ်ဆက်မဟုမျာသမလိုအပ်ဘဲ ကျလန်ုပ်တို့၏ရလဒ်အတလက် ကော်လံမျာသအဖဌစ် သတ်မဟတ်သည့် အပိုကော်လံမျာသအဖဌစ် ဂုဏ်သတ္တိမျာသကို ရလေသချယ်သည်-

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

EAV ဖဌင့် သင်မေသမဌန်သလိုသော ပစ္စည်သတစ်ခုစီအတလက် Join 2 ခု လိုအပ်ပါမည်။ ကျလန်ုပ်၏အမဌင်အရ၊ အထက်ဖော်ပဌပါမေသခလန်သမျာသသည် ဒေတာဘေ့စ်ဒီဇိုင်သတလင် အလလန်ရိုသရဟင်သမဟုကိုပဌသသည်။ JSONB သို့ queries ရေသနည်သ၏ နောက်ထပ်နမူနာမျာသကိုလည်သ ကဌည့်ရဟုနိုင်ပါသည်။ က ပို့စ်။
အခုက Performance အကဌောင်သပဌောဖို့အချိန်ရောက်ပဌီ။

ထလက်နိုင်ရေသ

စလမ်သဆောင်ရည်ကို နဟိုင်သယဟဉ်ဖို့ ကျလန်တော်သုံသတယ်။ ခလဲခဌမ်သစိတ်ဖဌာရဟင်သပဌပါ။ စုံစမ်သမဟုမျာသတလင်၊ လုပ်ဆောင်ချိန်ကို တလက်ချက်ရန်။ query planner သည် ပထမအကဌိမ်ထက် ပိုကဌာသောကဌောင့် query တစ်ခုစီကို အနည်သဆုံသ သုံသကဌိမ် လုပ်ဆောင်ခဲ့သည်။ ပထမညသစလာ ကျလန်ုပ်သည် အညလဟန်သမျာသမပါဘဲ မေသခလန်သမျာသကို လုပ်ဆောင်ခဲ့သည်။ EAV အတလက် လိုအပ်သော ချိတ်ဆက်မဟုမျာသသည် အညလဟန်သမျာသကို အသုံသမပဌုနိုင်သောကဌောင့် ၎င်သသည် JSONB ၏ အာသသာချက်တစ်ခုဖဌစ်သည်မဟာ ထင်ရဟာသပါသည်။ ၎င်သပဌီသနောက် EAV တန်ဖိုသဇယာသ၏ နိုင်ငံခဌာသကီသကော်လံ 2 ခုတလင် အညလဟန်သတစ်ခုအပဌင် အညလဟန်သတစ်ခုကို ဖန်တီသခဲ့သည်။ Gin JSONB ကော်လံအတလက်။

ဒေတာအပ်ဒိတ်သည် အချိန်ကာလသတ်မဟတ်ချက် (ms in) တလင် အောက်ပါရလဒ်မျာသကို ပဌသခဲ့သည်။ စကေသသည် လော့ဂရစ်သမ်ဖဌစ်သည်ကို သတိပဌုပါ။

EAV ကို PostgreSQL တလင် JSONB ဖဌင့် အစာသထိုသခဌင်သ။

အထက်တလင်ဖော်ပဌထာသသောအကဌောင်သပဌချက်ကဌောင့် အညလဟန်သမျာသကိုအသုံသမပဌုပါက JSONB သည် EAV ထက် (> 50000-x) ပိုမဌန်သည်ကို ကျလန်ုပ်တို့မဌင်ရပါသည်။ ကျလန်ုပ်တို့သည် ပင်မကီသမျာသဖဌင့် ကော်လံမျာသကို ညလဟန်သသောအခါ၊ ကလာခဌာသချက်မဟာ ပျောက်ကလယ်လုနီသပါသဖဌစ်သော်လည်သ JSONB သည် EAV ထက် 1,3 ဆ ပိုမဌန်နေသေသသည်။ ကျလန်ုပ်တို့သည် အကဲဖဌတ်မဟုစံသတ်မဟတ်ချက်မျာသတလင် ပိုင်ဆိုင်မဟုကော်လံကို အသုံသမပဌုသောကဌောင့် JSONB ကော်လံရဟိ အညလဟန်သသည် ကနေရာတလင် သက်ရောက်မဟုမရဟိကဌောင်သ သတိပဌုပါ။

ပိုင်ဆိုင်မဟုတန်ဖိုသပေါ်မူတည်၍ ဒေတာရလေသချယ်ခဌင်သအတလက်၊ ကျလန်ုပ်တို့သည် အောက်ပါရလဒ်မျာသ (သာမန်စကေသ) ကို ရရဟိသည်-

EAV ကို PostgreSQL တလင် JSONB ဖဌင့် အစာသထိုသခဌင်သ။

JSONB သည် အညလဟန်သမျာသမပါဘဲ EAV ထက်ပိုမိုမဌန်ဆန်စလာအလုပ်လုပ်သည်ကို သင်သတိပဌုမိနိုင်သော်လည်သ EAV သည် အညလဟန်သမျာသပါရဟိသည့်အချိန်တလင် JSONB ထက်ပိုမိုမဌန်ဆန်စလာအလုပ်လုပ်နေသေသသည်။ ဒါပေမယ့် JSONB မေသမဌန်သချက်တလေအတလက် အချိန်တလေက အတူတူပါပဲလို့ ကျလန်တော်မဌင်ခဲ့တယ်၊ ဒါက GIN အညလဟန်သကိန်သတလေ အလုပ်မလုပ်တော့ဘူသဆိုတာ သိလိုက်ရတယ်။ လူနေထူထပ်သည့် ဂုဏ်သတ္တိမျာသပါရဟိသော ကော်လံတစ်ခုပေါ်တလင် GIN အညလဟန်သကို သင်အသုံသပဌုသောအခါတလင် ပါဝင်သည့် အော်ပရေတာ @> ကိုအသုံသပဌုသည့်အခါမဟသာ အကျိုသသက်ရောက်မဟုရဟိမည်ဖဌစ်သည်။ ၎င်သကို စမ်သသပ်မဟုအသစ်တလင် ကျလန်တော်အသုံသပဌုခဲ့ပဌီသ ၎င်သသည် အချိန်အပေါ် ကဌီသမာသသောအကျိုသသက်ရောက်မဟုရဟိခဲ့သည်- 0,153ms သာရဟိသည်။ ၎င်သသည် EAV ထက် အဆ 15000 ပိုမဌန်ပဌီသ -->> အော်ပရေတာထက် အဆ 25000 ပိုမဌန်သည်။

လုံလောက်ပဌီထင်တယ်!

ဒေတာဘေ့စ်ဇယာသအရလယ်အစာသ

နည်သလမ်သနဟစ်ခုလုံသအတလက် ဇယာသအရလယ်အစာသကို နဟိုင်သယဟဉ်ကဌည့်ရအောင်။ psql တလင်ကျလန်ုပ်တို့သည် command ကိုအသုံသပဌု၍ ဇယာသမျာသနဟင့်အညလဟန်သမျာသအာသလုံသ၏အရလယ်အစာသကိုပဌသနိုင်သည်။ dti+

EAV ကို PostgreSQL တလင် JSONB ဖဌင့် အစာသထိုသခဌင်သ။

EAV ချဉ်သကပ်မဟုအတလက်၊ ဇယာသအရလယ်အစာသမျာသသည် 3068 MB ဝန်သကျင်ရဟိပဌီသ စုစုပေါင်သ 3427 GB အတလက် အညလဟန်သ 6,43 MB အထိရဟိသည်။ JSONB ချဉ်သကပ်မဟုသည် ဇယာသအတလက် 1817 MB နဟင့် 318 GB ဖဌစ်သည့် အညလဟန်သကိန်သမျာသအတလက် 2,08 MB ကိုအသုံသပဌုသည်။ 3 ဆ လျော့နည်သသလာသသည် ။ ကျလန်ုပ်တို့သည် JSONB အရာဝတ္ထုတိုင်သတလင် ပိုင်ဆိုင်မဟုအမည်မျာသကို သိမ်သဆည်သထာသသောကဌောင့် ကအချက်က ကျလန်ုပ်ကို အနည်သငယ် အံ့အာသသင့်စေပါသည်။

သို့သော်၊ နံပါတ်မျာသသည် ၎င်သတို့အတလက် ပဌောဆိုနေကဌသည်- EAV တလင် ကျလန်ုပ်တို့သည် attribute value တစ်ခုလျဟင် integer Foreign keys 2 ခုကို သိမ်သဆည်သထာသပဌီသ အပိုဒေတာ 8 bytes ရရဟိစေသည်။ ထို့အပဌင် EAV သည် ပိုင်ဆိုင်မဟုတန်ဖိုသမျာသအာသလုံသကို စာသာသအဖဌစ် သိမ်သဆည်သထာသပဌီသ JSONB သည် ဖဌစ်နိုင်ပါက ကိန်သဂဏာန်သနဟင့် ဘူလီယံတန်ဖိုသမျာသကို အတလင်သပိုင်သ၌ အသုံသပဌုမည်ဖဌစ်ပဌီသ ပိုမိုသေသငယ်သောခဌေရာကို ရရဟိစေမည်ဖဌစ်သည်။

ရလဒ်မျာသကို

ယေဘူယျအာသဖဌင့်၊ JSONB ဖော်မတ်တလင် entity ဂုဏ်သတ္တိမျာသကို သိမ်သဆည်သခဌင်သသည် သင့်ဒေတာဘေ့စ်ကို ဒီဇိုင်သဆလဲခဌင်သနဟင့် ထိန်သသိမ်သခဌင်သကို ပိုမိုလလယ်ကူစေသည်ဟု ကျလန်ုပ်ထင်ပါတယ်။ အကယ်၍ သင်သည် မေသခလန်သမျာသစလာကို လုပ်ဆောင်နေပါက၊ အရာခပ်သိမ်သကို ဇယာသတစ်ခုတည်သတလင် ထာသရဟိခဌင်သက အမဟန်တကယ် ပိုမိုထိရောက်စလာ လုပ်ဆောင်နိုင်မည်ဖဌစ်သည်။ ဒေတာမျာသကဌာသ အပဌန်အလဟန်ဆက်သလယ်မဟုကို ရိုသရဟင်သစေသည့်အချက်မဟာ အပေါင်သဖဌစ်နေပဌီဖဌစ်သော်လည်သ ရလဒ်ဒေတာဘေ့စ်သည် ထုထည်တလင် ၃ ဆ ပိုသေသငယ်သည်။

ထို့အပဌင်၊ လုပ်ဆောင်ခဲ့သော စမ်သသပ်မဟုမျာသအပေါ် အခဌေခံ၍ စလမ်သဆောင်ရည် ဆုံသရဟုံသမဟုမျာသသည် အလလန်အရေသမပါကဌောင်သ ကျလန်ုပ်တို့ ကောက်ချက်ချနိုင်ပါသည်။ အချို့ကိစ္စမျာသတလင်၊ JSONB သည် EAV ထက်ပင် ပိုမဌန်သောကဌောင့် ၎င်သကို ပိုကောင်သစေသည်။ သို့သော်၊ ကစံနဟုန်သသည် ကဏ္ဍအာသလုံသကို အကျုံသဝင်မည်မဟုတ်ပါ (ဥပမာ- ဂုဏ်သတ္တိမျာသစလာရဟိသော အရာမျာသ၊ ရဟိပဌီသသာသဒေတာမျာသ၏ ဂုဏ်သတ္တိအရေအတလက် သိသိသာသာတိုသလာခဌင်သ၊...)၊ ထို့ကဌောင့် ၎င်သတို့ကို ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ရန် အကဌံပဌုချက်မျာသရဟိပါက သင့်တလင်၊ ကျေသဇူသပဌု၍ မဟတ်ချက်မျာသတလင်ချန်ထာသခဲ့ပါ။

source: www.habr.com

မဟတ်ချက် Add