03/08/2019
NORMALIZATION
Credit: Sayar San Thurain Moe
ကြန္ပ်ဴတာသမားမ်ား အထူးသျဖင့္ ပရိုဂရမ္မာမ်ားအတြက္ Database ဟာ အျမဲလိုလို အသံုးျပဳေနရတဲ့ အရာတစ္ခုပါ။ မ်ားေသာအားျဖင့္ Commercial Software ေတြ ေရးသားရာမွာ Database တစ္ခု မွန္မွန္ကန္ကန္ တည္ေဆာက္ဖို႔ အျမဲတမ္းနီးပါး လိုအပ္ေလ့ ရွိပါတယ္။
Database တစ္ခုကို တည္ေဆာက္ရျပီဆိုတာနဲ႔ တြဲရက္ပါလာေလ့ ရွိတာက Normalization ပါ။ ဒီ Normalization စဥ္းစားပံု မွားျပီဆိုတာနဲ႔ ပရိုဂရမ္ ေရးတဲ့ေနရာမွာ ငါးပါးေမွာက္ေတာ့တာပါပဲ။
ဦးကနင္း ပဲ့ကေထာင္၊ ပဲ့ကနင္း ဦးကေထာင္နဲ႔ ကေသာင္းကနင္းေတြ ျဖစ္ျပီး မဆံုးႏိုင္တဲ့ Error ေတြနဲ႔ ရင္ဆိုင္ ေျဖရွင္းရေတာ့မွာ အေသအခ်ာပါ။
▪️ Data Integrity and Consistency
Normalization လုပ္ထားတဲ့ Database တစ္ခုမွာ Key မဟုတ္တဲ့ Attribute Value တစ္မ်ိဳးဟာ တစ္ေနရာတည္းမွာ တစ္ခုတည္းသာ ရွိပါတယ္။
က်န္တဲ့ေနရာေတြက လိုအပ္လာရင္ ဒီတစ္ခုတည္းေသာ Attribute value ကိုပဲ reference လုပ္ထားတဲ့ Key value ေတြကတစ္ဆင့္ ဆြဲထုတ္ျပီး သံုးေနၾကတာ ျဖစ္ပါတယ္။
ဒါကို Database အသံုးအႏွဳန္းအားျဖင့္ Data Integrity and Consistency ျဖစ္တယ္လို႔ ေျပာၾကပါတယ္။
▪️ Data Redundancy
Key တစ္ခုအျဖစ္ မသတ္မွတ္ထားတဲ့ Attribute value တစ္မ်ိဳးဟာ database ထဲမွာ တစ္ေနရာထက္ ပိုျပီး ပါဝင္ေနျပီ ဆိုရင္ေတာ့ Data Redundancy ျဖစ္ေနတယ္လို႔ ေျပာေလ့ ရွိၾကပါတယ္။
အဲဒီလို Data Redundancy ျဖစ္ေနျပီဆိုရင္ ျဖစ္လာႏိုင္တာေတြကေတာ့ Attribute Value တစ္မ်ိဳးတည္းကိုပဲ ထပ္ခါထပ္ခါ ထည့္ေနရျခင္း၊ ျပင္ခ်င္ ဖ်က္ခ်င္တဲ့ အခါမွာလည္း အဲဒီ Redundant attribute value ရွိေနတဲ့ ေနရာအားလံုးကို လိုက္ျပင္ လိုက္ဖ်က္ေနရျခင္း သို႔မဟုတ္ပါက Attribute value ဟာ တစ္ေနရာနဲ႔ တစ္ေနရာ မတူညီပဲ ကြဲလြဲေနျခင္း စတဲ့ မလိုလားအပ္တဲ့ အက်ိဳးဆက္ေတြ ၾကံဳေတြ႕လာရမွာ ျဖစ္ပါတယ္။
▪️What is Normalization ?
ဒီေတာ့ Normalization ဆိုတာကို အတိုဆံုးနဲ႔ အရွင္းဆံုး ေျပာပါဆိုယင္ "removing data redundancy" လို႔ ေျပာႏိုင္ပါတယ္။
Normalization လုပ္တာကို ေက်ာင္းသင္ရိုးညႊန္းတမ္းေတြမွာ ၆ ဆင့္အထိ ထည့္ထားေလ့ ရွိေပမယ့္ လက္ေတြ႕ေလာကမွာေတာ့ third normal form ၃ ဆင့္ အထိသာ အမ်ားဆံုး သံုးၾကပါတယ္။
မလိုအပ္တာကလဲ တစ္ေၾကာင္း၊ normalization မ်ားမ်ားလုပ္ေလ database ရဲ႕ performance က်ေလ ျဖစ္တာက တစ္ေၾကာင္းေၾကာင့္ပါ။
ဒီ normalization လုပ္ျခင္း အေၾကာင္းကို သိလို တတ္လိုေပမယ့္ အခက္အခဲေတြ ရွိေနတဲ့ သူေတြ အတြက္ အလြယ္ကူဆံုးနဲ႔ အျမင္သာဆံုး ျဖစ္ေအာင္ တတ္ႏိုင္သေလာက္ ရွင္းျပေပးခ်င္ပါတယ္။
ေအာက္မွာ ျပထားတဲ့ un-normalized database table တစ္ခုကို စဥ္းစားၾကည့္ပါ။ Format အခက္အခဲေၾကာင့္ attribute name မ်ားသာ ေရးျပႏိုင္ပါသည္။ Attribute values မ်ားကို စဥ္းစားၾကည့္လွ်င္ ျမင္ႏိုင္မည္ဟု ထင္ပါသည္။
▪️rollNo
▪️studentName
▪️courseID
▪️courseName
▪️teacherName
▪️teacherTel
▪️courseFee
အထက္ပါ un-normalized database table မ်ိဳးတြင္ data ထည့္သြင္း ရမည္ဆိုလွ်င္ ေက်ာင္းသား တစ္ဦးသည္ course တစ္ခုထက္ ပို၍ တက္ေရာက္မည္ ဆိုပါက key value အျဖစ္ သတ္မွတ္၍ မရေသာ ယင္းေက်ာင္းသား၏ အမည္သည္ record အသစ္တစ္ခု ထည့္တိုင္း ထည့္တိုင္း ထပ္ခါထပ္ခါ ပါေနမည္ကို လြယ္ကူရွင္းလင္းစြာ ေတြ႕ျမင္ႏိုင္ပါသည္။
♻️ First Normal Form (1NF)
====================
လုပ္ေဆာင္ရန္။ ။ ေျပာင္းလဲျခင္း မရွိေသာ attribute value မ်ားႏွင့္ ထပ္ခါထပ္ခါ ေျပာင္းလဲေနသည့္ attribute value မ်ားကို သီးျခား table မ်ား အျဖစ္ ခြဲထုတ္ရမည္။
ဥပမာအျဖစ္ ေပးထားေသာ un-normalized database table တြင္ ေက်ာင္းသားတစ္ဦး၏ ခံုအမွတ္ႏွင့္ အမည္သည္ ထိုေက်ာင္းသားႏွင့္ သက္ဆိုင္ေသာ record အသစ္တစ္ခု ထည့္တိုင္းထည့္တိုင္း ေျပာင္းလဲျခင္း မရွိပဲ ထပ္ခါထပ္ခါ ေျပာင္းလဲသြားသည္မွာ courseID, courseName, teacherName, teacherTel, courseFee တို႔သာ ျဖစ္သည္။
ထို႔ေၾကာင့္ 1NF ၏ အဆိုအရ ေအာက္ပါအတိုင္း ခြဲထုတ္ႏိုင္သည္။
▪️Table 1 (Non-repeating group table)
============================
▪️rollNo
▪️studentName
▪️Table 2 (Repeating group table and related with RollNo from Table 1)
▪️rollNo
▪️courseID
▪️courseName
▪️teacherName
▪️teacherTel
▪️courseFee
♻️ Second Normal Form (2NF)
======================
လုပ္ေဆာင္ရန္။ ။ Key အျဖစ္ သတ္မွတ္၍ မရႏိုင္ေသာ attributes (non-key columns) မ်ားႏွင့္ key အျဖစ္ သတ္မွတ္၍ ရႏိုင္ေသာ attribute (key column) တို႔၏ ဆက္စပ္မွဳ (functional dependency) ကို လိုက္ရွာပါ။ ေတြ႕လွ်င္ သီးျခား table မ်ားအျဖစ္ ထပ္မံ၍ ခြဲထုတ္ပါ။ တစ္နည္းအားျဖင့္ non-key columns မ်ားသည္ သူတို႔ႏွင့္ ဆက္စပ္လ်က္ ရွိျပီး primary key အျဖစ္ သတ္မွတ္ႏိုင္ေသာ column ရွိခဲ့ပါက အဆိုပါ primary key column ျဖင့္သာ တြဲလ်က္ သီးျခား တည္ရွိရမည္။
1NF မွ ရလာေသာ table 2 တြင္ courseID သည္ key column အျဖစ္ သတ္မွတ္၍ ရႏိုင္ျပီး key column အျဖစ္ မသတ္မွတ္ႏိုင္ေသာ courseName ႏွင့္ courseFee columns မ်ားျဖင့္ ဆက္စပ္မွဳ ရွိေနသည္ကို ေကာင္းစြာ ေတြ႕ရွိႏိုင္သည္။
ထို႔ေၾကာင့္ ေအာက္ပါအတိုင္း ထပ္မံ ခြဲထုတ္ႏိုင္သည္။
▪️Table 1 (Non-repeating group table)
============================
▪️rollNo
▪️studentName
▪️Table 2 (Extract functionally dependant table)
====================================
▪️courseID
▪️courseName
▪️courseFee
Table 3
======
▪️rollNo
▪️courseID
▪️teacherName
▪️teacherTel
♻️Third Normal Form (3NF)
====================
လုပ္ေဆာင္ရန္။ ။ Key အျဖစ္ သတ္မွတ္၍ မရႏိုင္ေသာ attribute (non-key column) မ်ားသည္ တစ္ခုႏွင့္ တစ္ခု ဆက္စပ္မွီခို ေနျခင္းမ်ိဳး မရွိေစရ၊ တစ္နည္းအားျဖင့္ mutually independent ျဖစ္ေနရမည္။ အကယ္၍ တစ္ခုႏွင့္ တစ္ခု ဆက္စပ္မွီခိုျခင္း ရွိေနပါက သီးျခား table အျဖစ္ ထပ္မံ ခြဲထုတ္ရမည္။
2NF မွ ရလာေသာ Table 3 တြင္ teacherName ႏွင့္ teacherTel columns မ်ားသည္ တစ္ခုႏွင့္ တစ္ခု ဆက္စပ္မွီခို ေနၾကေၾကာင္း ေတြ႕ႏိုင္သည္။
teacherName column value အေပၚ မူတည္၍ teacherTel column value သည္လည္း လိုက္ပါ ေျပာင္းလဲေနမည္ကို အလြယ္တကူ ေတြ႕ျမင္ႏိုင္သည္။
ထိုေၾကာင့္ 3NF ၏ အဆိုအတိုင္း သီးျခား table အျဖစ္ ထပ္မံ ခြဲထုတ္လိုက္လွ်င္ ေအာက္ပါအတိုင္း ရလာမည္ ျဖစ္ပါသည္။
Student Table
===========
▪️rollNo
▪️studentName
Course Table
===========
▪️courseID
▪️courseName
▪️courseFee
Teacher Table
============
▪️teacherName
▪️teacherTel
Attendance Table
=============
▪️rollNo
▪️courseID
▪️teacherName
ေကာင္းမြန္ျပည့္စံုတဲ့ ရွင္းလင္းခ်က္တစ္ခု မဟုတ္ေပမယ့္ normalization ကို လံုးဝ နားမလည္ သေဘာမေပါက္ ျဖစ္ေနတဲ့ သူေတြအတြက္ တစ္စံုတစ္ရာေသာ အတိုင္းအတာတစ္ခု အေထာက္အကူ ျဖစ္မယ္လို႔ ထင္ပါတယ္ခင္ဗ်ာ။
Credit: Sayar San Thurain Moe