PDA

View Full Version : مشکل فیلد چند مقداری در sql



spring69
سه شنبه 03 فروردین 1389, 02:10 صبح
با سلام خدمت دوستان و تبریک سال نو.
من یه بانک sql دارم که شامل3 جدول ماشین ها-شخص ها و معامله ها است.
هر رکورد از جدول معامله تشکیل شده از فیلد شناسه شخص خریدار(که شناسه یک شخص از جدول اشخاص است) و شناسه فروشنده (که بازهم شناسه یک شخص از جدول اشخاص است) و شناسه ماشین(که شناسه یک ماشین از جدول ماشین ها است) و شناسه خود معامله و ...
خوب حالا برای ثبت معامله های ساده هیچ مشکلی ندارم. ولی مشکل اینه که بعضی معامله ها ممکنه دو شخص فروشنده یا خریدار داشته باشن.
حالا بهترین راه به نظر شما برای ذخیره شناسه این دو شخص در جدول معامله ها چیه؟
فیلد رو چند مقداری کنم و با ، یا علامت دیگه شناسه ها رو جدا کنم یا یه راه بهتر سراغ دارید؟
اصلا تشکیل سه جدول به این شکل به نظر شما کار درستیه؟
اگه لازم بود بگید بانک Sql رو آپ کنم.
لطفا کمک کنید.

mostafah110
سه شنبه 03 فروردین 1389, 14:20 عصر
اگر بتوانی یک جدول جداگانه برای فروشندگان بسازی و یک جدول هم برای خریداران ، چون در واقعیت هم این افراد دو شیئ مجزا هستند، سپس می توانی از این جا به بعد فروشنده و خریدار را عنصرهای مهم تری حساب کنی، که در واقع هم این گونه هست، حالا به عنوان مثال جدول زیر را نگاه کن:

http://astane.persiangig.com/Untitled-1.gif
حالا میبینی که اگر شخص1 به خریدار 1 و 2 ماشین 1 را بخواهد بفروشد از یک سریال معامله استفاده می کند پس مشکلی پیش نخواهد آمد و نیز اگر بخواهد به یک نفر...

تا ن جایی که به ذهن من می رسید این بود، البته نظر من این هست که این گونه بهتر است... در ضمن من چیزی اضافه نکردم ، همان جداول شما هم می تواند باشد فقط کمی ذهنتان را منظم کردم.

spring69
سه شنبه 03 فروردین 1389, 17:02 عصر
با سلام و تشکر از شما بابت پاسختان.
من یک نکته از جدول شما متوجه شدم، اگر درست است بفرمائید:
اینکه اگر یک معامله دو خریدار داشت ، آنها را در دو رکورد جداگانه ثبت کنم. ولی با شماره سریال یکسان، درست است؟
یک نکته دیگر اینکه دو رکورد آخر شما چه تفاوتی دارند؟

mn_zandy63
چهارشنبه 04 فروردین 1389, 00:41 صبح
سلام دوست من،
در تکمیل صحبت های دوستمون mostafah110.

صحبت هاشون درسته، احتمالا دو سطر آخر نوشته شون هم اشتباه تایپیه.
نکته ای هم که اشاره کردی درسته.

حالا میخوام یه مقدار توضیح دوستمون mostafah110 رو کامل تر کنم.
نظر من اینه که بهتره جدولی رو برای نگهداری اطلاعات شخصی افراد داشته باشی، مثلا به اسم Person. البته این موضوع بستگی به اطلاعاتی داره که برای شخص فروشنده و خریدار نگه میداری. از اونجا که من توی ذهنم این شکلیه که اطلاعاتشون یکسان هست، فکر می کنم لزومی نداره که جدولی برای فروشنده ها و جدولی جداگانه برای خریدار ها داشته باشی.

و موضوع دیگه اینکه، با توجه به توضیحاتی که دادی، 1 جدول باید داشته باشی برای نگه داری اطلاعات مربوط به معامله، که یه دونه ID داره و فیلد های دیگه ی مربوطه. از بین فیلد های ماشین، خریدار، فروشنده، هر کدوم که میتونه چند تایی باشه رو، باید برای ارتباط بین اون و جدول معامله یه جدول دیگه بسازی.
مثلا طبق توضیحاتی که دادی، فروشنده میتونه چند نفر باشه، فرض کنیم خریدار همیشه یک نفر باشه و در هر قرار داد فقط یک ماشین فروخته بشه، در این صورت فیلد های ID خریدار و ID ماشین رو در همون جدول معامله نگه دار، اما جدولی جداگانه به شکل
ID معامله | ID فروشنده
برای ذخیره فروشنده ها استفاده کن. مثلا اسمش رو میتونی بذاری "معامله_فروشنده"
ID معامله که از جدول معامله میاد، و ID فروشنده هم از جدول Person، مشخص کننده اطلاعات شخصی فروشنده.
اگه مثلا معاملت میتونه چند تا ماشین داشته باشه، ماشین رو باید از جدول معامله حذف کنی و جدول دیگه ای برای ارتباط بین معامله و ماشین اضافه کنی.

موفق باشی

spring69
چهارشنبه 04 فروردین 1389, 12:08 عصر
سلام دوست من،
در تکمیل صحبت های دوستمون mostafah110.

