# پایگاه‌های داده > سایر پایگاه‌های داده > MySQL > سوال: کار کلید خارجی چیه و در تعریف کلید خارجی باید چه نکاتی رو مد نظر قرار داد؟

## idocsidocs

کار کلید خارجی چیه و در تعریف کلید خارجی باید چه نکاتی رو مد نظر قرار داد؟

----------


## rasoul_par

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

----------


## idocsidocs

> پدر آپدیت یا دیلیت شد چه اتفاقی واسه فرزند بیوفته


بنظرم مهمترین مسئله همینه

فرض کنید اطلاعات جدول پدر اینسرت شد ولی قبل از اینسرت شدن اطلاعات جدول فرزند سرور از کار بیافته اینطوری دیگه فرزندی باقی نمی مونه. برای اینسرت کردن اطلاعات این دوجدول که رابطه پدر و فرزندی دارن باید دو کوئری مجزا بکار برد یا باید تراکنش کرد؟

مسئله دیگه اینکه برای جداولی که فرزند هستن، باید کلید اولیه هم تعریف کرد یا نه؟

----------


## rasoul_par

> فرض کنید اطلاعات جدول پدر اینسرت شد ولی قبل از اینسرت شدن اطلاعات جدول  فرزند سرور از کار بیافته اینطوری دیگه فرزندی باقی نمی مونه. برای اینسرت  کردن اطلاعات این دوجدول که رابطه پدر و فرزندی دارن باید دو کوئری مجزا  بکار برد یا باید تراکنش کرد؟


تیکه اول رو نفهمیدم منظورت چیه، ولی خب چند تا آپشن داریم توی دیتابیس:

ON DELETE (UPDATE) NO ACTION
ON DELETE (UPDATE) CASCADE

دو نمونه از اونهاست.




> مسئله دیگه اینکه برای جداولی که فرزند هستن، باید کلید اولیه هم تعریف کرد یا نه؟


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

----------


## idocsidocs

لطفا در مورد این کدها بیشتر توضیح بدید:
ON DELETE (UPDATE) NO ACTION
ON DELETE (UPDATE) CASCADE
اینجا منظور از ضعیف بودن چیه؟



> اما اگر ضعیف نباشه قطعا اون موجودیت کلید اصلی خودش رو داره

----------


## rasoul_par

همون چیزی که بالا گفتمه، فیلد a که یک کلید خارجیه حتما به یه جدول دیگه مربوطه مثل جدول x، حالا اگر یک فیلد خاص توی جدول X آپدیت/دیلیت بشه، واسه فیلد a که توی یک جدول دیگست چه اتفاقی بیوفته، هیج اتفاقی نیوفته، کسکید بشه یعنی بعد از تغییر توی جدول x فیلد a هم تغییر کنه، به نال تبدیل بشه و ...
موجودیت ضعیف توی طراحی دیتابیست مشخص میشه، مثلا فکر کن پرسنل میتونن فرزنداشون رو بیمه کنن و اطلاعات فرزند مثل سن و ... لازمه، در این صورت موجودیت فرزند یک موجودیت ضعیفه چون به یک موجودیت دیگه یعنی پرسنل وابسته است. برای اطلاعات بیشتر بهتره به کتابای طراحی پایگاه داده مراجعه کنی که کامل توضیح دادن

----------


## idocsidocs

> برای اطلاعات بیشتر بهتره به کتابای طراحی پایگاه داده مراجعه کنی که کامل توضیح دادن


لطفا یه کتاب معرفی کنید.

----------


## rasoul_par

فارسی کتاب های مختلفی هست مثل کتاب ناصر آیت و دکتر رانکوهی که ایبوک هر دوتاش هست.
انگلیسی هم من کتاب Database Management Systems (2nd Ed.)  نوشته Raghu Ramakrishnan و یه نفر دیگه رو پیشنهاد میکنم.

----------


## idocsidocs

> فارسی کتاب های مختلفی هست مثل کتاب ناصر آیت و دکتر رانکوهی که ایبوک هر دوتاش هست.


این کتابها مخصوص mysql هستن یا کلی توضیح دادن؟

----------


## rasoul_par

موجودیت ضعیف ربطی به DBMS نداره، مثل اینکه تو بخوای یک برنامه ماشین حساب بنویسی، اول باید مشخص کنی توابع مختلف چطور کار میکنن، بعد میتونی با هر برنامه ای بنویسیش، C#‎، جاوا، پی اچ پی و ...

----------

