PDA

View Full Version : سوال: روش مناسب این فیلد ها در پایگاه به چه شکل صحیح تر هستش؟



samadblaj
چهارشنبه 08 آذر 1391, 21:30 عصر
سلام دوستان ببخشید توی یکی از برنامه هام میخواستم یه فرم پیچیده رو دخیره کنم که با مشکلاتی رو به رو شدم روشم اصولی نبود ...

لطفا عکس پیوستی رو ببینید من میخوام توی برنامه ام این کامبو و ردیو رو در دیتابیس ذخیره کنم.

حالا باید چجور این فیلد ها رو ذخیره کنم تا بتونم بعد توی گزارش هام فرضا بتونم "اول بهار" رو بدست بیارم...


خواهش میکنم ابتدا نظر خودتون رو بدید بعد این قسمت رو بخونید :
الان نیاز هست برای هم نام آیتم و هم ایندکس یک فیلد درست کنم (به این شکل که باشه در یک جدول پیچیده به مشکل و حجم زیاد کار و کد بر میخورم :اشتباه:)

Mahmoud Zaad
چهارشنبه 08 آذر 1391, 21:35 عصر
سلام
اصلاً موضوع چی هست برای چی میخواید این مقادیر رو ذخیره کنید، اول بهار چیه؟ کلاً یه توضیح جامع بدید.

samadblaj
چهارشنبه 08 آذر 1391, 21:58 عصر
وای ببخشید چقدر مثالم بد بود ببخشید.
عکس پیوستی رو مشاهده کنید.
من توی دیتابیسم فیلد انتخاب شده رو به چه شکل ذخیره کنم تا راحت بتونم توی گرید نمایش بدم و یا راحت بتونم مثلا از "فرورین" ـی ها گزارش بگیرم؟
اگه هم نام و هم شماره ایندکس رو ذخیره کنم و در دیتابیس ذخیره کنم برام مشکلی پیش نماید اما اینجور هم دیتابیس و هم کد هام خیلی سخت و پیچیده میشه...

plus
چهارشنبه 08 آذر 1391, 22:28 عصر
شما میتونی یک جدول به اسم نام ماه در دیتابیس درست کنی که شامل دو فیلد آیدی و اسم هست.آیدی یه شمارنده میشه و اسم هم نام ماه.مثلا 0 فروردین، 1 اردیبهشت ... . حالا هر جدول دیگه ای که داری و قراره توش ماه ذخیره کنی، فقط ID ماه رو درش ذخیره میکنی (اگه ms sql کار میکنی میتونی یک relation هم بین دوتا جدول برقرار کنی).
حالا برای نمایش، جدول ماه ها رو از دیتابیس میخونی و در ComboBox به عنوان مشخصه DataSource میگذاری و DisplayMember اون رو هم برابر نام فیلد نام ماه در جدول قرار میدی (مثلا Name) و ValueMember هم نام فیلد ID.
اینجا توی هر جدولی که ماه داری، چون ID ماه رو ذخیره کردی، میتونی این آیدی رو از اون جدول بخونی و برابر مشخصه SelectedValue در ComboBox قرار بدی تا اون ماه انتخاب بشه...
---
البته اینکه شما جدول ماه رو سمت دیتا بیس ذخیره کنی یا نه فقط آیدی اون رو ذخیره کنی بستگی به این داره که شما بخوای با یک دستور SQL، به مثلا "فروردین" دسترسی داشته باشی یا نه.
اگه چنین نیازی نداشته باشی میتونی فقط ID هارو ذخیره کنی و اون جدول ماه رو به شکل یک آرایه فقط سمت #C داشته باشی، آیدی رو از دیتابیس بخونی و از طریق اون آرایه، نام مربوط به اون ID رو کاربر نمایش بدی.
امیدوارم گیجت نکرده باشم D-:

