နားလည်ထားရမယ့် အချက်
Primary key ဆိုတာ table တစ်ခုထဲက row တစ်ကြောင်းချင်းစီကို uniquely identify လုပ်ပေးတဲ့ value ပါ — row နှစ်ကြောင်းက ဘယ်တော့မှ share မလုပ်ပြီး ဘယ်တော့မှလည်း အလွတ် ချန်မထားပါ။ users.id = 42 ဆိုရင် အမြဲတမ်း user တစ်ယောက်တည်းကိုသာ ဆိုလိုပါတယ်။
| Key Type | ဖော်ပြချက် |
|---|---|
| Natural key | email လိုမျိုး ရှိပြီးသား business-meaningful value |
| Surrogate key | auto-incrementing integer (သို့) UUID လိုမျိုး identify အတွက်သာ generate လုပ်ထားတဲ့ value |
နှစ်ခုစလုံး automatic ကောင်းတယ်လို့ မဆိုနိုင်ပါ: natural key က ပြောင်းတတ်ပြီး (email ပြောင်းသလို), surrogate key ကတော့ stable ရှိပေမယ့် business meaning မပါပါ။ Real system တွေမှာ pattern နှစ်ခုလုံးကို အတူတကွ သုံးလေ့ရှိပါတယ်။
Foreign key ကတော့ table တစ်ခုထဲက column တစ်ခုက table တခြားတစ်ခုထဲက row ရဲ့ primary key value ကို သိမ်းဆည်းပြီး link တစ်ခု ဖန်တီးပေးပါတယ်။ orders.user_id ဟာ users.id နဲ့ ကိုက်ညီရမယ်လို့ မျှော်လင့်ပါတယ်။
Pointer တစ်ခုတည်းသိမ်းထားခြင်း
Order တစ်ခုစီထဲမှာ user profile တစ်ခုလုံး ကူးထည့်စရာမလိုဘဲ user_id pointer တစ်ခုတည်းနဲ့ user ရဲ့ full information ရှိတဲ့နေရာကို ပြန်ညွှန်းနိုင်ပါတယ်။
- Primary Key
- table တစ်ခုထဲက row တစ်ကြောင်းချင်းစီကို uniquely identify လုပ်တဲ့ value, ဘယ်တော့မှ empty/duplicate မဖြစ်ပါ
- Foreign Key
- table တခြားတစ်ခုထဲက row ရဲ့ primary key value ကို သိမ်းဆည်းထားတဲ့ column, နှစ်ခုကြား link ဖန်တီးပေးတယ်
- Surrogate Key
- identify အတွက်သာ generate လုပ်ထားတဲ့ value (auto-incrementing integer, UUID), database အပြင်ဘက် meaning မပါ
FOREIGN KEY LINK: ORDERS TO USERS
---------------------------------
FOREIGN KEY LINK: ORDERS TO USERS
------------------------------------
users orders
+----+-------+ +-----+---------+----------+
| id | name | | id | user_id | item |
+----+-------+ +-----+---------+----------+
| 1 | Nilar | | 101 | 2 | Keyboard |
| 2 | Zaw | | 102 | 1 | Monitor |
| 3 | Hnin | | 103 | 3 | Headset |
+----+-------+ +-----+---------+----------+
users.id (primary key) <- orders.user_id (foreign key)လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
feature အသစ်တစ်ခု model ချတဲ့အခါ မေးခွန်းနှစ်ခု သီးခြားစီ မေးပါ: 'row တစ်ကြောင်းကို ဘာက uniquely identify လုပ်လဲ' (primary key candidate) နဲ့ 'row က တခြားနေရာက row တစ်ခုခုကို ညွှန်းဖို့ လိုသလား' (foreign key candidate)။
email ကို primary key အဖြစ်သုံးမလား surrogate id generate လုပ်မလား ဆိုတာက မကြာခဏ တင်းမာမှုတစ်ခုပါ။ Production system အများစုက surrogate id ကို ရွေးလေ့ရှိပါတယ်, email ပြောင်းလဲမှုက table တိုင်းကို မထိခိုက်စေချင်လို့ပါ။
Lookup Pattern
Order တစ်ခုပေးလိုက်ရင် user_id ကို လိုက်ပြီး users table ထဲက ကိုက်ညီတဲ့ row ကို ရှာတာက SQL course ရဲ့ real JOIN syntax အခြေခံပါ။ ဒီ pattern ကို eye ခြင်း မှတ်မိတတ်ခြင်းက schema အသစ်ကို မြန်မြန်ဖတ်နိုင်စေပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
const users = [
{ id: 1, name: "Nilar" },
{ id: 2, name: "Zaw" },
{ id: 3, name: "Hnin" },
];
const orders = [
{ id: 101, user_id: 2, item: "Keyboard" },
{ id: 102, user_id: 1, item: "Monitor" },
{ id: 103, user_id: 3, item: "Headset" },
];
function findOrderOwner(orderId, ordersTable, usersTable) {
const order = ordersTable.find((o) => o.id === orderId);
if (!order) return null;
const user = usersTable.find((u) => u.id === order.user_id);
return user ? { item: order.item, owner: user.name } : null;
}
console.log(findOrderOwner(101, orders, users));
console.log(findOrderOwner(103, orders, users));
console.log(findOrderOwner(999, orders, users));{ item: 'Keyboard', owner: 'Zaw' }
{ item: 'Headset', owner: 'Hnin' }
null၅ မိနစ် စမ်းကြည့်
findOrderOwner function ကို orders array ထဲ user_id မမှန်တဲ့ order အသစ်တစ်ခု ထည့်ပြီး run ကြည့်ပါ — result ဘာဖြစ်လဲ ကြိုခန့်မှန်းကြည့်ပြီး စစ်ဆေးပါ။
သတိလေးတစ်ချက်
foreign key value က ရှိနေတဲ့ row တစ်ခုနဲ့ အမြဲကိုက်ညီတယ်လို့ ယူဆခြင်း — real constraint မရှိရင် ဖျက်ပစ်ခံရတဲ့ row ကို ညွှန်းနေတဲ့ 'orphaned' foreign key ဟာ real bug တစ်ခုအဖြစ် မကြာခဏ တွေ့ရပါတယ်
email လို natural key ကို primary key အဖြစ် ရွေးပြီး နေရာတိုင်းမှာ hard-code လုပ်ထားခြင်း — value က ပြောင်းဖို့ လိုလာရင် ခက်ခဲစေပါတယ်
Wikipedia: Foreign key — How Databases Work