PDA

View Full Version : سوال: تعریف کلید کاندید در mysql



arminr2000
چهارشنبه 04 آذر 1394, 12:28 عصر
سلام از دوستان کسی می دونه چجوری میشه تو دیتابیس mysql کلید کاندید برای یک جدول تعریف کرد؟

از phpmyadmin برای مدیریت دیتابیس ایتفاده می کنم

djtrex
چهارشنبه 04 آذر 1394, 13:13 عصر
primary key یا کلید اصلی خودش یه کلید کاندید هست! من فکر کنم مشکل شما تعریف کلید کاندید باشه:

کلید کاندید از یک فیلد یا چند فیلد تشکیل شده و زیر مجموعه super key بوده و باید دو خاصیت زیر رو داشته باشه:
۱- رکورد یونیک (تاپل های مجزا) تشکیل بده. یعنی ۲ تا رکورد مشابه برای اون فیلد/فیلدها نباید داشته باشیم.
۲- نباید زیر مجموعه کوچک تری با خاصیت مورد قبل (۱) رو داشته باشه.
البته null هم نباید باشه! هر جدول باید حداقل یک کلید کاندید رو داشته باشه. کلید کاندید در حقیقت کاندیدی برای کلید اصلی هست یعنی میتونه به عنوان کلید اصلی انتخاب بشه. مثال

جدول دانشجوها:
شماره دانشجو
نام
نام خانوادگی
ایمیل
کدملی

الان (کدملی) و (نام , نام خانوادگی) و (شماره دانشجویی) و (ایمیل) می تونند کلید کاندید باشند. (صرف نظر از اسامی یا ایمیل مشترک!!)
حالا توی سیستم شماره دانشجویی رو میتونید به عنوان کلید اصلی در نظر بگیرید.

---------------
با همه این تعاریف میشه گفت کلید کاندید یا candidate key فقط در حد تئوری هست برای انتخاب کلید اصلی. (البته میشه unique (یکتا) بودن رو با unique key نشون داد!)

اطلاعات بیشتر:
http://rdbms.opengrass.net/2_Database%20Design/2.1_TermsOfReference/2.1.2_Keys.html
https://en.wikipedia.org/wiki/Candidate_key

Unique
چهارشنبه 04 آذر 1394, 13:19 عصر
یک لحظه هنگ کردم ! تا حالا اسم کلید کاندید را نشنیده بودم !
طبق بررسی که من کردم کلید کاندید در واقع یک Unique Key یا کلید یکتا هست که قابلیت تبدیل به primary یا کلید اصلی را داره !

بگذارین مثال بزنم :
مثلا شما میخواین یکسری شخص را توی یک جدول ثبت کنید. دو تا ستون داریم یکی ستون ID که Autoincement هست از نوع مثلا int و یکی ستون کد ملی که ۱۰ کاراکتر هست (چون کد ملی اولش صفر میگیره نمیشه عددی ذخیره کرد). حالا این دو تا کلید یکتا کاندیدای کلید اصلی شدن هستند و بهشون میگن کلید کاندید.

حالا برای انتخاب کلید اصلی باید یکسری تحلیل انجام داد ! مثلا در این مثال چون ID از نوع عددی هست و Database خودش یکتا ایجادش میکنه و جستجو و ایندکس و ... توی یک ستون عددی خیلی سریعتر از یک ستون ۱۰ کاراکتری هست من ID را کلید اصلی میگیرم. حالا اون کد ملی دیگه فقط یک کلید یکتا هست و بس.

این چیز ها آکادمیک و مفهومیه و وقتی شما میاین میپرسین چطور کلید کاندید بسازیم من مطمئن میشم یا استاد خوب تدریس نکرده ، یا شما خوب درس را یاد نگرفتین و از همه مهمتر اینکه آموزش آکادمیک به درد کار اجرایی نمیخوره !

