PDA

View Full Version : چطور یک Foreign Key رو به یکی از فیلدهای یک Primary Key مرکب Reference بدیم؟



Reborn
جمعه 05 مهر 1387, 23:30 عصر
سلام.
چطور میتونم این کار رو بکنم؟
فیلد LessonTypeID از جدول پایین قراره به LessonTypeID از جدول بالا اشاره کنه اما چون بالا Primary Key مرکب هست به مشکل میخوره.
چه راهکاری به نظرتون میاد دوستان؟


CREATE TABLE LessonTypes
(
LessonTypeID int,
TermID int CONSTRAINT FK_LessonTypes_TermID REFERENCES Terms(TermID),
Name char(20),
CourseID int CONSTRAINT FK_LessonTypes_Courses REFERENCES Courses(CourseID),
Prince int,
PRIMARY KEY(LessonTypeID,TermID,CourseID)
)


CREATE TABLE Lessons
(
LessonID int IDENTITY PRIMARY KEY,
Name nvarchar(30),
Units tinyint,
CourseID int CONSTRAINT FK_Lessons_CourseID REFERENCES Courses(CourseID),
LessonTypeID int CONSTRAINT FK_Lessons_LessonTypeID REFERENCES LessonTypes(LessonTypeID)
)
پیشاپیش از راهنماییتون ممنون...

AminSobati
جمعه 05 مهر 1387, 23:59 عصر
دوست عزیزم،
FK همیشه باید به فیلد یونیک یا PK ارجاع بده. لذا در ارجاع دادنش وقتی PK شما مرکبه، پس باید FK شما هم مرکب باشه:



create table parent(
c1 int,
c2 int,
primary key(c1,c2))
go

create table child(
c1 int,
c2 int,
foreign key (c1,c2) references parent(c1,c2))

Reborn
شنبه 06 مهر 1387, 00:44 صبح
سلام آقای ثباتی.
مرسی از بابت پاسخ سریعتون.
در این مورد اگر بتونید راهنمایی کنید ممنون میشم.
این یک پروژه سیستم انتخاب واحد هست.
در جدول دروس هر درس با نوع خودش ثبت میشه (نظر، عملی) که این برای محاسبه شهریه درنظر گرفته شده.
دروس نظری و عملی در هر ترم شهریه خاص خودش رو داره. این تفاوت در Join کردن با جدول انتخاب واحد اعمال میشه. یعنی برای محاسبه شهریه بررسی میشه که دانشجو در کدوم ترم ثبت نام کرده و درسی که انتخاب کرده چه نوع درسی بوده (نظری، عملی یا هر نوع دیگه) و بر این اساس شهریه آن درس معین میشه.
میخواستم ترجیها در جدول دروس فیلد ترم رو لحاظ نکنم که مجبور نباشم برای هر ترم کل درس ها رو دویاره تکرار کنم.
شرمنده از بابت متن طولانی که نوشتم. امیدوارم بتونید کمکم کنید.
پیشاپیش سپاسگزارم...

AminSobati
شنبه 06 مهر 1387, 02:00 صبح
دوست عزیزم من معتقدم اگر اول طراحی شما رو یکبار مرور کنیم بد نباشه. ترجیحا اگر تصویر Diagram رو پست کنین چه بهتر!
در چیزی که پست اول نشون میده:
- فیلد Name چرا char 20 هستش؟ آیا یونیکد ذخیره نمیشه؟ آیا همیشه طولش 20 کاراکتره؟
- فیلد Price چرا int هست؟ آیا ممکن نیست یک مبلغ دارای اعشار باشه؟

Reborn
شنبه 06 مهر 1387, 02:21 صبح
این دیاگرام کامل دیتابیس
http://i33.tinypic.com/2mxln61.png
از طریق فیلدهای مشخص شده میشه فهمید که دانشجو چه نوع درسی رو در چه ترمی انتخاب کرده تا شهریه بر اساس نوع واحد و ترم محاسبه بشه.

Reborn
شنبه 06 مهر 1387, 02:24 صبح
ضمنا برای مبلغ در اینجا INT مناسب هست، چراکه شهریه دانشگاه هیچ وقت اعشار نداره و بیشترین پول خوردش هزار تومن هست.

Reborn
شنبه 06 مهر 1387, 16:26 عصر
یعنی نبود کسی که بتونه به این سئوال ساده رو پاسخ بده؟ لطفا کمک کنید متاسفانه وقت خیلی محدوده واسم. مرسی...

AminSobati
شنبه 06 مهر 1387, 23:38 عصر
الان مشکل در FK وصل کردن از کجا به کجاست؟

Reborn
یک شنبه 07 مهر 1387, 13:17 عصر
عرض کردم خدمتتون جناب ثباتی.
ارتباط باید بین فیلدهای آبی و قرمز در دیاگرام انجام بشه.
برای کلیه دروس نهایتا 4-5 نوع شهریه وجود داره که در جدول LessonTypes ثبت میشه.
این شهریه ها هر ترم برای همان ترم در این جدول ثبت میشه.
از طریق ارتباط فیلد LessonTypeID و TermID قرار هست که شهریه هر دانشجو محاسبه بشه.
این کار از نظر منطقی امکانپذیر هاست اما از نظر Primary Key و Foreign Key به مشکل میخورم.
اگر بتونید من رو در این زمینه راهنمایی کنید سپاسگزارم.
توضیح بیشتر هم نیاز بود بفرمایید عرض کنم.