veniz2008
چهارشنبه 08 آذر 1391, 22:38 عصر
سلام. این فکر کنم سومین تاپیک از شما باشه که در این مورد صحبت می کنیم!. شما باید یه جدول داشته باشی که ماه ها رو به همراه کد اون ماه نگهداری کنی( مثلا 1 برای فروردین و ... تا 12 برای اسفند ). قبلا هم دوستان این نکته رو گفتن که موقع ذخیره کردن مثلا ماه فروردین در یک جدول دیگه، شما دیگه نام ماه رو ذخیره نمیکنی بلکه فقط عدد 1 رو ذخیره میکنی . تا اینجاش خدا وکیلی کجاش مشکله؟( به جای اینکه هم نام ماه رو ذخیره کنی هم کد ماه رو فقط کد رو ذخیره کردیم). حالا فرض کن در یک گزارشی میخوای که نام ماه رو به کاربر نمایش بدی (چون کاربر که نمیشه بهش عدد مثلا 5 رو به جای مرداد نشون بدی باید نام ماه رو بهش نمایش بدی) واسه این کار یک Join بین جدول "ماه های سال" و این جدول که کد ماه رو داخلش ذخیره کردی میزنی و در گزارش نام ماه رو نمایش می دی.

samadblaj
چهارشنبه 08 آذر 1391, 22:47 عصر
شما میتونی یک جدول به اسم نام ماه در دیتابیس درست کنی که شامل دو فیلد آیدی و اسم هست.آیدی یه شمارنده میشه و اسم هم نام ماه.مثلا 0 فروردین، 1 اردیبهشت ... . حالا هر جدول دیگه ای که داری و قراره توش ماه ذخیره کنی، فقط ID ماه رو درش ذخیره میکنی (اگه ms sql کار میکنی میتونی یک relation هم بین دوتا جدول برقرار کنی).
حالا برای نمایش، جدول ماه ها رو از دیتابیس میخونی و در ComboBox به عنوان مشخصه DataSource میگذاری و DisplayMember اون رو هم برابر نام فیلد نام ماه در جدول قرار میدی (مثلا Name) و ValueMember هم نام فیلد ID.
اینجا توی هر جدولی که ماه داری، چون ID ماه رو ذخیره کردی، میتونی این آیدی رو از اون جدول بخونی و برابر مشخصه SelectedValue در ComboBox قرار بدی تا اون ماه انتخاب بشه...
---
البته اینکه شما جدول ماه رو سمت دیتا بیس ذخیره کنی یا نه فقط آیدی اون رو ذخیره کنی بستگی به این داره که شما بخوای با یک دستور SQL، به مثلا "فروردین" دسترسی داشته باشی یا نه.
اگه چنین نیازی نداشته باشی میتونی فقط ID هارو ذخیره کنی و اون جدول ماه رو به شکل یک آرایه فقط سمت #C داشته باشی، آیدی رو از دیتابیس بخونی و از طریق اون آرایه، نام مربوط به اون ID رو کاربر نمایش بدی.
امیدوارم گیجت نکرده باشم D-:

خسته نباشید | ممنونم درست متوجه شدم پس یک جدول برای ماه ها نیاز هست این مشکلم بل کل بر طرف شد.
شما بگید یک جدول داشته باشم به نام "ناه "ها بعد ID ماه رو ذخیره کنم و هر وقت نیاز بود از جدول بکشم بیرون ولی مشکلی که اینجاست من باید اطلاعات رو توی گرید نمایش بدم که دوباره با حجم کاری و کدی زیادی مواجه میشه... مثل برای نمایش هر یکی از ماه ها نیاز هست برای گرید نوشت که جای عدد ذخیره شده بره توی دیتابیس اطلاعات رو بکشه و نمایش بده؟

سوال دوم هم اینه که حجم کاری من زیاده و جاهای دیگه جای این "ماه" ها باید از یه Combo هست که شامل Item "بله" و "خیر" هستش اینجا باید چیکار کنم از List استفاده کنم یا راه بهتری هست چون این داده ها باید در جدول های دیگه واکشی بشن؟

مثلا اگه یک جدول مجزا برای "ماه"ها داشته باشم مشکلی نداره و میتونم راحت گزارش گیری کنم و یا جستجو | قضیه گرید به چه شکل خواهد شده ؟ میدونی چیه به دیلیل حجم کاری من ویرایش رو روی گرید قرار دادم نه فرم مجزا...

ممنونم plus جان از لطف و حوصله ات

------------------


