تعریف روابط Relation و ایجاد رابطه پدر و فرزندی در mysql

در این مقاله قصد داریم ایجاد روابط یا Relation بین جداول را در پایگاه داده mysql بررسی کنیم. برای این منظور ابتدا باید چند مفهوم را بدانیم.

افزونگی در پایگاه داده

افزونگی در پایگاه داده

افزونگی به این معنی است که اطلاعاتی ثابت به ازای هر رکورد، تگرار می شود. سیستم کارمندان یک شرکت را در نظر بگیرید. فرض کنید جدولی با نام employee وجود دارد که دارای ویژگی های نام، نوع کاربری، کد پرسنلی، عنوان کاری،  حقوق ماهانه و ... می باشد. حال فرض کنید در این سیستم ۱۰ کاربر کارمند برنامه نویس وجود داشته باشد. در این حالت در ستون عنوان کاری، ۱۰ بار مقدار تکراری ذخیره می شود. همچنین برای نوع کاربری جندین مقدار می توان قرار داد که باز هم اطلاعات تکراری در این ستون ذخیره می شود. برای دسترسی به یکی از رکوردهای این جدول زمان بیشتری صرف می شود تا query مورد نظر انجام شود و زمانی که حجم رکوردها افزایش یابد باعث کند شدن سیستم خواهد شد. به این مشکل افزونگی می گویند. مطلوب ترین پایگاه داده، پایگاه داده ای است که دارای کمترین افزونگی ممکن می باشد. 

حل مشکل افزونگی در پایگاه داده (ارتباط و کلید خارجی)

برای حل مشکل افزونگی معمولا جداول را به دو یا جند جدول کوچکتر تقسیم می کنند و بین آنها رابطه یا Realation برقرار می کنند. مثال بالا را در نظر بگیرید. مقادیر ستون های عنوان کاربری و نوع کاربری در این جدول مدام در حال تکرار است. راه حل این است که جدولی با نام users ایجاد کرده و ستون های نام کاربری و عنوان کاربری را به آن منتقل کنیم و یک کلید برای این جدول با نام user_id در نظر میگیریم. 

حال در جدول employee یک ستون با نام user_id ایجاد می کنیم که مقدار آن مقدار یکی از ستون های جدول users خواهد بود. در واقع کلید user_id که در جدول user کلید اصلی می باشد، در جدول employee کلید خارجی است. کلید خارجی به یک رکورد خاص از جدول اصلی اشاره می کند. 

نکته: MySQL تنها برای جداولی که از نوع InnoDB هستند از کلید خارجی پشتیبانی می‌کند.

رابطه Realation در پایگاه داده

مشکل حذف اطلاعات جدولی که در جدولی دیگر کلید خارجی است

در مثال بالا فرض کنید قصد داریم یکی از کارمندان را اخراج کنیم. در این صورت باید رکورد کارمند مورد نظر از جدول users حذف شود. ولی در حالت عادی حذف رکوردی که یکی از ستون های آن در جدولی دیگر کلید خارجی است، ممکن نیست و باید ابتدا رکوردی که حاوی کلید خارجی نیست حذف شود.

یکی از بزرگترین اشتباهی که برنامه نویسان انجام می دهند این است که یک query برای حذف رکورد دارای کلید خارجی و یک query برای حذف رکوردی که کلید خارجی ندارد، می نویسند. 

یک روش بهینه تر در پایگاه داده وجود دارد که توسط آن می توان ارتباط بین جداول را طوری تنظیم کرد که با حذف یک رکورد، تمام رکوردهایی که از طریق کلید خارجی به آن متصل هستند نیز به صورت اتوماتیک حذف شود. به این روش حذف آبشاری گفته می شود. 

پراستفاده ترین پایگاه داده سیستم های تحت وب mysql می باشد. در فریمورک هایی مثل لاراول و سیمفونی و سیستم های مدیریت محتوا مانند وردپرس و جوملا، تماما از پایگاه داده mysql استفاده می کنند. به همین دلیل کدهای مربوط به ارتباط جداول در mysql را آموزش خواهیم داد.

کدهای مربوط به ایجاد رابطه بین دو جدول


ALTER TABLE `employee`
  ADD CONSTRAINT `name_for_relation` FOREIGN KEY (`user_id`) REFERENCES `tbl_users` (`user_id`);

کدهای مربوط به ایجاد رابطه بین دو جدول با قابلیت حذف آبشاری


ALTER TABLE `employee`
  ADD CONSTRAINT `name_for_relation` FOREIGN KEY (`user_id`) REFERENCES `tbl_users` (`user_id`)
  ON DELETE CASCADE;

اگر ON DELETE CASCADE را قرار ندهیم به صورت پیش فرض مقدار RESTRICT اعمال می شود. این گزینه از حذف شدن رکوردی که دارای کلید خارجی است جلوگیری می کند

امیدوارم از این مقاله استفاده کرده باشید. اگر سوالی داشتید کامنت بزارید. موفق باشید.

 

ثبت نظر جدید