Thuta Learning
How Databases Work
BasicData & Databasesbeginner

Primary Key နှင့် Foreign Key

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

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

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

Primary key ဆိုတာ table တစ်ခုထဲက row တစ်ကြောင်းချင်းစီကို uniquely identify လုပ်ပေးတဲ့ value ပါ — row နှစ်ကြောင်းက ဘယ်တော့မှ share မလုပ်ပြီး ဘယ်တော့မှလည်း အလွတ် ချန်မထားပါ။ users.id = 42 ဆိုရင် အမြဲတမ်း user တစ်ယောက်တည်းကိုသာ ဆိုလိုပါတယ်။

Key Typeဖော်ပြချက်
Natural keyemail လိုမျိုး ရှိပြီးသား business-meaningful value
Surrogate keyauto-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 မပါ
text
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 အသစ်ကို မြန်မြန်ဖတ်နိုင်စေပါတယ်။

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

javascript
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));
You should see
{ 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 keyHow Databases Work

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

  • foreign key value က ရှိနေတဲ့ row တစ်ခုနဲ့ အမြဲကိုက်ညီတယ်လို့ ယူဆခြင်း — real constraint မရှိရင် ဖျက်ပစ်ခံရတဲ့ row ကို ညွှန်းနေတဲ့ 'orphaned' foreign key ဟာ real bug တစ်ခုအဖြစ် မကြာခဏ တွေ့ရပါတယ်
  • email လို natural key ကို primary key အဖြစ် ရွေးပြီး နေရာတိုင်းမှာ hard-code လုပ်ထားခြင်း — value က ပြောင်းဖို့ လိုလာရင် ခက်ခဲစေပါတယ်
  • ဒီ course က database concept/landscape ကို framework-neutral level မှာသာ သင်ပေးပါတယ် — SQL syntax, PostgreSQL, MongoDB, Redis ကို နက်နက်ရှိုင်းရှိုင်း လေ့လာချင်ရင် SQL, PostgreSQL, MongoDB, Redis tutorial တွေဆီ ဆက်သွားပါ။

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

findOrderOwner function ကို orders array ထဲ user_id မမှန်တဲ့ order အသစ်တစ်ခု ထည့်ပြီး run ကြည့်ပါ — result ဘာဖြစ်လဲ ကြိုခန့်မှန်းကြည့်ပြီး စစ်ဆေးပါ။

You'll know it worked when: { item: 'Keyboard', owner: 'Zaw' } { item: 'Headset', owner: 'Hnin' } null