PDA

View Full Version : طراحی یک پایگاه داده



shotshat
دوشنبه 28 آبان 1386, 10:08 صبح
سلام
اول از همه باید بگم که جای بهتری برای طرح سوالم توی فروم پیدا نکردم پس اگه سوالم مربوط به این بخش نیست پیشاپیش عذر می خواهم.

یک سوال در مورد طراحی یک دیتا بیس داشتم
فرض کنید یکسری افراد داریم با مشخصات : نام- نام خانوادگی- شماره شناسنامه و...
این افراد یکسری زبان خارجی بلد هستند که sreaking, writing,reading آنها می تواند سطوح مختلفی مثل عالی خوب متوسط وضعیف داشته باشد
می خواستم ببینم طراحی دیتا بیس آن چطوری می شود؟

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

http://rapidshare.com/files/70731289/untitled.bmp.html

shotshat
دوشنبه 28 آبان 1386, 10:12 صبح
http://barnamenevis.org/forum/C:\Documents and Settings\Ali\Desktop\untitled.bmp

shotshat
دوشنبه 28 آبان 1386, 10:31 صبح
نمی دونم چرا عکسش نیومد ولی به هر حال لینک به عکسش اینه:http://rapidshare.com/files/70731289/untitled.bmp.html

یک جدول person شامل مشخصات افراد ویک جدول Language شامل فیلدهای language-sreaking, writing,reading,ID
گذاشتم. این دو جدول با هم رابطه چند به چند دارند پس یک جدول واسط بین آنها تشکیل می شود که فیلدهای آن کلیدهای دو جدول قبل هستند(PersonalID,LanguageID)

مشکل اینجاست که اگر سطر حاوی [English-good-good-good-1]دارای ID=1 باشد و سطر [English-bad-bad-bad-2] دارای ID=2 در جدول واسط یک نفر هم می تواند ID یک را داشته باشد هم2 را
و اگر برای اینکه تکرار صورت نگیرد تمام فیلدهای جدول language را به عنوان کلید اصلی در نظر بگیریم باید تمام کلیدهای این جدول در جدول واسط هم بیاید یعنی جدول language 2بار تکرار می شود و این بی معنی است!

AminSobati
دوشنبه 28 آبان 1386, 10:50 صبح
دوست عزیزم،
شما یک جدول Person و یک جدول Language نیاز دارید. در جدول Language سطح Writing و این موارد رو ذخیره نمیکنید. بلکه جدول واسطی بین این دو نیاز هست که PersonID و LanguageID با هم PK میشن و در این جدول واسط شما سطح Writing و ... رو ذخیره میکنید.

shotshat
دوشنبه 28 آبان 1386, 11:01 صبح
فکر نمی کنی اینطوری افزونگی پیدا کنیم؟
در حالتی که سطوح speaking, writing,reading در جدول language باشند فوق فوقش برای هر زبان لازم است که 9 سطر داشته باشیم تا همه حالتها رو پوشش بدیم ولی اگر در جدول واسط اینها رو بذاریم، فرض کن اگر 100 نفر داشته باشیم 3*100 تا فیلد اضافه پیدا می کنیم!

AminSobati
دوشنبه 28 آبان 1386, 23:19 عصر
چرا 100*3 فیلد پیدا میکنین برای 100 نفر؟!

shotshat
شنبه 03 آذر 1386, 16:13 عصر
چرا 100*3 فیلد پیدا میکنین برای 100 نفر؟!
چون طبق گفته شما که سطوح را در جدول واسط تعریف می کنیم، برای هر نفر لازم است سطح speaking, writing,reading را جدا وارد کنیم. یعنی جدول واسط دارای فیلدهای زیر است:
speaking - writing -Raeding - StudentID - Language -
اصلا یک سوال دیگه: در این صورت جدول Language به چه دردی می خوره؟ چون ما فقط در آن اسم زبانها را وارد می کنیم که در این روش مجبوریم دوباره آن اسامی را در جدول واسط هم ذکر کنیم؟
از همکاری شما بسیار متشکرم.

SYNDROME
شنبه 03 آذر 1386, 17:04 عصر
آن وقت دیگر در جدولتان نام زبان را نمی نویسید و فقط کد آن را قرار می دهید که باعث می شود از افزونگی جلوگیری شود.
موفق باشید

AminSobati
شنبه 03 آذر 1386, 23:29 عصر
چون طبق گفته شما که سطوح را در جدول واسط تعریف می کنیم، برای هر نفر لازم است سطح speaking, writing,reading را جدا وارد کنیم. یعنی جدول واسط دارای فیلدهای زیر است:
speaking - writing -Raeding - StudentID - Language

پس میشه 100*3 رکورد! زیاده؟

shotshat
یک شنبه 04 آذر 1386, 12:10 عصر
پس میشه 100*3 رکورد! زیاده؟
نسبت به اون حالت اولی که گفتم آره. مثلا برای هر زبان وسطح آن یک ID جدا در نظر بگیریم، مثلا به English-good-good-good آی دی 2 بدهیم ، اونوقت در جدول واسط فقط StudentID و LanguageID را وارد می کردیم که میشد 4 تا فیلد کمتر واسه جدول واسطمون! در جدول Language هم اگه تمام حالات سطوح یک زبان رو بذاریم حداکثر 9 تا میشه که بازم از 100*3 کمتره.

AminSobati
دوشنبه 05 آذر 1386, 22:09 عصر
اگر اشتباه نکنم منظورتون اینه که جایگشتهای مختلف رو بدست بیارین و به هر کدوم یک کد اختصاص بدین، درسته؟