نرمالسازی دیتابیس: از آشفتگی تا آسودگی در چند مرحله ساده(قسمت چهارم از مفاهیم دیتابیس)
به قسمت چهارم از سری مجموعه مفاهیم دیتابیس خوش اومدی، توی این قسمت میخواییم رفتار نرمالی با دیتابیس داشته باشیم و از آشفتگی داده ها نجاتش بدیم. دقت کنید که توی این سری مجموعه ما با انواع مفاهیم دیتابیس آشنا میشیم و کاری با کد زدن و نوع خاصی از دیتابیسا ها نداریم
اول بیاییم تعریف ویکی پدیا رو ببینیم که چی میگه؟ یکی از اصول علم پایگاه داده ها از بین بردن افزونگی است. افزونگی به این معناست یک داده خاص در چند محل مختلف پایگاه ذخیره شود.
اجازه بدین یه مثال بزنم: فرض کنیم یک کمد پر از لباس داریم و این لباس هارو بدون هیچ نظم و ترتیبی چیدیم مثلا شلوارا و پیرهن ها و جورابا رو همه با هم توی یک جا چیدیم. حالا اگه بخواییم دنبال یه پیرهن خاص بگردیم مجبوریم کللل لباس هارو مثل شلوارو جوراب ها رو هم بگردیم (به این میگن افزونگی یعنی یه چیز یا یه کار مازاد و اضافه داریم انجام میدیم )
اما اگه هر لباس رو به صورت دسته بندی توی یک کمد بزاریم چی ؟ مثلاً تیشرتها در یک قفسه، شلوارها در قفسهای دیگه، و لباس زمستونی ها یه جا دیگه و ... به نظرتون پیدا کردن لباس مورد نظرمون سریعتر و آسون تر نمیشه ؟
نرمالسازی دیتابیس هم همین کار رو انجام میده: دادهها رو طوری سازماندهی میکنه که اطلاعات مرتبط با هم در جداول جداگونه قرار بگیرن و نیازی به تکرار اضافی نباشه. این کار از تکرار دادهها جلوگیری میکنه، دسترسی به دادهها رو سریعتر میکنه، و مدیریت اطلاعات رو سادهتر میکنه.
نرمال سازی معمولا 5 سطح داره که تا سطح سه(بازم معمولا) کفایت میکنه این سطوح عبارتند از: BCNF - 4NF - 3NF - 2NF - 1NF
✅ سطح اول نرمالایز(1NF):
جدولی سطح اول نرمالایز محسوب میشه که:
اول اینکه محتویات هر ستون دارای یک مقدار مشخص باشه یعنی اتمیک(atomic) باشه و داده ها تکرار نشن. یعنی چی میگی اتمیک باشه مگه شیمی داری درس میدی ؟
فرض کن یه جدول user داری و یکی از ستون هات آدرس کاربر رو ذخیره میکنه، حالا اگه بیایی آدرس کاربری مثل کاربر محمد رو اینطوری ذخیره کنی iran-tehran-tajrish داری خودتو بدبخت میکنی، چون این ستونت اتمیک نیست و دارای افزونگی داده هست و بعدن بخوایی توی آدرس سرچ بزنی باید بدبختی بکشی و پرفورمنس پایین میاد
راه حل چیه ؟ بیا یه جدول به اسم address درست کن و آدرس هر کاربر رو به صورت تفکیک شده و تمیز که شامل چند ستون مثل country - city - street رو توش ذخیره کن وبا یه کلید یه جدول user وصلش کن اینطوری هم سرچ کردن آسون میشه هم وقتی کاربر ادرسش تغییر کرد یکجا تغییر میکنه
دوم اینکه آقا داده ها تکرار نشن یعنی یک کاربر ستونی به اسم course داره و کورس های متفاوتی مثل کورس ریاضی - شیمی - فیزیک داریم خب برای هر کاربر هی باید اینارو تکرار کنیم مثلا کاربر رضا کورس شیمی رو شرکت کرده باشه بنویسیم شیمی کاربر محمدم باز بنویسیم شیمی یعنی هی داریم این شیمی رو تکرار میکنیمُ اینطوری بخوایی شیمی رو اسمشو عوض کنی از هزار جا باید تغییر بدی و کلی پرفورمنس میاد پایین
راه حل ؟؟؟ مثل مثال آدرس یه جدول دیگه میسازیم و کورس هارو توی اون میزاریم و با کلید خارجی به جدول user متصلش میکنیم و اگرم بخواییم تغییری بدیم فقط یک جا تغییر میدیم
سوم اینکه هر جدول حتما یه کلیداصلی برای شناسایی داشته باشه که خب این دیگه معلومه نیاز به توضیح نداره توی این لینک حسابی توضیح دادیم
✅ سطح دوم نرمالایز(2NF):
اول اینکه جدول باید سطح اول رو رعایت یا پاس کرده باشه
دوم اینکه همه ستونهای غیراصلی کاملاً به کلید اصلی وابسته باشن. یعنی مثلا یک جدول order داریم که این ستون هارو داره
OrderID | CustomerID | Address
1 | 101 | Tehran
2 | 101 | Tehran
3 | 102 | Shiraz
در واقع جدول order باید اطلاعاتی از سفارشاتمون در اختیارمون بده نه آدرس کاربر پس دلیلی نداره که ستون address توی جدول order باشه و چون اصلا ربطی به order نداره و ذره ای بهش وابسته نیست پس کجا بزاریمش آدرس رو ؟ هیچ جا، address باید متعلق به جدول user باشه
✅ سطح سوم نرمالایز(3NF):
اول اینکه جدول باید سطح دوم و اول رو رعایت یا پاس کرده باشه
دوم اینکه هیچگونه وابستگی بین ستونهای غیراصلی وجود نداشته باشه. به عبارت دیگه، ستونهای غیراصلی نباید به غیر از کلید اصلی به یکدیگر وابسته باشن. یعنی ZipCode وابسته به Cityعه و ممکنه توی بروزرسانی یا حذف مشکل ایجاد کنه(مثلا City نباشه ولی ZipCode باشه خب خیلی ناجوره) پس چه کنیم ؟ یه جدول درست کنیم به اسم City و این دوتا(City , ZipCode ) رو توش بزاریم
همون طور که توی هر مقاله میگم توی مهندسی نرم افزار همه چیز trade off هست و نمیشه یه نسخه برای همه چی پیچیده نرمالایز کردن هم با خوبی هایی که داره بدی هایی هم به همراه میاره
افزایش پیچیدگی کوئریها 👈 به دلیل اینکه دادهها به جداول مختلف تقسیم میشن، کوئریها برای بازیابی اطلاعات ممکنه پیچیدهتر بشه.
کاهش کارایی در خواندن دادهها 👈 در برخی از کاربردها که نیاز به بازیابی سریع دادهها هستش، نرمالسازی زیاد میتونه کارایی خوندن دادهها را کاهش بده.
افزایش تعداد جداول و پیوستنها (Joins) 👈 به دلیل وجود جدول های زیاد، نیاز به پیوستن جداول بیشتره که این خودش میتونه کارایی کوئریها را کاهش بده.
امیدوارم مورد استفاده اتون قرار گرفته باشه
اگه دوست داشتید توی کانال تلگرامیمون هم عضو بشید LearnByLearn@