veniz2008
جمعه 23 فروردین 1392, 18:52 عصر
سلام دوستان.
من یکی دو سوال در طراحی جداول برام پیش اومده.
یه سیستم ساده ثبت اطلاعات دانشجو با 3 جدول : 1. دانشجو (شماره دانشجویی کلید باشه). 2. درس(فیلد کلید کد درس) 3. اخذ درس رو در نظر بگیرید.
فرض رو بر این بگیرید که این طراحی درست باشه (که قطعا نیست و نیاز به اصلاح داره).
سوال من درباره طراحی جدول اخذ هست. کلید قاعدتا باید حداقل 4 فیلد سال تحصیلی،شماره ترم، شماره دانشجویی و کد درس رو شامل بشه. در چنین مواردی اصلا توصیه نمیشه که کلید ترکیبی که شامل 4 فیلد ذکر شده هست رو در نظر بگیریم بلکه توصیه میشه که یک فیلد identity بعنوان کلید بگیریم و 4 فیلد ذکر شده رو unique کنیم.
یکی از دلایلش میتونه بخاطر این باشه که اگر چنین کلید ترکیبی بخواد در جداول دیگه به عنوان کلید خارجی استفاده بشه قطعا فضای بیشتری رو در مقایسه با تک کلید بودن در بر خواهد گرفت.
مورد بعدی میتونه در زمان join کردن جداول chid و parent رخ بده که اگر کلید اصلی (و بالطبع کلید خارجی) رو ترکیبی بگیریم چک کردن چند فیلد بصورت همزمان زمان بیشتری رو در قیاس با تک فیلد بودن در برخواهد داشت.
مورد بعدی که به ذهنم میرسه ولی مطمئن نیستم که تا چه اندازه ای صحیح باشه اینه که :
یکی از دلایل اینکه فیلد های ترکیبی رو کلید نمیگیرن شاید بخاطر این باشه که خود sql بصورت خودکار از کلید یک Clustered INDEX میسازه و هزینه این مرتب سازی براساس چند فیلد میتونه در رکوردهای زیاد، قابل توجه باشه. آیا این دلیل درسته؟
با توجه به دلیل اول ( نامناسب بودن کلید ترکیبی که در جدول دیگه حکم کلید خارجی رو داشته باشه) یک سوال برای من بوجود اومده :
اگر یک جدول که کلید اصلی اون ترکیبی هست با جداول دیگه ارتباطی نداشته باشه (بعنوان کلید خارجی در جداول دیگه به کار نرفته باشه) آیا باز هم بهتره که کلید اصلی رو identity و اون چند فیلد رو unique کنیم؟. یا فقط زمانی unique میکنیم که جدول ما به عنوان یک parent باشه و با جداول child در ارتباط باشه؟
از دوستانی که در بحث شرکت میکنن و جواب های علمی به مساله میدن تشکر میکنم.
من یکی دو سوال در طراحی جداول برام پیش اومده.
یه سیستم ساده ثبت اطلاعات دانشجو با 3 جدول : 1. دانشجو (شماره دانشجویی کلید باشه). 2. درس(فیلد کلید کد درس) 3. اخذ درس رو در نظر بگیرید.
فرض رو بر این بگیرید که این طراحی درست باشه (که قطعا نیست و نیاز به اصلاح داره).
سوال من درباره طراحی جدول اخذ هست. کلید قاعدتا باید حداقل 4 فیلد سال تحصیلی،شماره ترم، شماره دانشجویی و کد درس رو شامل بشه. در چنین مواردی اصلا توصیه نمیشه که کلید ترکیبی که شامل 4 فیلد ذکر شده هست رو در نظر بگیریم بلکه توصیه میشه که یک فیلد identity بعنوان کلید بگیریم و 4 فیلد ذکر شده رو unique کنیم.
یکی از دلایلش میتونه بخاطر این باشه که اگر چنین کلید ترکیبی بخواد در جداول دیگه به عنوان کلید خارجی استفاده بشه قطعا فضای بیشتری رو در مقایسه با تک کلید بودن در بر خواهد گرفت.
مورد بعدی میتونه در زمان join کردن جداول chid و parent رخ بده که اگر کلید اصلی (و بالطبع کلید خارجی) رو ترکیبی بگیریم چک کردن چند فیلد بصورت همزمان زمان بیشتری رو در قیاس با تک فیلد بودن در برخواهد داشت.
مورد بعدی که به ذهنم میرسه ولی مطمئن نیستم که تا چه اندازه ای صحیح باشه اینه که :
یکی از دلایل اینکه فیلد های ترکیبی رو کلید نمیگیرن شاید بخاطر این باشه که خود sql بصورت خودکار از کلید یک Clustered INDEX میسازه و هزینه این مرتب سازی براساس چند فیلد میتونه در رکوردهای زیاد، قابل توجه باشه. آیا این دلیل درسته؟
با توجه به دلیل اول ( نامناسب بودن کلید ترکیبی که در جدول دیگه حکم کلید خارجی رو داشته باشه) یک سوال برای من بوجود اومده :
اگر یک جدول که کلید اصلی اون ترکیبی هست با جداول دیگه ارتباطی نداشته باشه (بعنوان کلید خارجی در جداول دیگه به کار نرفته باشه) آیا باز هم بهتره که کلید اصلی رو identity و اون چند فیلد رو unique کنیم؟. یا فقط زمانی unique میکنیم که جدول ما به عنوان یک parent باشه و با جداول child در ارتباط باشه؟
از دوستانی که در بحث شرکت میکنن و جواب های علمی به مساله میدن تشکر میکنم.