سلام. این فکر کنم سومین تاپیک از شما باشه که در این مورد صحبت می کنیم!. شما باید یه جدول داشته باشی که ماه ها رو به همراه کد اون ماه نگهداری کنی( مثلا 1 برای فروردین و ... تا 12 برای اسفند ). قبلا هم دوستان این نکته رو گفتن که موقع ذخیره کردن مثلا ماه فروردین در یک جدول دیگه، شما دیگه نام ماه رو ذخیره نمیکنی بلکه فقط عدد 1 رو ذخیره میکنی . تا اینجاش خدا وکیلی کجاش مشکله؟( به جای اینکه هم نام ماه رو ذخیره کنی هم کد ماه رو فقط کد رو ذخیره کردیم). حالا فرض کن در یک گزارشی میخوای که نام ماه رو به کاربر نمایش بدی (چون کاربر که نمیشه بهش عدد مثلا 5 رو به جای مرداد نشون بدی باید نام ماه رو بهش نمایش بدی) واسه این کار یک Join بین جدول "ماه های سال" و این جدول که کد ماه رو داخلش ذخیره کردی میزنی و در گزارش نام ماه رو نمایش می دی.
ببخشید متوجه نشده بودم. شدم ولی بعضی جاهاش مشکل داشتم(تاپیک دومم بود.)
الان متوجه شدم.

zarifcomputer
چهارشنبه 08 آذر 1391, 23:00 عصر
سلام
من با نظر دوستان موافق نیستم
اول یک سوال منطقی میپرسم :
داده های ثابت در یک نرم افزار به چه داده هایی گفته میشه؟
مثال شما یکی از انواع داده های ثابت به شمار میره. یعنی هر کسی میدونه که واحد شمارش ماهانه سال در فارسی 1=فروردین 2=اردیبهشت و ... 12=اسفند
یا مثلا برای روز های هفته 1=شنبه 2=یکشنبه و .... 7=جمعه
وقتی همه ما این مفاهیم را به عنوان مفاهیم ثابت و مشترک قبول داریم دیگه نگهداری عناوین این مفاهیم در بانک اطلاعاتی کار درستی نیست . چرا که هم باعث پیچیدگی بی مورد بانک اطلاعاتی میشه و هم افزونگی بی مورد اطلاعات را خواهیم داشت .
راه حل من اینه که نیازی به ساخت یک جدول برای نگهداری ماه های سال نیست و شما در هر جدول دیگری که نیاز به نگهداری عدد مربوط به ماه هستید فقط همان عدد را در یک فیلد عددی نگهدارید و هر جا نیاز بود که به ازای 1 ، فروردین را نمایش دهید ، این کار را توسط کد های نرم افزار انجام دهید (مثلا با یک Case)

plus
چهارشنبه 08 آذر 1391, 23:15 عصر
سلام
من با نظر دوستان موافق نیستم
اول یک سوال منطقی میپرسم :
داده های ثابت در یک نرم افزار به چه داده هایی گفته میشه؟
مثال شما یکی از انواع داده های ثابت به شمار میره. یعنی هر کسی میدونه که واحد شمارش ماهانه سال در فارسی 1=فروردین 2=اردیبهشت و ... 12=اسفند
یا مثلا برای روز های هفته 1=شنبه 2=یکشنبه و .... 7=جمعه
وقتی همه ما این مفاهیم را به عنوان مفاهیم ثابت و مشترک قبول داریم دیگه نگهداری عناوین این مفاهیم در بانک اطلاعاتی کار درستی نیست . چرا که هم باعث پیچیدگی بی مورد بانک اطلاعاتی میشه و هم افزونگی بی مورد اطلاعات را خواهیم داشت .
راه حل من اینه که نیازی به ساخت یک جدول برای نگهداری ماه های سال نیست و شما در هر جدول دیگری که نیاز به نگهداری عدد مربوط به ماه هستید فقط همان عدد را در یک فیلد عددی نگهدارید و هر جا نیاز بود که به ازای 1 ، فروردین را نمایش دهید ، این کار را توسط کد های نرم افزار انجام دهید (مثلا با یک Case)

من در آخر گفتم که در شرایطی، میشه نام ها رو ذخیره نکرد. ولی در شرایطی لازم میشه. مثلا اگه خواستی دیتا رو فقط با دستور SQL از دیتابیس بخونی و توی DataGridView نمایش بدی، اونوقت نمیتونی وسط کار CASE بگذاری.(حالا بماند که CASE گذشتن هم راه حلش نیست...).البته میشه سلول های گرید رو فرمت کرد، ولی بستگی به سیاست کلی که توی فرم افزار در این زمینه تعریف میشه داره.در ضمن از در روشی که شما میگی، دیتابیس مستقل نیست، یعنی کسی که دیتابیس رو داره از کجا بدونه فروردین 0 هست یا 1 ؟.

