چگونه رابط والد و فرزند (Parent-Child) را در MySQL پیاده‌سازی کنیم؟

گردآوری و تالیف : عرفان کاکایی
تاریخ انتشار : 04 آذر 1397
دسته بندی ها : پی اچ پی

اگر اولین باری که عبارت «روابط والد و فرزند در MySQL» را شنیدید، گفتید :«خب، آیا کس دیگری هم نام‌های من درآوردی جالبی دارد یا این که قرار است شروع به بارش فکری کنیم؟»، پس این مقاله برای شماست. برای افراد تازه کار، این مسئله ممکن است زیاد منطقی به نظر نیاید. هیچ مشکلی نیست؛ زیرا لزوما هر روز به آن نیاز ندارید.

رابطه والد و فرزند در MySQL باید با تاسیس برخی dependencyهای سلسله مراتبی بین رکوردها در یک جدول دیتابیس سر و کار داشته باشد. در شرایط MySQL، این مسئله یعنی بر فرض «ردیف ۱۲ والد ردیف ۱۴ است» و اینگونه موارد. در شرایط کسب و کار، به معنای تاسیس یک رابطه dependency میان دو موجودیت مشابه می‌باشد. برای مثال، نگه داشتن رکوردی از تمام افراد داخل یک روستا و تطابق دادن والدها به فرزندانشان.

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

  1. پیش نیازها
  2. چرا باید از روابط والد و فرزند استفاده کنیم؟
  3. تاسیس روابط والد و فرزند
  4. نتیجه گیری

پیش نیازها

  1. دانش پایه در زمینه هر دیتابیسی بر پایه SQL.
  2. دانش پایه در زمینه برنامه‌نویسی تا به شما کمک کند تا از آن در برنامه‌ها واقعی استفاده کنید.

چرا باید از روابط والد و فرزند استفاده کنیم؟

فرض کنید که ما در حال ساخت یک ابزار کاربردی مانند Slack هستیم، تا تضمین کنیم که از اصول عادی سازی دیتابیس استفاده می‌کنیم و داده‌های زائد را از دیتابیس خود حذف می‌کنیم.

به طور فرضی، دیتابیس ما حداقل این جداول را خواهد داشت:

companies

id

name

subdomain

user_id

created_at

users

id

company_id

first_name

last_name

email

password

created_at

حال ما یک جدول واقعا ساده داریم. بدون نیاز به فکر کردن، شما از قبل می‌دانید که یک کاربر صاحب یک شرکت خواهد بود و چند کاربر می‌توانند به یک شرکت متعلق باشند. در حال حاضر، همه چیز خوب است و می‌توانیم روند مربوط به ساخت یک محصول خوب را ادامه دهیم...

وقتی که کاربر ۳ شرکت دیگر بسازد، (آن کاربر یک تالار، یک رستوران و یک شیرینی فروشی دارد) مشکلات شروع به بروز دادن خواهند کرد. او به آن ۳ پروفایل شرکت نیاز خواهد داشت تا کسب و کارهای مختلف خود و خدمه مختلف آن‌ها را مدیریت کند. حال، او باید ۳ بار با احتمالا گواهی‌های مشابه ثبت نام کند. خب، این فقط یک فرد است، پس مشکل زیادی وجود ندارد، نه؟

سپس او ۱۰ خدمه را به هر کدام از این شرکت‌ها دعوت می‌کند، که اگر به آن فکر کنید، چیز زیادی نیست. اما هر کدام از این ۱۰ خدمه، همچنین به حداقل یک پروفایل شرکت دیگر هم متعلق می‌باشند؛ چه یک گروه محلی، یک کسب و کار جانبی دیگر یا یک پروژه اوپن سورس. حال، هر کدام از این خدمه دو بار با گواهی‌های مشابه ثبت نام خواهند کرد. وقتی که به آن فکر می‌کنم، کمی عرق می‌کنم، اما شاید آنچنان فاجعه‌ بزرگی هم در دستان خود نداشته باشیم.

حال این سناریو را با مقیاس ۱۰۰۰ برابر در نظر بگیرد و سعی کنید تا تصور کنید که جدول شما چه ظاهری خواهد داشت.

تاسیس روابط والد و فرزند

اولین کاری که ما باید انجام دهیم، این است که یک ستون به نام parent_id به جدول کاربران (users) اضافه کنیم. این ستون، آیدی اولین رکوردی که برای کاربر ساختیم را نگه خواهد داشت. سپس می‌توانیم هر بار که یک کاربر به شرکت دعوت می‌شود، مجبور نباشیم که از او بخواهیم یک حساب جدید بسازد. آن‌ها می‌توانند مستقیما ملحق شوند و حتی firstname و lastname خود را بر روی آن شرکت ببیند. (شما باید اجازه این کار را به آن‌ها بدهید) حال جدول users ما می‌تواند چنین ظاهری داشته باشد:

