وقتی جدولها عاشق میشوند (قسمت دوم از مفاهیم دیتابیس)
خب خب رسیدیم به قسمت دوم از سری مجموعه مفاهیم دیتابیس، توی این قسمت میخواییم به مفهوم کلید ها و عشق و رابطه میون جدول ها رو مورد بررسی قرار بدیم. دقت کنید که توی این سری مجموعه ما با انواع مفاهیم دیتابیس آشنا میشیم و کاری با کد زدن و نوع خاصی از دیتابیسا ها نداریم
✅ اول ببینیم کلید (keys) توی دیتابیس چیه و اصلا چرا بهش نیاز داریم ؟؟؟
توی دیتابیسها، کلیدها (Keys) نقش خیلی مهمی در مدیریت دادهها و ایجاد ارتباط بین جداول ها رو دارند و هر نوع کلید هدف خاصی دارد که به سازماندهی دادهها و جلوگیری از تناقض کمک میکند
به زبون ساده تر بخوام بگم، وقتی شما یه جدول میسازید و یکسری داده توش دارید خب هر داده باید یه چیز یونیک داشته باشه که بشه اون رو از بقیه داده ها تشخیص داد دیگه؟ به اون چیز یونیک میگن کلید. دقیقا عین کدملی هر ایرانی که یک چیز unique یا همون یکتا برای هر شخص هست
نوع کلید بسته به پروژه میتونه هر چیزی باشه مثلا ایمیل، UUID یا شماره تلفن یا هرچیزی باشه
✅ انواع کلید ها رو بشناس :(جلوتر مثال هاشون رو میزنم)
کلید اصلی (primary key) 👈 کلید اصلی یک ستون توی یک جدول، که بهطور منحصربهفرد هر ردیف(رکورد) رو شناسایی میکنه و هر جدول فقط میتواند یک کلید اصلی داشته باشد. دقت کن که این کلید باید یونیک(Unique) باشد و مقدار null را نپذیرد یعنی تو نمیتونی دوتا موجودیت مثل کاربر رو پیدا کنی که هردوتاشون کدملی یکسانی داشته باشن یا اصلا کد ملی نداشته باشن و null باشن
کلید خارجی (foreign key) 👈کلید خارجی یا کلید ارجاعی، برای ایجاد ارتباط بین دو جدول استفاده میشه. این کلید به ستون یا کلید اصلی در جدول دیگری اشاره میکند و به یکپارچگی دادهها کمک میکند(بعدن مفهوم یکپارچگی رو توی مبحث ACID توضیح میدم فعلا زیرپوستی بگذر ازش) دقت کن این کلید برعکس کلید اصلی میتونه مقدار null بگیره
کلید ترکیبی (Composite Key) 👈کلید ترکیبی ، ترکیبی از دو یا تعداد بیشتری ستون است که به طور یکتایی سطرها را در جدول را شناسایی میکند. دقت کنید که ترکیب این ستون ها(نه فقط یک ستون) هستش که یکتا بودن رو تضمین میکنه، اگرچه، یکتا بودن به صورت مستقل تضمین نمیشه. پس، دو یا تعداد بیشتری از ستونها ترکیب میشن تا رکوردها را به صورت یکتایی بتونیم شناسایی کنیم. مثلا فرض کن نام و نام خانوادگی و اسم پدر هر کدوم جدا هستن اما ترکیب این سه تا یک کلید ترکیبی میشه که بتونیم یک شخص رو بشناسیم ولی هرکدوم به تنهایی معلوم نمیکنه که اون شخص کیه
تقریبا مهم تریناش این سه تا بودن که گفتم وگرنه کلید های خیلی زیاد تری هستن که میشه تا صبح راجبشون بحث کرد و خب مقاله خیلی طولانی میشه. میتونید با سرچ ساده پیداشون کنید(توی عکس زیرم هستن)
خب نوبتی هم که باشه نوبت ارتباط میون جدول ها و عشق بازی❤️ اونها هستش
✅ اصلا این روابط چی هست ؟؟؟
توی دیتابیسها، روابط (Relationships) نقش مهمی توی ساختاردهی دادهها و برقراری ارتباط بین جداول دارن. این روابط به ما کمک میکنن که دادههای مرتبط را بهطور مؤثرتری مدیریت کنیم. چهار نوع اصلی رابطه وجود داره که باهم بررسیشون میکنیم
✅ رابطه یک به یک(One To One) یا 1:1
در رابطه یک به یک، هر رکورد از یک جدول با دقیقاً یک رکورد از جدول دیگر مرتبط است. از این رابطه زمانی استفاده میکنیم که دو مجموعه داده کاملاً مرتبط باشن ولی دلایل خاصی برای جدا کردن آنها به دو جدول وجود داشته باشد، مثل مسائل امنیتی یا بهینهسازی.
فرض کن یه جدول user داریم که کلی اطلاعات توشه خب برای اینکه هم دیزاین بهتری داشته باشیم و هم بهینه تر بشه میتونیم اطلاعاتی که اهمیتشون کمتره رو توی جدولی به اسم profile بزاریم و این دوتارو به صورت یک به یک به هم متصل کنیم یعنی به اعضای هر یک دونه یوزر فقط و فقط یک دونه پروفایل وجود داشته باشه و این دوتا از طریق کلید اصلی به هم متصل میشن
توی عکس زیر جدول یوزر و پروفایل از طریق کلید اصلی userId با هم ارتباط یک به یک دارن
✅ رابطه یک به چند(One To Many) یا 1:n
در رابطه یک به چند، هر رکورد در جدول اول میتونه با صفر یا یک یا چند رکورد از جدول دوم مرتبط باشد، ولی هر رکورد در جدول دوم فقط با یک رکورد از جدول اول مرتبط است. این نوع رابطه یکی از رایجترین روابط در دیتابیسهاس.
فرض کنید یه جدول داریم به اسم کاربر و یک جدول دیگه به اسم articles حالا بیایین تحلیلش کنیم، همیشه برای تحلیل از این جمله استفاده کنید
a user has many article and a article has one user
حالا همه چی مشخص شد، هر کاربر میتونه چندین مقاله داشته باشه اما هر مقاله فقط و فقط مربوط به یک یوزر هست پس رابطمون میشه یک به چند. اینجاست که کلید خارجی به کار میاد و باید ازش استفاده کنیم. در واقع هر مقاله از طریق یک userId به اون کاربر مورد نظر متصل شده پس userId مورد نظر توی جدول article میشه کلید خارجی ما
✅ رابطه چند به چند(Many To Many) یا m:n
در رابطه چند به چند، هر رکورد از یک جدول متونه با چند رکورد از جدول دیگر مرتبط باشد و بالعکس. برای پیادهسازی این نوع رابطه، معمولاً یک جدول میانی (junction table) استفاده میشه که ارتباط بین دو جدول اصلی را مدیریت میکنه.
مثلا رابطه جدول articles با جدول tags یک رابطه چند به چند هست.چرا؟
بیایین تحلیلش کنیم: هر مقاله میتونه دارای چندین تگ باشه و هر تگ هم میتونه متعلق به چندین مقاله باشه پس رابطه ما میشه چند به چند
نکته این رابطه اینه که باید یه جدول دیگه هم بسازیم تا جدول مقاله با تگ هارو به هم متصل کنه
البته این نکته رو هم بگم اگه از ORM ها استفاده میکنید براتون این قضیه ساخت جدول میانی many to many رو حل کردن و نیاز نیست شما کاری کنید
✅ تکلیف حذف کردن ها چی میشه پس :
خب حالا فرض کنید یه کاربر 100 تا مقاله نوشته و یهو تصمیم میگیره اکانتشو از سایت پاک کنه پس تکلیف اون صد تا مقاله چی میشه ؟
اینجاست که دیتابیس ها چیزی به اسم ON DELETE دارن که دقیقا برای همین کار ساخته شده . یعنی در تنظیمات روابط دیتابیس، گزینههای ON DELETE مشخص میکنه که هنگام حذف رکورد مرجع (parent) که اینجا منظور user هست، چه اتفاقی برای رکوردهای مرتبط (child) یعنی articles بیوفته.
✅ انواع ON DELETE :
مقدار ON DELETE CASCADE :با حذف رکورد مرجع(user)، رکوردهای مرتبط در جدول دیگر(articles) نیز بهطور خودکار حذف میشوند.
مثال: اگر یک کاربر حذف بشه، تمام مقالات مرتبط با اون هم حذف خواهند شد.
مقدار ON DELETE SET NULL :با حذف رکورد مرجع(user)، مقدار ستون کلید خارجی در رکوردهای مرتبط(articles) به null تنظیم میشود.
مثال: اگر یک کاربر حذف شود، مقاله های مرتبط به null تغییر میکنن.
مقدار ON DELETE RESTRICT :از حذف رکورد مرجع(user) تا زمانی که رکوردهای مرتبط(articles) وجود دارند جلوگیری میکند
مثال: اگر یک کاربر مقالاتی داشته باشه، حذف کاربر مجاز نیست تا زمانی که مقالات او حذف شوند.
مقدار ON DELETE NO ACTION :مثلRESTRICT عمل میکند اما بدون تأثیر مستقیم بر تراکنشها؛ حذف بدون خطا انجام میشود اما تغییرات وابسته نادیده گرفته میشود.
مقدار ON DELETE SET DEFAULT :با حذف رکورد مرجع، مقدار ستون کلید خارجی در رکوردهای مرتبط به مقدار پیشفرضی تنظیم میشود (در صورتی که پیشفرضی تعریف شده باشد).
امیدوارم مورد استفاده اتون قرار گرفته باشه
اگه دوست داشتید توی کانال تلگرامیمون هم عضو بشید LearnByLearn@