veniz2008
چهارشنبه 08 آذر 1391, 23:17 عصر
سلام
من با نظر دوستان موافق نیستم
اول یک سوال منطقی میپرسم :
داده های ثابت در یک نرم افزار به چه داده هایی گفته میشه؟
مثال شما یکی از انواع داده های ثابت به شمار میره. یعنی هر کسی میدونه که واحد شمارش ماهانه سال در فارسی 1=فروردین 2=اردیبهشت و ... 12=اسفند
یا مثلا برای روز های هفته 1=شنبه 2=یکشنبه و .... 7=جمعه
اینی که شما اشاره میکنید قراردادی هست. ممکنه یه نفر (یا تعداد زیادی از افراد) جمعه رو معادل 1 در نظر بگیرن . حرف من یه جمله بیشتر نیست : قانونی در این مورد وجود نداره ولی زمانیکه برنامه نویس میگه 1 یعنی شنبه دیگه جای هیچ ابهامی باقی نمیمونه.

وقتی همه ما این مفاهیم را به عنوان مفاهیم ثابت و مشترک قبول داریم دیگه نگهداری عناوین این مفاهیم در بانک اطلاعاتی کار درستی نیست . چرا که هم باعث پیچیدگی بی مورد بانک اطلاعاتی میشه و هم افزونگی بی مورد اطلاعات را خواهیم داشت . افزونگی وجود نداره. ما فقط در یک جدول اونم جدول "ماه ها" یک فیلد نام ماه و یک فیلد id داریم.
روش شما 100% رد میشه.

plus
چهارشنبه 08 آذر 1391, 23:26 عصر
خسته نباشید | ممنونم درست متوجه شدم پس یک جدول برای ماه ها نیاز هست این مشکلم بل کل بر طرف شد.
شما بگید یک جدول داشته باشم به نام "ناه "ها بعد ID ماه رو ذخیره کنم و هر وقت نیاز بود از جدول بکشم بیرون ولی مشکلی که اینجاست من باید اطلاعات رو توی گرید نمایش بدم که دوباره با حجم کاری و کدی زیادی مواجه میشه... مثل برای نمایش هر یکی از ماه ها نیاز هست برای گرید نوشت که جای عدد ذخیره شده بره توی دیتابیس اطلاعات رو بکشه و نمایش بده؟

سوال دوم هم اینه که حجم کاری من زیاده و جاهای دیگه جای این "ماه" ها باید از یه Combo هست که شامل Item "بله" و "خیر" هستش اینجا باید چیکار کنم از List استفاده کنم یا راه بهتری هست چون این داده ها باید در جدول های دیگه واکشی بشن؟

مثلا اگه یک جدول مجزا برای "ماه"ها داشته باشم مشکلی نداره و میتونم راحت گزارش گیری کنم و یا جستجو | قضیه گرید به چه شکل خواهد شده ؟ میدونی چیه به دیلیل حجم کاری من ویرایش رو روی گرید قرار دادم نه فرم مجزا...

ممنونم plus جان از لطف و حوصله ات

------------------


ببخشید متوجه نشده بودم. شدم ولی بعضی جاهاش مشکل داشتم(تاپیک دومم بود.)
الان متوجه شدم.

شما همون موقع که میخوای اطلاعات رو از دیتابیس بگیری باید جدول اصلی رو با جدول ماه ها روی فیلد آیدی ماه ا JOIN کنی (بجای دستور SELECT ساده) تا بجای ID ماه، نام اون ماه از دیتابیس بیاد و مستقیم بگذاریش توی DataGrdiView.البته شما همونطور که گفتی میتونی بجای اینکه سمت SQL از JOIN استفاده کنی، کلا متن رو نگه نداری و سمت #C، توی رویداد CellFormating مربوط به DataGridView، عدد ها رو به ماه تبدیل کنی.
البته اگه خواستی از راه اول استفاده کنی پیشنهاد میکنم بجای اینکه سمت #C ، دستور SELECT بنویسی، کل عملیات رو ببری توی یک Stored Procedure یا View سمت MS SQL.
سوال دومت رو درست متوجه نشدم.