Unique
چهارشنبه 04 آذر 1394, 13:28 عصر
شرمنده ! تا داشتم مینوشتم djtrex عزیز توضیح دادن ! به شدت با این دوستانی که اخیرا وقتی یکی جواب مید همیان همون را یکجور دیگه کپی و پیست میکنن مشکل دارم. البته توضیحات من با ایشون در تضاد هست.



الان (کدملی) و (نام , نام خانوادگی) و (شماره دانشجویی) و (ایمیل) می تونند کلید کاندید باشند. (صرف نظر از اسامی یا ایمیل مشترک!!)
تا جایی که من خوندم کلید کاندید باید یکتا باشه ! یعنی نام و نام خانوادگی و ایمیل نمیتونن کاندید باشن و توی مثال شما فقط کد ملی میتونه کاندید باشه و شماره دانشجویی. در ضمن همونطور که توی پست قبلی گفتم انتخاب شماره دانشجویی با توجه به عددی بودن و سرعت بیشتر توی خیلی از query ها به عنوان کلید اصلی مناسبتره.

arminr2000
چهارشنبه 04 آذر 1394, 14:29 عصر
ممنون بابت توضیحات مفید و خوبتون
یه نکته بگم که ما متاسفانه استادی نداشتیم که این چیزارو بهمون یاد بده بیشتر از ما یاد می گرفتن اساتید!!!! :لبخندساده::لبخندساده::لبخن ساده::لبخندساده:

حالا بزارین من با این مثال توضیح بدم که دلیل این طرح سوال چی بوده

