Thuta Learning
How Databases Work
IntermediateData & Databasesbeginner

Query နှင့် CRUD - သဘောတရားအရ

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Query နှင့် CRUD - သဘောတရားအရ concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • Diagram/table ကို ဖတ်ပြီး data model/schema/architecture ဘယ်လို ပုံသဏ္ဌာန်ရှိသလဲ ခြေရာခံနိုင်ရန်
  • ကိုယ့် project အတွက် database concept/system ကို ဘယ်လို အသုံးချသင့်သလဲ ရှင်းပြနိုင်ရန်

နားလည်ထားရမယ့် အချက်

Query ဆိုတာ database ကို row ရှာဖွေ/ထည့်/ပြောင်း/ဖျက်ခြင်းစတာ တစ်ခုခုလုပ်ဖို့ တောင်းဆိုတာကို ဆိုလိုပါတယ်။

SQL မှာ `SELECT * FROM users WHERE active = true;` ဥပမာလေးက active user အားလုံးကို ပြန်ပေးဖို့ တောင်းဆိုတာပါ - syntax အပြည့်အစုံကို SQL tutorial မှာ ရှာပါ။

OperationSQL / REST
CreateSQL တွင် INSERT၊ REST API တွင် POST ဖြစ်ပါတယ်
ReadSQL တွင် SELECT၊ REST API တွင် GET ဖြစ်ပါတယ်
UpdateSQL တွင် UPDATE၊ REST API တွင် PATCH/PUT ဖြစ်ပါတယ်
DeleteSQL တွင် DELETE၊ REST API တွင် DELETE ဖြစ်ပါတယ်

API endpoint တစ်ခုတည်းက database operation များစွာကို trigger လုပ်နိုင်ပါတယ် - order create လုပ်တာက stock update, audit log, notification အားလုံးကို request တစ်ခုတည်းအတွင်း လုပ်နိုင်ပါတယ်။

UPDATE/DELETE မလုပ်ခင် filter ကို နားလည်ထားပါ

Filter မမှန်ကန်ခြင်း၊ ကျယ်လွန်းခြင်း၊ လွဲနေခြင်းက row ကို မျှော်လင့်ထားတာထက် များစွာ ပိုပြီး ထိခိုက်စေနိုင်တယ် - တစ်ခါတစ်ရံ တိတ်ဆိတ်စွာ ဖြစ်ပေါ်တတ်တယ်။ Data ပြောင်းမယ့် operation မမတိုင်ခင် filter က row ဘယ်နှစ်ခု ကိုက်မလဲ အရင်စစ်ဆေးပါ။

text
CRUD ACROSS THREE LAYERS
------------------------
CONCEPT      SQL STATEMENT      REST API VERB
-------      -------------      -------------
Create   ->  INSERT         ->  POST
Read     ->  SELECT         ->  GET
Update   ->  UPDATE         ->  PATCH / PUT
Delete   ->  DELETE         ->  DELETE

One API call can trigger several DB operations,
e.g. POST /orders may INSERT an order AND UPDATE
stock AND INSERT an audit log row - not just one.

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

Real application တွေမှာ code က library/ORM ကတစ်ဆင့် query ကို တည်ဆောက်ပြီး ပို့ပါတယ်။ Read က ပုံမှန်အားဖြင့် အန္တရာယ်အနည်းဆုံးပါ၊ Create/Update/Delete ကတော့ data ကို အမြဲတမ်း ပြောင်းလဲစေပါတယ်။

  • ကျယ်လွန်းတဲ့ filter
  • ပျောက်နေတဲ့ filter
  • လွဲနေတဲ့ filter

ဒီလို filter များက မျှော်လင့်ထားတာထက် row များစွာကို တိတ်ဆိတ်စွာ ထိခိုက်စေနိုင်ပါတယ်။ Modify မလုပ်ခင် filter က row ဘယ်နှစ်ခု ကိုက်ညီမလဲ အရင်စစ်ဆေးပါ။

အောက်က runnable ဥပမာက create/read/update/delete ကို implement လုပ်ပြီး၊ filter က row များစွာ ကိုက်တဲ့အခါ warning ပြပေးတဲ့ safety check ပါဝင်ပါတယ်။

UPDATE/DELETE မလုပ်ခင် filter ကို နားလည်ထားပါ

Filter မမှန်ကန်ခြင်း၊ ကျယ်လွန်းခြင်း၊ လွဲနေခြင်းက row ကို မျှော်လင့်ထားတာထက် များစွာ ပိုပြီး ထိခိုက်စေနိုင်တယ် - တစ်ခါတစ်ရံ တိတ်ဆိတ်စွာ ဖြစ်ပေါ်တတ်တယ်။ Data ပြောင်းမယ့် operation မမတိုင်ခင် filter က row ဘယ်နှစ်ခု ကိုက်မလဲ အရင်စစ်ဆေးပါ။

