فرم های نرمال
تئوری پايگاه داده درجه نرمالسازی جدول را با اصطلاح فرم های نرمال(normal form) شرح می دهد. فرم های نرمال (يا بطور خلاصه NF) معياری برای تعيين درجه نرمال جدول دراختيار می گذارد. فرم های نرمال سازی جداگانه روی هر جدول می توانند بکار بروند. پايگاه داده زمانی در فرم نرمال n خواهد بود که کل جداول آن در فرم نرمال n باشند.
فرم های نرمال عبارتند از:
• First Normal Form (1NF)
• Second Normal Form (2NF)
• Third Normal Form (3NF)
• Forth Normal Form (4NF)
• Boyce/Codd Normal Form (BCNF)
• Fifth Normal Form (5NF)
• Domain/Key Normal Form (DKNF)
اگر فرم اول نرمال در جدولی مشاهده شود اصطلاحا آنرا در فرم اول نرمال (1NF) می نامند. اگر سه فرم اول نرمال ديده شود آنرا در فرم سوم نرمال (3NF) درنظر می گيرند. جدولی که دارای فرم نرمال درجه بالاتر باشد فرم های نرمال درجه پائين تر را هم دارا می باشد. بنابراين مثلا اگر جدولی 3NF باشد 2NF و 1NF هم هست. ولی عکس اين صحت ندارد.
توجه داشته باشيد که نرمالسازی يک فرآيند تکراری نيست. يک جدول ممکن است در يک مرحله به فرم سوم نرمال دربيايد. بعلاوه اگر 3NF باشد به احتمال بسيار زياد 5NF هم خواهد بود.
فرم نرمال هريک باعث کاهش بيشتر افزونگی و تقسيم جداول به واحدهای کوچکتر می شوند. سه فرم اول نرمال (1NF، 2NF و 3NF) در ابتدا توسط Codd تعريف شد که به طور خلاصه وابستگی صفات خاصه غير کليد را به کليد الزام می کنند. فرم های چهارم و پنجم (4NF و 5NF) با ارتباطات چند به چند و يک به چند بيت صفات خاصه سروکار دارند. دو فرم ديگر هم وجود دارد که کاملا با اين جريان جور نمی شوند که BCNF و DK/NF هستند.
در برنامه های کاربردی اغلب 1NF، 2NF و 3NF و گاهی 4NF و 5NF ديده خواهند شد 5NF بندرت مشاهده می شود به همين دليل در اينجا توضيح داده نمی شود.
(1NF) First Normal Form
يک جدول در فرم اول نرمال (1NF) است اگر و فقط اگر فاقد گروه داده تکرار شونده باشد. به عبارت ديگر هر ستون در جدول دارای مقدار اتميک باشد.
در مدل رابطه ای هر جدولی حداقل در فرم اول نرمال هست زيرا از الزامات مدل اين است که هر جدول شامل دقيقا يک مقدار برای هر صفت خاصه باشد که اصطلاحا “فاقد گروه تکرار شونده” گفته می شود.
مثال. جدول ALL_SALES که اطلاعات فروش را نگهداری می کند درنظر بگيريد. اين جدول در فرم اول نرمال هست چون هيچ کدام از ستون ها چندمقداری نيستند بنابراين نيازی نيست روی جدول کاری انجام دهيم بجز اينکه يک کليد انتخاب نمائيم. ترکيب غير تکراری ProductNo+CustomerNo+SaleNo را می توان کليد اصلی درنظر گرفت.
ALL_SALES(SaleNo, ProductNo, CustomerNo, SaleDate, QtyInStock, Description, Price, Customer_Name, Customer_Address, CreditLimit, Amount, Salesrep)
فرم های نرمال سازی
(2NF) Second Normal Form
يک جدول در فرم دوم نرمال (2NF) است اگر اولا 1NF باشد و ثانيا کليه ستون های غيرکليد با کليد اصلی وابستگی تابعی کامل داشته باشند.
ستون Y با ستون X در يک رابطه وابستگی تایعی (functional dependency) دارد اگروفقط اگر به ازای هر مقدار در X دقيقا يک مقدار در Y متناظر با آن وجود داشته باشد. که به صورت X→Y نشان داده می شود.
مثال. در جدول ALL_SALES مثال قبل، Customer_Address با CustomerNo وابستگی تابعی دارد، زيرا يک مشتری خاص تنها با يک آدرس مربوط است. توجه کنيد که عکس آن برقرار نيست و چند مشتری ممکن است در يک آدرس زندگی کنند. بنابراين يک آدرس ممکن است با بيش از يک شماره مشتری در ارتباط باشد. اگر مشتری بيش از يک آدرس داشته باشد ديگری وابستگی تابعی با شماره مشتری ندارد.
ستون Y روی مجموعه صفات خاصه X وابستگی تابعی کامل (Full functional dependency) دارد اگر روی X وابستگی تابعی داشته باشد و با هيچ زيرمجموعه ای از X وابستگی تابعی نداشته باشد.
مثال. در جدول ALL_SALES مثال قبل آدرس مشتری وابستگی کامل با SaleNo، ProductNo و CustomerNo دارد ولی وابستگی تابعی کامل ندارد چون با CustomerNo وابستگی تابعی دارد.
توجه کنيد اگر کليدهای کانديد در جدول ترکيبی نباشند يعنی تنها شامل يک ستون باشند بلافاصله می گوئيم جدول 2NF است.
مثال. جدول ALL_SALES را درنظر بگيريد:
ALL_SALES(SaleNo, ProductNo, CustomerNo, SaleDate, QtyInStock, Description, Price, Customer_Name, CreditLimit, Amount, Salesrep)
مشاهده می شود بعضی از ستون ها بهم مرتبط هستند و توسط بخشی از کليد مشخص می شوند. به عبارت ديگر بعضی ستون ها با زيرمجموعه ای از کليد وابستگی تابعی دارند:
ProductNo → {Description, ReorderLevel, Price, QtyInStock}
CustomerNo → {Customer_Name, CreditLimit}
SaleNo → {Date, CustomerNo, ProductNo, Qty, Amount, Salesrep}
با جدا کردن اين ستون ها به جداول جداگانه به فرم دوم نرمال می رسيم.
PRODUCT(ProductNo, Description, Price, QtyInStock)
CUSTOMER(CustomerNo, Customer_Name, CreditLimit)
SALE(SaleNo, Date, CustomerNo, ProductNo, Qty, Amount, Salesrep)
(3NF) Third Normal Form
يک جدول در فرم سوم نرمال (3NF) است اگر اولا 2NF باشد، ثانيا کليه صفات خاصه غير کليد در جدول با کليد اصلی وابستگی تابعی غير تعدی داشته باشند.
وابستگی تعدی (transitive dependency) يک وابستگی تابعی غير مستقيم است که در آن X→Z است اگر X→Y و Y→Z باشد.
در فرم سوم نرمال کليه ستون های جدول مستقيما توسط کليد اصلی مشخص می شوند. با حذف فيلدهائی که وابستگی مستقيم با کليد ندارند به فرم سوم نرمال می رسيم. برای اين کار گروهی از ستون های جدول را که مقدارشان برای بيش از يک رکورد تکرار می شود را در جدول جداگانه ای قرار دهيد.
مثال. فرض کنيد جدول PRODUCT به صورت زير جزئيات توليد کننده هر محصول را دارا باشد:
PRODUCT(ProductNo, Description, ReorderLevel, Price, QtyInStock, SupplierCode, SupplierName, SupplierAddress)
اين جدول کليد اصلی تک ستونی دارد بنابراين 2NF است. اگر توليد کننده چندين محصول را توليد کند فيلدهای SupplierName و SupplierAddress برای هر محصول تکرار می شود زيرا وابستگی تعدی با کليد اصلی دارند.
ProductNo → SupplierCode → {SupplierName, SupplierAddress}
با حذف اين ستون ها و تقسيم جدول به صورت زير به فرم سوم نرمال می رسيم. توجه کنيد که SupplierCode در جدول PRODUCT به عنوان کليد خارجی باقی می ماند.
PRODUCT(ProductNo, Description, ReorderLevel, Price, QtyInStock, SupplierCode)
SUPPLIER(SupplierCode, SupplierName, SupplierAddress)
رسيدن به فرم سوم نرمال اگرچه مطلوب است ولی هميشه عملی نيست. جداول متعدد باعث تنزل کارائی پرس و جوها می شود. بنابراين ممکن است فرم سوم تنها روی ستون هائی از جدول که زياد تغيير می کنند اعمال شود و برای فيلدهای وابسته ای باقی مانده برنامه به نحوی طراحی می شود که کاربر ملزم باشد کليه فيلدهای مرتبط را درهراصلاح بازبينی کند.
(4NF) Fourth Normal Form
يک جدول در فرم چهارم نرمال (4NF) است اگر اولا 3NF باشد، ثانيا هيچ ستونی در جدول وابستگی چند مقداری نداشته باشد.
وابستگی چندمقداری (multivalued dependency) به اين معنی است که حضور رکوردهای معينی در جدول وجود رکوردهای معين ديگری را برساند.
مثال. اگر مشتريانی با چند آدرس داشته باشيم (که در محيط تجارت عادی است)، در جدول CUSTOMER نمی توانيم چند ستون آدرس را اضافه کنيم چون تعداد آدرس های ممکن را نمی دانيم. بنابراين ناگزير به اضافه کردن رکورد جديد برای هر آدرس مشتری هستيم که باعث تکرار و افزونگی داده می شود. زيرا CustomerNo ديگر تنها يک آدرس را معين نمی کند بلکه مجموعه ای از آدرس های را نشان می دهد به عبارت ديگر وابستگی چندمقداری دارد. با حذف چنين وابستگی هائی و تقسيم جدول به صورت زير به فرم چهارم نرمال می رسيم.
CUSTOMER(CustomerNo, First, Last, CreditLimit)
CUSTOMER_ADDRESS(CustomerNo, Address)
حالا هر مشتری می تواند هر تعداد آدرسی را داشته باشد.
معايب نرمالسازی
نرمالسازی تکنيک مهمی برای طراحی پايگاه داده های کارآمد است اما در ضمنی که افزونگی داده را کاهش می دهد سبب کاهش اجرای سيستم می شود. درجات بالای نرمال معمولا جدوال بيشتر را می طلبند. برای پاسخ به پرس و جوها گاهی بايد کليه جداول تقسيم شده دوباره با هم الحاق شوند که در کاربردهائی که زمان پاسخ مهم است (نظير وب) مطلوب نيست.
بالاترين سطح نرمالسازی با توجه به عمليات کاربردی درنظر گرفته می شود. در پايگاه داده هايی که بيشتر خواندنی هستند و افزونگی داده در آنها مشکل حادی نيست، مانند داده های کاتالوگ يک سايت تجارت الکترونيکی، می توان سطح نرمالسازی را کاهش داد. به اين عمل denormalization می گويند. از طرف ديگر در کاربردهائی که درگير داده های مهم مانند داده های مالی هستند که دائما در حال تغييرند و بايد سازگار باقی بمانند، احتمالا سعی می شود به سطوح بالاتر نرمال برسند حتی اگر سرعت پايگاه داده کم شود.
گاهی با توجه به وضعيت ممکن است داده ها از چند پايگاه داده نرمال شده استخراج شوند و در يک انبار داده غير نرمال قرار گيرد. اين روش برای مخزن داده Data warehouse استاندارد خوبی است.
http://www.hpkclasses.ir/Courses/DataBase/db0900.html
آدرس کانال تلگرام سایت بیگ دیتا:
آدرس کانال سروش ما:
https://sapp.ir/bigdata_channel
جهت دیدن سرفصل های دوره های آموزشی بر روی اینجا کلیک کنید.