samadblaj
چهارشنبه 08 آذر 1391, 23:40 عصر
سلام
من با نظر دوستان موافق نیستم
اول یک سوال منطقی میپرسم :
داده های ثابت در یک نرم افزار به چه داده هایی گفته میشه؟
مثال شما یکی از انواع داده های ثابت به شمار میره. یعنی هر کسی میدونه که واحد شمارش ماهانه سال در فارسی 1=فروردین 2=اردیبهشت و ... 12=اسفند
یا مثلا برای روز های هفته 1=شنبه 2=یکشنبه و .... 7=جمعه
وقتی همه ما این مفاهیم را به عنوان مفاهیم ثابت و مشترک قبول داریم دیگه نگهداری عناوین این مفاهیم در بانک اطلاعاتی کار درستی نیست . چرا که هم باعث پیچیدگی بی مورد بانک اطلاعاتی میشه و هم افزونگی بی مورد اطلاعات را خواهیم داشت .
راه حل من اینه که نیازی به ساخت یک جدول برای نگهداری ماه های سال نیست و شما در هر جدول دیگری که نیاز به نگهداری عدد مربوط به ماه هستید فقط همان عدد را در یک فیلد عددی نگهدارید و هر جا نیاز بود که به ازای 1 ، فروردین را نمایش دهید ، این کار را توسط کد های نرم افزار انجام دهید (مثلا با یک Case)

بله این روش برای من روش خیلی بهینه و مناسبی هست و به سادگی میتونم اطلاعات ثابت مثل ماه ها | بله و خیر | و یا روز ها رو داشته باشم اگر برای نمایش در گرید مشکل نداشته باشه ؟


من در آخر گفتم که در شرایطی، میشه نام ها رو ذخیره نکرد. ولی در شرایطی لازم میشه. مثلا اگه خواستی دیتا رو فقط با دستور SQL از دیتابیس بخونی و توی DataGridView نمایش بدی، اونوقت نمیتونی وسط کار CASE بگذاری.(حالا بماند که CASE گذشتن هم راه حلش نیست...).البته میشه فرمت کرد، ولی بستگی به سیاست کلی که توی فرم افزار در این زمینه تعریف میشه داه.در ضمن از در روشی که شما میگی، دیتابیس مستقل نیست، یعنی کسی که دیتابیس رو داره از کجا بدونه فروردین 0 هست یا 1 ؟.

این مورد هم برای مورد دوم من یعنی مقدار ها پویام مناسب هست مثل :
1391
1392
1393
که میتونم از ID ها برای بدست آوردن مقدار استفاده کنم.



شما همون موقع که میخوای اطلاعات رو از دیتابیس بگیری باید جدول اصلی رو با جدول ماه ها روی فیلد آیدی ماه ا JOIN کنی (بجای دستور SELECT ساده) تا بجای ID ماه، نام اون ماه از دیتابیس بیاد و مستقیم بگذاریش توی DataGrdiView.البته شما همونطور که گفتی میتونی بجای اینکه سمت SQL از JOIN استفاده کنی، کلا متن رو نگه نداری و سمت #C، توی رویداد CellFormating مربوط به DataGridView، عدد ها رو به ماه تبدیل کنی.
البته اگه خواستی از راه اول استفاده کنی پیشنهاد میکنم بجای اینکه سمت #C ، دستور SELECT بنویسی، کل عملیات رو ببری توی یک Stored Procedure یا View سمت MS SQL.
سوال دومت رو درست متوجه نشدم.
همه چی رو متوجه شدم خیلی روشن و واضح بود | نحوه نوشتن Join رو هم (EF)بلدم ولی فقط طرف C#‎ رو بلدم...مشکلی که نداره نه ؟

plus
چهارشنبه 08 آذر 1391, 23:56 عصر
بله این روش برای من روش خیلی بهینه و مناسبی هست و به سادگی میتونم اطلاعات ثابت مثل ماه ها | بله و خیر | و یا روز ها رو داشته باشم اگر برای نمایش در گرید مشکل نداشته باشه ؟

همه چی رو متوجه شدم خیلی روشن و واضح بود | نحوه نوشتن Join رو هم (EF)بلدم ولی فقط طرف C#‎ رو بلدم...مشکلی که نداره نه ؟

اگه منظورتون اینه که Join رو سمت #C بزنید، میشکلی اگه داشته باشه نمیدونم جز اینکه سرعت قطعا پایین تره.

samadblaj
پنج شنبه 09 آذر 1391, 00:01 صبح
اگه منظورتون اینه که Join رو سمت #C بزنید، میشکلی اگه داشته باشه نمیدونم جز اینکه سرعت قطعا پایین تره.

ممنونم از وقتی که گذاشتید ابهام بزرگی رو برام حل کردید...
موفق باشید.