အတူတူ စမ်းရေးကြည့်မယ်

javascript
function createRow(table, row) {
  const nextId = table.length ? Math.max(...table.map((r) => r.id)) + 1 : 1;
  const newRow = { id: nextId, ...row };
  table.push(newRow);
  return newRow;
}

function readRows(table, filter) {
  return table.filter((r) => Object.keys(filter).every((k) => r[k] === filter[k]));
}

function updateRows(table, filter, changes, options = {}) {
  const { allowMultiple = false } = options;
  const matches = readRows(table, filter);
  if (matches.length > 1 && !allowMultiple) {
    return {
      ok: false,
      warning: `Filter ${JSON.stringify(filter)} matched ${matches.length} rows; expected at most 1.`,
      updated: 0,
    };
  }
  matches.forEach((r) => Object.assign(r, changes));
  return { ok: true, updated: matches.length };
}

const users = [];
createRow(users, { name: "Aye", status: "active" });
createRow(users, { name: "Bo", status: "active" });
createRow(users, { name: "Cho", status: "inactive" });

console.log("Read active:", readRows(users, { status: "active" }));
console.log("Unsafe update (matches 2):", updateRows(users, { status: "active" }, { status: "archived" }));
console.log("Safe update (matches 1):", updateRows(users, { id: 1 }, { status: "archived" }));
You should see
Read active: [ {id:1,name:'Aye',status:'active'}, {id:2,name:'Bo',status:'active'} ]
Unsafe update (matches 2): { ok: false, warning: 'Filter {"status":"active"} matched 2 rows; expected at most 1.', updated: 0 }
Safe update (matches 1): { ok: true, updated: 1 }

2nd call သည် row 2 ခု ကိုက်နေလို့ update ကို ရပ်တန့်ပြီး warning ပြသည်; 3rd call သည် id: 1 ဖြင့် row 1 ခုသာ ကိုက်လို့ အောင်မြင်ပါတယ်။

၅ မိနစ် စမ်းကြည့်

deleteRows function ကို updateRows ပုံစံတူအတိုင်း ရေးပါ - filter က row တစ်ခုထက် ပိုကိုက်ရင် warning ပြပြီး ဘာမှ မဖျက်ဘဲ ထားပါ။ allowMultiple: true ပါလာရင်တော့ row အားလုံးကို ဖျက်ခွင့်ပြုပါ။

သတိလေးတစ်ချက်

API action နှင့် database operation ကို တစ်ချက်ချင်း တူတူတွေးပြီး endpoint တစ်ခုက operation တစ်ခုသာ လုပ်တယ်ဟု ယူဆခြင်း

UPDATE/DELETE run မလုပ်ခင် filter က row ဘယ်လောက် ကိုက်မည်ကို မစစ်ဆေးဘဲ run လိုက်ခြင်း

Wikipedia: CRUD (create, read, update and delete)How Databases Work

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • API action နှင့် database operation ကို တစ်ချက်ချင်း တူတူတွေးပြီး endpoint တစ်ခုက operation တစ်ခုသာ လုပ်တယ်ဟု ယူဆခြင်း
  • UPDATE/DELETE run မလုပ်ခင် filter က row ဘယ်လောက် ကိုက်မည်ကို မစစ်ဆေးဘဲ run လိုက်ခြင်း
  • ဒီ course က database concept/landscape ကို framework-neutral level မှာသာ သင်ပေးပါတယ် — SQL syntax, PostgreSQL, MongoDB, Redis ကို နက်နက်ရှိုင်းရှိုင်း လေ့လာချင်ရင် SQL, PostgreSQL, MongoDB, Redis tutorial တွေဆီ ဆက်သွားပါ။

လေ့ကျင့်ခန်း

deleteRows function ကို updateRows ပုံစံတူအတိုင်း ရေးပါ - filter က row တစ်ခုထက် ပိုကိုက်ရင် warning ပြပြီး ဘာမှ မဖျက်ဘဲ ထားပါ။ allowMultiple: true ပါလာရင်တော့ row အားလုံးကို ဖျက်ခွင့်ပြုပါ။

You'll know it worked when: Read active: [ {id:1,name:'Aye',status:'active'}, {id:2,name:'Bo',status:'active'} ] Unsafe update (matches 2): { ok: false, warning: 'Filter {"status":"active"} matched 2 rows; expected at most 1.', updated: 0 } Safe update (matches 1): { ok: true, updated: 1 } 2nd call သည် row 2 ခု ကိုက်နေလို့ update ကို ရပ်တန့်ပြီး warning ပြသည်; 3rd call သည် id: 1 ဖြင့် row 1 ခုသာ ကိုက်လို့ အောင်မြင်ပါတယ်။

Query နှင့် CRUD - သဘောတရားအရ | Thuta Learning