صحبت هاشون درسته، احتمالا دو سطر آخر نوشته شون هم اشتباه تایپیه.
نکته ای هم که اشاره کردی درسته.

حالا میخوام یه مقدار توضیح دوستمون mostafah110 رو کامل تر کنم.
نظر من اینه که بهتره جدولی رو برای نگهداری اطلاعات شخصی افراد داشته باشی، مثلا به اسم Person. البته این موضوع بستگی به اطلاعاتی داره که برای شخص فروشنده و خریدار نگه میداری. از اونجا که من توی ذهنم این شکلیه که اطلاعاتشون یکسان هست، فکر می کنم لزومی نداره که جدولی برای فروشنده ها و جدولی جداگانه برای خریدار ها داشته باشی.

و موضوع دیگه اینکه، با توجه به توضیحاتی که دادی، 1 جدول باید داشته باشی برای نگه داری اطلاعات مربوط به معامله، که یه دونه ID داره و فیلد های دیگه ی مربوطه. از بین فیلد های ماشین، خریدار، فروشنده، هر کدوم که میتونه چند تایی باشه رو، باید برای ارتباط بین اون و جدول معامله یه جدول دیگه بسازی.
مثلا طبق توضیحاتی که دادی، فروشنده میتونه چند نفر باشه، فرض کنیم خریدار همیشه یک نفر باشه و در هر قرار داد فقط یک ماشین فروخته بشه، در این صورت فیلد های ID خریدار و ID ماشین رو در همون جدول معامله نگه دار، اما جدولی جداگانه به شکل
ID معامله | ID فروشنده
برای ذخیره فروشنده ها استفاده کن. مثلا اسمش رو میتونی بذاری "معامله_فروشنده"
ID معامله که از جدول معامله میاد، و ID فروشنده هم از جدول Person، مشخص کننده اطلاعات شخصی فروشنده.
اگه مثلا معاملت میتونه چند تا ماشین داشته باشه، ماشین رو باید از جدول معامله حذف کنی و جدول دیگه ای برای ارتباط بین معامله و ماشین اضافه کنی.

موفق باشی
با سلام و تشکر از پاسخ خوبتون
خوب به نظر من پیشنهادی که شما دادین خیلی خوبه.:تشویق:
ولی یه نکته رو درست متوجه نشدم. اینکه در یک معامله ممکنه حالت های زیر پیش بیاد:
1- 1فروشنده،1خریدار
2- 2فروشنده،1خریدار
3- 1فروشنده،2خریدار
4- 2فروشنده،2خریدار
حالا در تمام این حالت ها من نباید در جدول معامله ها، شناسه فروشنده(ها) و خریدار (ها) رو ثبت کنم. و بیام دوتا جدول جداگانه به نامهای معامله_خریدار و معامله_فروشنده تشکیل بدم؟
به این صورت که مثلا اگه در معامله 3، 2 فروشنده با شناسه های 5 و6 وجود داره باید به این شکل جدول معامله_فروشنده رو تشکیل بدم:
idمعامله idفروشنده
3 5
3 6
و برای خریدار(ها) هم به این صورت؟:متفکر:
یکم فوریه اگه لطف کنید کمک کنید ممنون میشم.
فایل بانکم رو هم آپ کردم .

mn_zandy63
پنج شنبه 05 فروردین 1389, 00:14 صبح
سلام دوست من،
دیتابیست رو ویرایش کردم، و backup ش رو برات گذاشتم.

چیزی که متوجه شدی، کاملا درسته.
بر اساس جداول موجودت، دو تا جدول برات اضافه کردم، به اسامی tblBargainBuyer و tblBargainSeller
هر دو تا شامل دو تا فیلد bargainID و personID هست.
اسم جدول معامله ات رو هم گذاشتم tblBargain. دو تا فیلد خریدار و فروشنده رو هم ازش حذف کردم.
همین.

اگه سوالی داشتی، یا جاییش ابهام داشت، بگو تا توضیح بدم.

راستی، relation های مربوطه رو هم اضافه کردم، دو تا bargainID با ID از جدول bargain و دو تا personID هم با ID از جدول person.

موفق باشی

spring69
پنج شنبه 05 فروردین 1389, 00:59 صبح
سلام دوست عزیز.
واقعا شرمنده کردی.
ولی نمی دونم چرا زمانی که میخوام فایل شما رو restore کنم ارور زیر رو میده:

The media family on device 'D:\Backup\b' is incorrectly formed. SQL Server cannot process this media family.
RESTORE HEADERONLY is terminating abnormally. (.Net SqlClient Data Provider)

من از نسخه sql server management 2005 express استفاده میکنم

mn_zandy63
پنج شنبه 05 فروردین 1389, 15:31 عصر
سلام دوست من،
مشکل از همینه، من متاسفانه SQL 2005 ندارم.
من جداولی که برات ساختم رو اینجا میذارم، خودت بسازشون.
جدول tblBargainBuyer
bargainID int
personID int

جدول tblBargainSeller
bargainID int
personID int

هر 4 تا، Not Null و Key هستند.

و از جدول معامله، فیلدهای خریدار و فروشنده رو حذف کن.

موفق باشی