این از چیزی که بالاتر داشتیم ظاهر بهتری دارد، نه؟ ما داده‌های زائد را کاملا از جدول خود حذف کرده‌ایم. کوئری کردن رکوردها برای جدول خود آسان‌تر می‌شود. پس از این که کاربران وارد شده‌اند، شما می‌توانید یک کوئری این چنینی را اجرا کنید تا تمام شرکت‌های مربوط به کاربر را دریافت کنید:

SELECT * FROM `companies` 

WHERE `id` IN (

  SELECT `company_id` FROM `users` 

  WHERE `id` = 1 OR `parent_id` = 1

)سپس می‌توانید تمام شرکت‌ها را برای کاربر لیست کنید تا انتخاب کند، و می‌توانید پروفایل کاربر را بر حسب شرکت‌هایی که انتخاب کرده‌ است بردارید. این بار می‌توانید یک کوئری مشابه را برای آن انتخاب بسازید:


SELECT * FROM `users` 

WHERE 

  (`company_id` = 217 AND `parent_id` = 1) 

OR 

  (`company_id` = 217 AND `id` = 1);

ما از دو شرط استفاده می‌کنیم، زیرا کاملا مطمئن نیستیم که در حال انتخاب یک والد هستیم یا یک فرزند.

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

SELECT 

  `companies`.`name`, 

  `users`.`id`, 

  `users`.`name` 

FROM 

  `companies` LEFT JOIN `users` 

ON 

  `users`.`company_id` = `companies`.`id` 

where 

  `users`.`parent_id` = 1 or `users`.`id` = 1

این کوئری نام شرکت، آیدی کاربر و نام کاربر را بر می‌گرداند. شما می‌توانید وقتی که کاربر بر روی یک شرکت، نام یا هر چیزی که نمایانگر یک شرکت است کلیک می‌کند، داده را رندر می‌کنید و آن را به سرور ارسال می‌کنید، این را به عنوان یک صفت داده به HTML خود اضافه کنید. همچنین شما می‌توانید بر حسب نیازهای خود، موارد بیشتری را با استفاد از کوئری مورد نظر برگردانید.

دقت داشته باشید که در جای مناسب محدودیت‌ها را تعیین کنید؛ زیرا شما نمی‌خواهید که سرور خود را با عملیات دریافت داده‌های غیر ضروری بیش از حد بارگذاری کنید. همچنین، متغیرها را همانطور که به جداول دیتابیس شما مربوط هستند، جایگزین کنید.

نتیجه گیری

ما یک رابطه والد و فرزند را در یک سطح بسیار پایه بررسی کرده‌ایم. حتی از رکوردهای کوچکی که ساخته‌ایم، می‌توانیم ببینیم که چگونه همینطور که کابران بیشتری اضافه می‌کنیم، این کار جدول ما را بسیار مرتب‌تر نگه می‌دارد. به طور معادل، می‌توانیم تخمین بزنیم که این کار چقدر تجربه کاربران ما را ارتقا خواهد داد.

منبع

مقالات پیشنهادی

هشت قاعده طلایی برای طراحی رابط بهتر

طراحان نیاز دارند که هر روز مشکلاتی را حل کنند و براساس تحقیقات عمیقی که دارند بهترین راه حل‌ها را بیابند و آن‌ها را مطابق با برنامه تست کنند. ممکن اس...

چرا الگوهای تاریک رابط کاربری برای تجارت بد هستند؟

الگوهای تاریک رابط کاربری بخش‌های فریبنده‌ای از رابط کاربری است که سعی دارد با فریب دادن کاربران آن‌ها را بدون آنکه بخواهند به انجام کاری ترغیب کنند و...

چگونه در وردپرس یک پوسته فرزند را درست کنیم؟

به عنوان یک مدیر وبسایت وردپرسی مطمئنا دوست دارید پوسته‌ای که در حال استفاده از آن هستید را منحصر به فرد کنید، این کار را با اضافه کردن کارکردهای اضاف...

تفاوت رابط‌ کاربری و تجربه‌ کاربری

در این مطلب قصد دارم دو مفهوم که به صورت وسیعی استفاده می‌شود را به سرعت توضیح دهم. طراحی رابط کاربری و طراحی تجربه کاربری. اولین موردی که می‌خواهیم ب...