مفهوم Relationship و کاردینالیتی (Cardinality) در پایگاه داده + مثال

16 تیر 1393 اس کیو ال SQL

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

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

ایجاد این ارتباطات نه تنها جلوی ذخیره داده های تکراری (Data Redundancy) را می گیره، بلکه باعث حفظ یکپارچگی داده ها (Data Integrity) در طول زمان می شه. برای برقراری این ارتباط ها، از دو مفهوم کلیدی استفاده می شه:

  • کلید اصلی (Primary Key یا PK): ستونی در جدول که هر رکورد را به صورت منحصر به فرد شناسایی می کنه.

  • کلید خارجی (Foreign Key یا FK): ستونی در یک جدول که به کلید اصلی جدول دیگر اشاره کرده و پل ارتباطی بین دو جدول هست.

وقتی بین دو جدول ارتباط برقرار می کنید، دیتابیس از قانونی به نام «یکپارچگی ارجاعی» (Referential Integrity) پیروی می کند. این قانون اجازه نمی دهد رکوردی در جدول فرزند ثبت شود که کلید خارجی آن در جدول پدر وجود ندارد.

ما در این مقاله فرض کردیم شما:

  • با دیتابیس و دستورات دیتابیس آشنا هستید.
  • تا حالا کار با پایگاه داده رو انجام داده اید.
  • از ماهیت جدول ها در دیتابیس اطلاع دارید.

در غیر این صورت این مقاله برای شما ممکن است کمی پیچیده به نظر بیاید.

relationship در پایگاه داده یا دیتابیس چیست؟

وقتی صحبت از relation میشه همه یاد رل هاشون میوفتن به این فکر می کنن با چند نفر ریلیشن زدن خوب این که خیلی خوبه، این یعنی حداقلش اینه میدونین معنی ریلیشن چی هستش 😛

ریلیشن در داده های کامپیوتری هم برقرار بشه و ارتباط این داده و ممزوج شدنش مشخص بشود تا بهره وری دیتابیس بالا بره از این رو relation که معنی اون به پارسی، وابستگی است، در داده های گاهی همگون و یا ناهمگون به هم مرتبط وجود دارد.

مدل کاردینالیتی Cardinality چیست؟

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

میشود گفت که شیوه آن به این شکل است که جدول های مشخص شده را به یک یا چند جدول دیگر وابسته می سازد تا در کار با دیتابیس سرعت و قدرت بیشتری داشته باشیم و این وابسته کردن منظور این نیست که این کار اتوماتیک انجام میشود خیر این قانون وضع میشود و شما باید مجری آن باشید و اضول آن پیروی کنید و اما انواع متد های کاردینالیتی:

قبل از بررسی حالت های چند به چند و یک به چند، باید به ساده ترین حالت ارتباط یعنی «یک به یک (One-to-One یا ۱:۱)» هم اشاره کرد:

  • ارتباط یک به یک

در این حالت هر رکورد در جدول A دقیقاً و حداکثر به یک رکورد در جدول B وصل می شود. مثل ارتباط میان جدول «کاربران» و «پروفایل تکمیلی کاربر». از این روش معمولاً برای جداسازی داده های سنگین یا حساس از جدول اصلی استفاده می شود.

  • ارتباط یک به چند

ساده ترین نوع ارتباط اساسی در واقع یک به چند است که در اصطلاح به آن one-to-many گفته میشود که معمولا از نوع دوم آن کمتر استفاده میشود و شیوه کار آن به این صورت است که شما یک رکورد دارید و نیاز دارید که چند رکورد را به آن وابسته کنید که در ادامه مثال خواهیم زد.

در پیاده سازی عملیاتی رابطه یک به چند، کلید اصلی (PK) از سمت «یک» برداشته شده و به عنوان کلید خارجی (FK) در سمت «چند» قرار داده می شود.

  • ارتباط چند به چند

حالت چند به چند کمی پچیپده تر از یک به چند است و در اصطلاح آن را many-to-many می نامند که معمولا چند رکورد به چند رکورد دیگر وابسته اند، درواقع تفاوت با حالت قبلی این است که هر رکورد چه در سمت مقصد و چه مبدا دارای وابستگی به چند رکورد دیگر باشد که در مثال ادامه کاملا روشن میشود برای شما.

