နားလည်ထားရမယ့် အချက်
Query ဆိုတာ database ကို row ရှာဖွေ/ထည့်/ပြောင်း/ဖျက်ခြင်းစတာ တစ်ခုခုလုပ်ဖို့ တောင်းဆိုတာကို ဆိုလိုပါတယ်။
SQL မှာ `SELECT * FROM users WHERE active = true;` ဥပမာလေးက active user အားလုံးကို ပြန်ပေးဖို့ တောင်းဆိုတာပါ - syntax အပြည့်အစုံကို SQL tutorial မှာ ရှာပါ။
| Operation | SQL / REST |
|---|---|
| Create | SQL တွင် INSERT၊ REST API တွင် POST ဖြစ်ပါတယ် |
| Read | SQL တွင် SELECT၊ REST API တွင် GET ဖြစ်ပါတယ် |
| Update | SQL တွင် UPDATE၊ REST API တွင် PATCH/PUT ဖြစ်ပါတယ် |
| Delete | SQL တွင် 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 ဘယ်နှစ်ခု ကိုက်မလဲ အရင်စစ်ဆေးပါ။
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 ဘယ်နှစ်ခု ကိုက်မလဲ အရင်စစ်ဆေးပါ။
အတူတူ စမ်းရေးကြည့်မယ်
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" }));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