اگر اولین باری که عبارت «روابط والد و فرزند در MySQL» را شنیدید، گفتید :«خب، آیا کس دیگری هم نامهای من درآوردی جالبی دارد یا این که قرار است شروع به بارش فکری کنیم؟»، پس این مقاله برای شماست. برای افراد تازه کار، این مسئله ممکن است زیاد منطقی به نظر نیاید. هیچ مشکلی نیست؛ زیرا لزوما هر روز به آن نیاز ندارید.
رابطه والد و فرزند در MySQL باید با تاسیس برخی dependencyهای سلسله مراتبی بین رکوردها در یک جدول دیتابیس سر و کار داشته باشد. در شرایط MySQL، این مسئله یعنی بر فرض «ردیف ۱۲ والد ردیف ۱۴ است» و اینگونه موارد. در شرایط کسب و کار، به معنای تاسیس یک رابطه dependency میان دو موجودیت مشابه میباشد. برای مثال، نگه داشتن رکوردی از تمام افراد داخل یک روستا و تطابق دادن والدها به فرزندانشان.
پس هر زمان که این اصطلاح را شنیدید، به یک رابطه والد و فرزند در دنیای واقعی فکر کنید. برای باقی این مقاله، ما نحوه تاسیس رابطه مورد نظر و موقعیتهای استفاده ممکن را بررسی خواهیم کرد.
- پیش نیازها
- چرا باید از روابط والد و فرزند استفاده کنیم؟
- تاسیس روابط والد و فرزند
- نتیجه گیری
پیش نیازها
- دانش پایه در زمینه هر دیتابیسی بر پایه SQL.
- دانش پایه در زمینه برنامهنویسی تا به شما کمک کند تا از آن در برنامهها واقعی استفاده کنید.
چرا باید از روابط والد و فرزند استفاده کنیم؟
فرض کنید که ما در حال ساخت یک ابزار کاربردی مانند 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 خود اضافه کنید. همچنین شما میتوانید بر حسب نیازهای خود، موارد بیشتری را با استفاد از کوئری مورد نظر برگردانید.
دقت داشته باشید که در جای مناسب محدودیتها را تعیین کنید؛ زیرا شما نمیخواهید که سرور خود را با عملیات دریافت دادههای غیر ضروری بیش از حد بارگذاری کنید. همچنین، متغیرها را همانطور که به جداول دیتابیس شما مربوط هستند، جایگزین کنید.
نتیجه گیری
ما یک رابطه والد و فرزند را در یک سطح بسیار پایه بررسی کردهایم. حتی از رکوردهای کوچکی که ساختهایم، میتوانیم ببینیم که چگونه همینطور که کابران بیشتری اضافه میکنیم، این کار جدول ما را بسیار مرتبتر نگه میدارد. به طور معادل، میتوانیم تخمین بزنیم که این کار چقدر تجربه کاربران ما را ارتقا خواهد داد.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید