View Full Version : تعریف بیش از 2 کلید فرعی در یک فیلد از یک ردیف
moferferi
پنج شنبه 14 دی 1391, 13:41 عصر
سلام
من یه دیتابیس برای یه فروشگاه درست کردم.
جدولی دارم که توش انواع هزینه ها توش تعریف میشه و ای دی اون به عنوان کلید اصلی تعریف میشه.
حالا جدولی هم دارم میخوام فروشنده بتونه توی اون برای مثلا فلان کالا چند هزینه را انتخاب کنه.
حالا اگه بیام و یه ریلیشن بین این دو برقرار کنم فقط امکان انتخاب یک مورد وجود داره.چی کار کنم که فروشنده بتونه مثلا 3 یا بیشتر هزینه انتخاب کنه و بعد بتونم بین اونا ریلیشن برقرار کنم
نمیدونم منظورم را درست بیان کردم یا نه
با تشکر
ferdin
جمعه 15 دی 1391, 21:36 عصر
سلام
من نمی دونم منظورتو درست متوجه شدم یا نه ؟ اما شما می تونی یک جدول واسط در نظر بگیری که یک فیلد کلید داره و فیلدای مربوط به هزینه و کالا هم توش هست که با جدول هزینه هات و جدول کالاهات ارتباط داره ، بنابراین می تونی چند تا هزینه را برای یک کالا انتخاب کنی .
اگه ساختار جداولتو میذاشتی شاید بهتر می شد کمکت کرد.
moferferi
شنبه 16 دی 1391, 08:04 صبح
سلام.
سوالما یه جور دیگه میگم.
فرض کنید فروشنده میخواد واسه فروش هر کالا یه سری شهر خاص را انتخاب کنه.بر فرض فقط تهران،اصفهان و شیراز
خوب ما باید یه جدول داشته باشیم که توش لیست شهر ها موجوده و این جدول یه کلید اصلی داره.
حالا باید بیاییم و کلید فرعی را توی جدول کالا قرار بدم؟ یا طبق گفته شما یه جدول واسط برای شهرهای قابل انتخاب برای هر کالا؟یا اینکه راه دیگه ای هم هست؟
محمد سلیم آبادی
شنبه 23 دی 1391, 10:36 صبح
سلام،
چون در اینجا ممکنه یک کالا مرتبط باشه با چند شهر (با بالعکس چند شهر مرتبط بشه به یک کالا) ارتباط N-N بوجود میاد که جدول واسط(junction table) اینجا باید نقش خودشو بازی کنه.
شما سه جدول خواهید داشت. کالا، شهرها، کالا-شهر.
در جدول کالا-شهر شما ترکیب دو کلید خارجی را کلید اولیه در نظر میگیرید.
DDL جداول به شرح زیر خواهد بود:
create table Kala
(kala_id int not null primary key, ....);
create table Shahrha
(shahr_id int not null primary key,...);
create table KalaShahr
(kala_id int not null foreign key references Kala(kala_id),
shahr_id int not null foreign key references Shahrha(shahr_id),
primary key (kala_id, shahr_id));
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.