من یه جدول دارم به این صورت :
(ID, name , hospital , ill(
که هیچ کدوم از اینا منحصر بفرد نیستن ( چون ID از یه جای دیگه میاد که ممکنه در جدول چند بار تکرار بشه )

حالا من می خوام ID و name رو به صورت ترکیبی به صورت کلید تعریف کنم

حالا کلید کاندید یا هر نوع کلید دیگه ای

اصلا به نظر شما یه همچین جدولی قابل پیاده سازی هست یا نه؟؟

djtrex
چهارشنبه 04 آذر 1394, 16:41 عصر
شرمنده ! تا داشتم مینوشتم djtrex عزیز توضیح دادن ! به شدت با این دوستانی که اخیرا وقتی یکی جواب مید همیان همون را یکجور دیگه کپی و پیست میکنن مشکل دارم. البته توضیحات من با ایشون در تضاد هست.



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

قسمت اولتون رو که متوجه نشدم اگه منظورتون من بودم که من ۱۳:۴۳ فرستادم شما ۱۳:۴۹. تقریبا هم زمان بوده!

قسمت دوم من توی پرانتز نوشتم صرف نظر از اسامی مشترک یا ایمیل مشترک! در حقیقت مثال زدم برای اینکه از لحاظ تئوری مشخص بشه منظور چی هست. هرچند سیستمی که ایمیل به عنوان نام کاربری در نظر گرفته میشه میتونه کلید کاندید باشه چون یونیک هست. در مورد کد ملی هم ۰ پشتشو رو حذف کنید میشه عددی و باز هم یونیک هست.

در مورد اینکه همیشه کلید باید عددی باشه اینطور نیست! همیشه سریعترین بهترین راه حل نیست. ممکنه توی یه سیستمی کلیدی از نوع رشته ای برای من به صرفه تر باشه مثل uuid یا access token و refresh_token ها توی oauth 2.

(البته اینا همه مربوط به rdbms ها هست و در دیتابیسهای nosql خیلی موارد فرق میکنه)

--------------


ممنون بابت توضیحات مفید و خوبتون
یه نکته بگم که ما متاسفانه استادی نداشتیم که این چیزارو بهمون یاد بده بیشتر از ما یاد می گرفتن اساتید!!!! :لبخندساده::لبخندساده::لبخن ساده::لبخندساده:

حالا بزارین من با این مثال توضیح بدم که دلیل این طرح سوال چی بوده

من یه جدول دارم به این صورت :
(ID, name , hospital , ill(
که هیچ کدوم از اینا منحصر بفرد نیستن ( چون ID از یه جای دیگه میاد که ممکنه در جدول چند بار تکرار بشه )

حالا من می خوام ID و name رو به صورت ترکیبی به صورت کلید تعریف کنم

حالا کلید کاندید یا هر نوع کلید دیگه ای

اصلا به نظر شما یه همچین جدولی قابل پیاده سازی هست یا نه؟؟

میتونید یه id به صورت auto increment خودتون توی سیستم تعریف کنید یا اگه مطمئن هستید ID و name همیشه یونیک هستند به عنوان کلید اصلی ترکیبی (چند فیلد) استفاده کنید.

arminr2000
چهارشنبه 04 آذر 1394, 16:51 عصر
میتونید یه id به صورت auto increment خودتون توی سیستم تعریف کنید یا اگه مطمئن هستید ID و name همیشه یونیک هستند به عنوان کلید اصلی ترکیبی (چند فیلد) استفاده کنید.

اره ترکیب این دوتا همیشه یونیک هستند ، پس قابل انجامه...

تو phpmayadmin همزمان میشه هردو رو کلید تعریف کرد؟ و اگه میشه چجوری؟

ضمنا لینک هایی که گذاشتین خیلی خوب بود مرسی

djtrex
چهارشنبه 04 آذر 1394, 17:21 عصر
اره ترکیب این دوتا همیشه یونیک هستند ، پس قابل انجامه...

تو phpmayadmin همزمان میشه هردو رو کلید تعریف کرد؟ و اگه میشه چجوری؟

ضمنا لینک هایی که گذاشتین خیلی خوب بود مرسی



CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL,
`name` varchar(40) COLLATE utf8_persian_ci NOT NULL,
PRIMARY KEY (`id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;

Unique
چهارشنبه 04 آذر 1394, 18:49 عصر
قسمت اولتون رو که متوجه نشدم اگه منظورتون من بودم که من ۱۳:۴۳ فرستادم شما ۱۳:۴۹. تقریبا هم زمان بوده!
خیلی واضح بود ، من گفتم شرمنده و منظورم خودم بود.


قسمت دوم من توی پرانتز نوشتم صرف نظر از اسامی مشترک یا ایمیل مشترک! در حقیقت مثال زدم برای اینکه از لحاظ تئوری مشخص بشه منظور چی هست
چون اسامی زیاد مشابه دارن و ایمیل هم ممکنه یک مجموعه از یک ایمیل استفاده کنن یعنی شخصی نباشه به نظرم موضوع صرف نظر در موردشون صدق نمیکنه و نمیتونن کلید کاندید برای primary باشن.


در مورد کد ملی هم ۰ پشتشو رو حذف کنید میشه عددی و باز هم یونیک هست
منظورتون چیه حذف کنیم ؟

اولا که یک صفر نیست و میتونه بیش از یک صفر باشه تا جایی که دیدم دو صفر هم هست.
ثانیا اگه فرض را بر این بگذاریم اگه کمتر از ۱۰ رقم بود هر چی کم داشت اولش صفر میشه کلا Bad Practice هست و وقتی میشه شسته رفته کلید اصلی مشخص کرد نباید اینطوری عمل کرد.
ثالثا حتی اگه عددش هم بکنیم فیلد int براش کم میاد و باید bigint بگذاریم و دو برابر int توی پایگاه و ایندکس و خیلی مباحث دیگه ضرر کنیم.


در مورد اینکه همیشه کلید باید عددی باشه اینطور نیست!
من چنین چیزی نگفتم !


همیشه سریعترین بهترین راه حل نیست. ممکنه توی یه سیستمی کلیدی از نوع رشته ای برای من به صرفه تر باشه مثل uuid یا access token و refresh_token ها توی oauth 2.
قطعا ولی توی مثال هایی که خودشون توی پست ۵ زدن برای ایشون صدق نمیکنه.