نکته بسیار مهم در دیتابیس های رابطه ای (مثل MySQL یا PostgreSQL) این است که دیتابیس ها نمی توانند رابطه چند به چند را به صورت مستقیم بین دو جدول ایجاد کنند!

برای حل این مشکل، طراح دیتابیس باید از یک جدول واسط (Junction Table یا Pivot Table) استفاده کند. این جدول واسط، کلیدهای اصلی هر دو جدول را به عنوان کلید خارجی در خود ذخیره کرده و رابطه چند به چند را به دو رابطه یک به چند تبدیل می کند.

مثال: ما فرض می کنیم ۳ مولفه در زیر داریم که هر کدام دارای رکورد چند رکورد هستند:

  • مالک یا صاحب به عنوان مثال رکورد ها ( صادق، مبین، حمید و …)
  • اتومبیل به عنوان ( بنز، فراری، فورد و …)
  • رنگ اتومبیل ( قرمز، نقره ای، سفید و…)

خب در اینجا ما مثال رو بررسی می کنیم در حالت های مختلف:

حالت یک به چند به عنوان مثال رابطه مالک و اتومبیل یک به چند می باشد چون یک اتومبیل بیش از یک مالک نمیتواند داشته باشد ولی یک مالک میتواند چندین اتومبیل داشته باشد پس رابطه یک به چند شد مثلا: حمید دارای یک فراری و ۳ بنز است حمید همیشه تنها است تو این معادله و برای این ۳ اتومبیل هیچ گزینه ای جز حمید وجود ندارد.

نکته : اگر دیتابیس مربوط به ثبت اسناد یا نقل و انتقالات باشد، یک خودرو می‌ تواند در طول زمان مالکان متعددی داشته باشد (رابطه چند به چند). اما اگر فرض دیتابیس صرفاً «مالک فعلی» باشد، رابطه یک به چند درست است. 

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

برای پیاده سازی دقیق همین مثال «چند به چند» اتومبیل و رنگ در دیتابیس، ساختار ۳ جدول به این شکل خواهد بود:

  1. جدول اتومبیل ها (Cars): شامل شناسه (Car_ID) و نام خودرو

  2. جدول رنگ ها (Colors): شامل شناسه (Color_ID) و نام رنگ

  3. جدول واسط رنگ_اتومبیل (Car_Color): شامل دو ستون FK_Car_ID و FK_Color_ID که نشان می دهد کدام خودرو چه رنگ هایی را به خود اختصاص داده است.

کادرینالیتی در پایگاه داده چیست

ارتباط با خود یا بازگشتی (Self-Referencing Relationship)

علاوه بر حالت های بالا، نوع دیگری از ارتباط وجود دارد که در آن یک جدول با خودش ارتباط برقرار می کند. این حالت برای داده های سلسله مراتبی کاربرد دارد؛ مانند جدول «کارمندان» که در آن یک ستون به نام manager_id به id کارمند دیگری در همان جدول اشاره می کند تا مشخص شود مدیر هر شخص کیست.

تنظیم رفتار حذف و ویرایش داده ها (ON DELETE / ON UPDATE)

در زمان تعریف کلید خارجی بین جداول، باید مشخص کنید که اگر یک رکورد اصلی حذف شد، رکوردهای وابسته چه شوند:

  • CASCADE: با حذف رکورد اصلی، رکوردهای وابسته به طور خودکار حذف می شوند.

  • SET NULL: با حذف رکورد اصلی، مقدار کلید خارجی در جدول فرزند NULL می شود.

  • RESTRICT: تا زمانی که رکورد وابسته ای وجود دارد، اجازه حذف رکورد اصلی داده نمی شود.

نکته پایانی برای افزایش سرعت دیتابیس: ایجاد ارتباط و Foreign Key می تواند سرعت کوئری ها را کاهش دهد. برای حل این مشکل، حتماً روی تمامی ستون های کلید خارجی (FK) عملیات ایندکس گذاری (Indexing) را انجام دهید تا سرعت عملیات JOIN افت نکند.

 

💬

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

دیدگاه شما چیست؟

نظرات (1)

شهاب قنادزاده
17 آبان 1398

سلام. از طرز بیان حضرتعالی لذت بردم و ابهام های بنده کاملا برطرف شد


ارسال نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

عضویت در شبکه‌های اجتماعی

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