PDA

View Full Version : سوال: ذخیره عکس به طور نامحدود در دیتابیس



mahdidabaghi
پنج شنبه 23 آذر 1391, 10:02 صبح
سلام دوستان
من درگیر پروژه ای شدم که سازمان مقابل من میخواد علاوه بر یه سری اطلاعات متنی میخواد تعدادی عکس (که این عکس ها اسناد و مدارک هستند) رو در دیتابیس ذخیره کنند.
مشکل اینه که اونا میگن تعداد عکس ها مشخص نیست (یعنی ممکنه واسه یک مورو 1 دونه عکس ذخیره کنند و واسه مورد دیگه 30 تا عکس ذخیره کنند)
میشه راهنماییم کنین واسه این تعداد نا معلوم عکس فیلدهای دیتابیس و همچنین فیلدهای سمت سی شارپ رو چجور در نظر بگیرم؟
ممنون از شما

morteza271
پنج شنبه 23 آذر 1391, 10:14 صبح
سلام.
طوری که من متوجه شدم شما با نحوه ذخیره کردنش عکس مشکلی ندارین درسته؟؟

برای اینکار بهتره که یه جدوا جدا برای عکس ها در نظر بگیرین (چون که تعداد عکس برای هر آیتم مشخص نیست)
و در اون جدول یه کلید خارجی داشته باشین به جدول مربوطه و یه فیلد هم داشته باشین برای خود عکس، که البته میتونید فیلدهایی مثل نام عکس و ... رو هم در نظر بگیرین.

حالا برای سمت سی شارپ باید این امکان رو بذارین که کاربر برای هر آیتم بتونه به اندازه ای نامحدود عسکس اضافه کنه که میتونید هرکسی که اضافه شد رو در یه گرید نشون بدین. یا مثل قسمت Attachment یاهو عمل کنید. که البته من مورد اول رو پیشنهاد میکنم.

بعد از اینکه کاربر مثلا خواست یه آیتم رو ثبت کنه شما برین به تعداد سطرهایی که در گریدتون وجود داره در جدولی که در دیتابیس ساختین سطر جدید ایجاد کنید و عکس رو ذخیره کنید و برای تمام این سطرها هم فیلد کلید خارجی رو برابر کلید اصلی اون آیتم پدر قرار بدین...

امیدوارم متوجه شده باشین.
اگه جایی مبهم بود درخدمتم.
موفق باشید

danialafshari
پنج شنبه 23 آذر 1391, 10:17 صبح
سلام دوست عزیز
در این مورد خیلی باید دقت کنید چون بانک برنامه باید صحیح طراحی بشه
یک Table باید برای عکس درست کنی و رابطه 1 به چند بدی و مشخصه های از جمله ID,path,fileName,... بدی اینا رو همینطور ذهنی گفتم بعد دو جدول رو به وسیله کلید اصلی بهم وصل کنی
در ضمن برای سرعت بیشتر میتونی یک نسخه از عکس در مسیر برنامه کپی کنی و فقط آدرس عکس رو در بانک ذخیره کنی
موفق باشی

mahdidabaghi
پنج شنبه 23 آذر 1391, 22:11 عصر
برای اینکار بهتره که یه جدوا جدا برای عکس ها در نظر بگیرین (چون که تعداد عکس برای هر آیتم مشخص نیست)
و در اون جدول یه کلید خارجی داشته باشین به جدول مربوطه و یه فیلد هم داشته باشین برای خود عکس، که البته میتونید فیلدهایی مثل نام عکس و ... رو هم در نظر بگیرین.

اره.حرف شما درسته.شما فرض کن تو صفحه ثبت من طرف فقط میخواد به تعداد نامحدود عکس اضافه کنه(و البته یه شماره ثبت که بگه این عکسها مربوط به این شماره هست).پس بنظر من با این تفاسیر یه تیبل میشه.با فیلدهای id , pic 1 , pic 2 , pic 3, ...

veniz2008
پنج شنبه 23 آذر 1391, 22:21 عصر
پس بنظر من با این تفاسیر یه تیبل میشه.با فیلدهای id , pic 1 , pic 2 , pic 3, ...
سلام. وقتی تعداد عکس ها نامحدوده (یا بهتره بگیم تعداد نامشخصه) دیگه نمیتونی pic1 و pic2 و pic3 و... داشته باشی چون باید تعداد فیلدهای جدولتون مشخص باشن. یه فیلد رو id بذار و فیلد دوم رو هم pic بذار.

firoozi90
پنج شنبه 23 آذر 1391, 22:43 عصر
سلام به نظر من شما می تونید روی دستورات اس کیو ال مانور بدی و بطور پویا فیلدهای جدولت رو اضاف کنی.
مثلا دستور ای کیو ال رو طوری بنویسی که اگر تعداد فیلدهای عکست کافی نبود یه فیلد اضافه کنه و اون عکسو درونش قرار بده.
و در سی شارپ هم مثل روش قدیمی اتچ توی یاهو میل عمل کن.مثلا چند دکمه browse که کاربر بتونه اونا رو اضافه کنه اگر به تعداد بیشتری نیاز داشت
در کل باید توی طراحی پایگاه داده ات خیلی دقت کنی و اگر لازمه حتما عکس توی دیتابیس ذخیره بشه به نرمال سازی پایگاه داده ات هم فکر کن.چون اگر افزونگی پیش بیاد سرعت برنامه میاد پایین.

morteza271
جمعه 24 آذر 1391, 12:27 عصر
اره.حرف شما درسته.شما فرض کن تو صفحه ثبت من طرف فقط میخواد به تعداد نامحدود عکس اضافه کنه(و البته یه شماره ثبت که بگه این عکسها مربوط به این شماره هست).پس بنظر من با این تفاسیر یه تیبل میشه.با فیلدهای id , pic 1 , pic 2 , pic 3, ...

نه دوست عزیز شما نباید برای هر عکس یه ستون مجزا در نظر بگیرین.
همونطور که دوستمون mohammaddou گفتن باید یه جدول مجزا بسازین که یه id داشته باشه و یه ستون pic .
و بعد ثبت مثلا هر شخص به تعداد عکس هایی که واسش اضافه شده در این جدول سطر ایجاد کنید و در ستون id شناسه شخص رو قرار بدین.
مثلا یه شخص ثبت می کنید که id یا همون شناسش میشه 10 و مثلا 3تا عکس براش قرار میدین.
حال باید در این جدول سه سطر به صورت زیر اضافه بشه :
10 pic1
10 pic2
10 pic3

موفق باشید

firoozi90
جمعه 24 آذر 1391, 15:30 عصر
نه دوست عزیز شما نباید برای هر عکس یه ستون مجزا در نظر بگیرین.
همونطور که دوستمون mohammaddou گفتن باید یه جدول مجزا بسازین که یه id داشته باشه و یه ستون pic .
و بعد ثبت مثلا هر شخص به تعداد عکس هایی که واسش اضافه شده در این جدول سطر ایجاد کنید و در ستون id شناسه شخص رو قرار بدین.
مثلا یه شخص ثبت می کنید که id یا همون شناسش میشه 10 و مثلا 3تا عکس براش قرار میدین.
حال باید در این جدول سه سطر به صورت زیر اضافه بشه :
10 pic1
10 pic2
10 pic3

موفق باشید

دوستمون میگن که معلوم نیست که واسه هر شناسه چندتا عکس درج بشه.حالا ممکنه 1 عکس باشه یا 30 تا عکس

cccccccccc
جمعه 24 آذر 1391, 15:49 عصر
سلام
تنها راهش استفاده از جدول مجزاس(دوستان اشاره کردن)
اما یک مشکل دیگه اینه که اگر خود عکس رو در بانک ذخیره کنین خیلی زود حجم بانک شما زیاد میشه(احتمال زیاد نسخه ای که استفاده میکنید حجم بانک محدوده)
برای اینکار می بایست آدرس عکس رو ذخیره کنید که در اینصورت امنیت پایین میاد(خارج از برنامه عکس ها قابل مشاهده هستن) پس باید رمزگذاری هم بشن و در عملیات backup, restore هم تغییراتی ایجاد کنید

firoozi90
جمعه 24 آذر 1391, 16:58 عصر
هیچکس تاحالا منظور دوستمون به طور کامل متوجه نشده.

veniz2008
جمعه 24 آذر 1391, 19:18 عصر
دوستمون میگن که معلوم نیست که واسه هر شناسه چندتا عکس درج بشه.حالا ممکنه 1 عکس باشه یا 30 تا عکس
منظور از pic1 و pic2 و pic3 ، نام عکس ها هست نه اینکه جدول ما سه فیلد pic2، pic1 و pic3 داشته باشه.


هیچکس تاحالا منظور دوستمون به طور کامل متوجه نشده.
ما منظور ایشون رو درک کردیم، شما باید یه خورده بیشتر روی جواب های ما دقت کنید.

morteza271
جمعه 24 آذر 1391, 20:06 عصر
دوستمون میگن که معلوم نیست که واسه هر شناسه چندتا عکس درج بشه.حالا ممکنه 1 عکس باشه یا 30 تا عکس
میشه بفرمائید چه مشکلی توی طرحی که دادم هست؟؟؟؟
من گفتم واسه هر عکس یه رکورد درج میشه در جدولی جداگانه حالا میخواد یه عکس باشه یا 100 تا باشه یا 1000 تا باشه یا اصلا نباشه...
چه مشکلی داره ....

در ضمن همونطور که دوستمون گفتن فکر کنم تنها شما متوجه نشدین که منظور دوستمون چیه وگرنه بقیه همگی متوجه شدن...
یه خورده به تایپیک و پست ها دقت کنید بعد بیاید یه پست بذارین و نظر بدین...

siedmohsen
جمعه 24 آذر 1391, 21:43 عصر
من هم با یه جدول مجزا موافقم :بامزه:

mahdidabaghi
شنبه 25 آذر 1391, 00:58 صبح
با سلام
اگه دیر جواب میدم معذرت میخوام
از جواب های تک تک دوستان که مث همیشه شرمندم کردن بسیار ممنونم
پس نتیجه واسه سمت دیتابیس این شد که دو ستون داشته باشم(همون چیزی که اقا مرتضی گل تو پست7)
حالا بیایم اینور یعنی سمت سی شارپ عزیز!!!!!!
اینجا باید چجوری Open Dialog ها رو قرار بدم(یعنی چند تا)اخه تعداد که مشخص نیس....

klinton
شنبه 25 آذر 1391, 03:07 صبح
شما هرچه قدر هم عکس انتخاب کنید همش با آدرس و اسمشون قابل شناسایی هست (با open dialog) حالا همشو یک به یک با یه for میتونی ذخیره کنی معلومه که پیک for هم تعداد عکساتونه جدولتون هم دو تا فیلد داره یکی عکس و دیگری کلید خارجی

morteza271
شنبه 25 آذر 1391, 10:26 صبح
به نمونه برنامه ای که براتون گذاشتم دقت کنید :
96694
البته این نمونه فقط برای قسمت تصاویر هست و اگه قراره این تصاویر مثلا برای یک شخص باشه اطلاعات شخص هم باید دریافت بشه.
موفق باشید.

mahdidabaghi
یک شنبه 26 آذر 1391, 00:42 صبح
شما هرچه قدر هم عکس انتخاب کنید همش با آدرس و اسمشون قابل شناسایی هست (با open dialog) حالا همشو یک به یک با یه for میتونی ذخیره کنی معلومه که پیک for هم تعداد عکساتونه جدولتون هم دو تا فیلد داره یکی عکس و دیگری کلید خارجیمرسی ا پاسختون
ولی همینجور که اشاره کردم چون تعداد عکس ها مشخص نیس نمیدونم چه جوری باید تعدادی نامحدود کنترل opendialog بذارم.اکی؟
حالا اگه من بد متوجه شدم منظورتونو شرمنده...

merlin425
یک شنبه 26 آذر 1391, 01:40 صبح
ببخشیدا پا برهنه افتادم وسط ولی فکری واسه حجم عکسا وحجم بانک کردین ایشون میگن هر فردی ممکن جند تا عکس داشته باشه اینجوره حجم فایل بانک سریع تموم میشه از همه حجیم تر ارکل هست که اونم نا محدود نیست

morteza271
یک شنبه 26 آذر 1391, 08:49 صبح
ببخشیدا پا برهنه افتادم وسط ولی فکری واسه حجم عکسا وحجم بانک کردین ایشون میگن هر فردی ممکن جند تا عکس داشته باشه اینجوره حجم فایل بانک سریع تموم میشه از همه حجیم تر ارکل هست که اونم نا محدود نیست
همونطور که یکی از دوستان هم گفتن اگه امنیت زیاد براشون مهم نباشه بهتره فقط آدرس عکس رو ذخیره کنن به جای خود عکس. و اینجوری حجم بانک هم زیاد نمیشه!!!


مرسی ا پاسختون
ولی همینجور که اشاره کردم چون تعداد عکس ها مشخص نیس نمیدونم چه جوری باید تعدادی نامحدود کنترل opendialog بذارم.اکی؟
حالا اگه من بد متوجه شدم منظورتونو شرمنده...
شما نمونه برنامه رو دانلود کردین؟؟ مشکلتون برطرف شد یا نه؟؟

mousa1992
یک شنبه 26 آذر 1391, 09:17 صبح
اینجا باید چجوری Open Dialog ها رو قرار بدم(یعنی چند تا)اخه تعداد که مشخص نیس....
نیاز به قرار دادن چند openFileDialog نداری !
هر وقت که خواست عکسی رو اضافه کنه openfiledialog رو باز میکنه و متد های ذخیره سازی فراخوانی میشه
و با همون یدونه openfiledialog میتونی چندین فایل رو باهم انتخاب کنی (در موردش سرچ کن )
موفق باشید

firoozi90
یک شنبه 26 آذر 1391, 09:27 صبح
مثلا یه شخص ثبت می کنید که id یا همون شناسش میشه 10 و مثلا 3تا عکس براش قرار میدین.
حال باید در این جدول سه سطر به صورت زیر اضافه بشه :
10 pic1
10 pic2
10 pic3

شما درست می گید من تو خوندن پستتون دقت نکردم مرتضی جان.اما منظورم هم نتونستم درست بگم.
ولی این طرح شما و اینچیزی که شما می گید اصول طراحی دیتابیس توش رعایت نشده.و این اصول خیلی از بچه ها بهش توجه نمی کنند و بعد میگن چرا برنامه سرعتش پایین میاد و .........
این طراحی شما آنامولی داره و نرمال سازی نشده
حالا جدا از افزونگی که داره شما هیچ فکر کردید اگر اشتباها توی جدول عکس ها مثلا اشتباه عکسی وارد شد یا شناسه اشتباه شد و یا به هر دلیلی خواستیم در این جدول ویرایش انجام بدیم چطور باید این کارو انجام داد؟یعنی طرف بیاد مثلا 30تا شناسه 10 که داخلش هست رو دونه به دونه تغییر بده؟
شما فورا موضع می گیرید و با عصبانیت می خواین از دیتابیس پیشنهادیتون دفاع کنید.
حالا اگر همت کنید و دیتابیس رو کامل طراحی کنید تک به تک مشکلاشو میبینید و فقط شما به فکر این هستید که چطور 40 ، 50 تا عکس رو توی دیتابیس جا بدید.

morteza271
یک شنبه 26 آذر 1391, 10:01 صبح
شما فورا موضع می گیرید و با عصبانیت می خواین از دیتابیس پیشنهادیتون دفاع کنید.
اولا من اصلا قصد موضع گیری و ... رو نداشتم فقط چون بدون هیچ دقتی گفتین که اصلا متوجه نشدین خواستم بهتون بگم که شما متوجه نشدین وگرنه منظور دیگه ای نداشتم.

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

اگه هم اشتباها عکسی وارد شد خوب خیلی راحت میتونیم حذفش کنیم چون به هرحال واسه این جدول هم یه کلید اصلی میذاریم دیگه، با همون کلید اصلی میتونیم اون عکس رو حذف و یا ویرایش کنیم پس مشکلی نداره!!!


حالا جدا از افزونگی که داره
میشه بگین چطوری افزونگی داده بوجود میاد؟؟؟؟

البته اینم بگم که من اصلا قصد ندارم نظر خودم رو بقبولونم ولی خیلی خوشحال میشم اگه اشتباه میکنم شما منو توجیه کنید تا منم روشمو تغییر بدم و بانک اطلاعاتی برنامه هام بهینه باشه و نرمال سازی توش رعایت شده باشه...
با تشکر...

firoozi90
یک شنبه 26 آذر 1391, 11:20 صبح
از طرفی کلید خارجی هم هست که به جدول اشخاص رفرنس داره، یعنی وقتی شخص موردنظر حذف بشه تمام تصاویر مربوط به اون شخص هم اتوماتیک حذف خواهد شد.
اگر هم مشخصات شخص تغییر کرد که هیچ مشکلی نیست چون شناسه شخص یا همون کلید اصلی تغییری نمیکنه!!


یعنی شما منظورتون اینه که از ویو استفاده کنید؟آخه من منظورتون متوجه نمیشم.اگر روش جدیدی توی طراحی دیتابیس بلدید به ما تازه واردها هم یاد بدید.



میشه بگین چطوری افزونگی داده بوجود میاد؟؟؟؟


همین که توی جدول مثلا ده تا شناسه 15 و صدتا شناسه 21 و ... باشه این افزونگی نیست؟

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



اگه هم اشتباها عکسی وارد شد خوب خیلی راحت میتونیم حذفش کنیم چون به هرحال واسه این جدول هم یه کلید اصلی میذاریم دیگه، با همون کلید اصلی میتونیم اون عکس رو حذف و یا ویرایش کنیم پس مشکلی نداره!!!

این یه توجیح هست. یک طراحی خوب نمیتونه به جای ویرایش کردن حذف کردن رو پیشنهاد کنه.

به هر حال من سر حرف خودم هستم بهترین کار پویا کردن جدول ها هستش

veniz2008
یک شنبه 26 آذر 1391, 11:45 صبح
یعنی شما منظورتون اینه که از ویو استفاده کنید؟آخه من منظورتون متوجه نمیشم.اگر روش جدیدی توی طراحی دیتابیس بلدید به ما تازه واردها هم یاد بدید.
ببینید دوست عزیز، توی دیتابیس اگر خاصیت cascade رو برای جدول فعال کنیم وقتی شخص از جدول حذف بشه، زیر مجموعه هاش هم حذف میشن( یعنی کلید خارجی و رکورد(های) متعلق به اون حذف میشه). روش جدیدی نیست. سال هاست که این روش وجود داره.


همین که توی جدول مثلا ده تا شناسه 15 و صدتا شناسه 21 و ... باشه این افزونگی نیست؟بپذیرید که مفهوم افزونگی رو درک نکردید. تکرار شناسه در جدول دوم (شامل id و pic ) اصلا ربطی به افزونگی نداره. عزیز،هر تکراری رو که بهش نمیگن افزونگی. بذارید بیشتر توضیح بدم. فرض کنید در همون جدول اول 8 فیلد داشته باشیم و حالا یه فیلد به نام pic اضافه کنیم. فرض کنید برای یک id بخوایم 20 تصویر ثبت کنیم، در اینحالت مجبوریم که 19 * 7 فیلد تکراری بدون کاربرد رو درج کنیم. چون بایستی در این حالت 20 سطر رو برای اون id داشته باشیم ( چون 20 تا عکس داره) و فقط اطلاعات سطر اول اون مفیده و بقیه سطرها به خاطر فیلد عکس بصورت تکراری و بیهوده درج میشن. حالا اگر یک جدول جداگانه ایجاد کنیم که شامل دو فیلد id و pic باشه برای همین id که 20 تا عکس داره کافیه 20 * 2 فیلد ایجاد کنیم. به اون اولی میگن افزونگی. روش دوم دقیقا برای فرار از افزونگی هست.


این یه توجیح هست. یک طراحی خوب نمیتونه به جای ویرایش کردن حذف کردن رو پیشنهاد کنه.روشی که دوستمون گفتن ( و من هم تایید میکنم) برای ویرایش کردن مشکلی نداره. مگر نه اینکه ما زمان ویرایش به کلید اصلی رجوع می کنیم؟. در اینجا هم براحتی با کلید اصلی میشه ویرایش رو انجام داد و اصراری بر حذف به جای ویرایش کردن وجود نداره.

به هر حال من سر حرف خودم هستم بهترین کار پویا کردن جدول ها هستشمنظور از پویا کردن رو میشه کامل توضیح بدید؟. شاید ایده شما بهتر باشه.

morteza271
یک شنبه 26 آذر 1391, 12:14 عصر
از دوست خوبم mohammaddou واقعا تشکر میکنم که خیلی کامل و روشن توضیح دادن و جواب شما رو به صورت کاملا منطقی دادن.
دیگه بعید میدونم مشکلی با این روش داشته باشین و امیدوارم به نتیجه رسیده باشین.
در مورد پویا کردن هم دوستمون خیلی خوب توضیح دادن و با یه مثال کامل نشون دادن که افزونگی یعنی چی...
امیدوارم ابهامات برطرف شده باشه.
موفق باشید

merlin425
دوشنبه 27 آذر 1391, 00:07 صبح
همونطور که یکی از دوستان هم گفتن اگه امنیت زیاد براشون مهم نباشه بهتره فقط آدرس عکس رو ذخیره کنن به جای خود عکس. و اینجوری حجم بانک هم زیاد نمیشه!!!


بله خوب این کار رو هم میشه کرد ولی اینجوری عکس ها روی هارد ذخیره شده و کاربر بدون استفاده از برنامه هم میتونه بره بازش کنه یا حتی حذفش کنه یا اینکه اگر بخاهیم قابلیت پشتیبان گیری رو تو برنامه ایجاد کنیم فقط از بانک پشتیبان میگیره و عکس ها مشمول پشتیبان نمیشه
البته خودم که حس میکنم دارم از موضوع تاپیک خارج میشم شرمنده

mahdidabaghi
دوشنبه 27 آذر 1391, 00:10 صبح
از تک تک دوستان کمال تشکر رو دارم.درباره مبحث افزونگی هم بحث جالبی مطرح شد.بابات برنامه مهندس مرتضی هم خیلی ممنونم.
فقط اگر من خواسته باشم ادرس عکس رو تو دیتابیس بذارم میشه برنامه رو به صورت شبکه استفاده کرد؟ یعنی مثلا آدرس عکس توی روت درایو d درسیستم سروره.
حالا یه کلاینت که ممکنه 20تا سیستم اونورتر باشه چجوری به این ادرس سرور مثلا برای گزارش گیریا دسترسی داشته باشه؟
حقیقت هنو درگیر یه پروژه وب هستم که پیشنهاد این کار شد.انشاالله در اولین فرصت خودم یه سمپل جامع با راهنمایی هایی که عزیزان انجام دادن درست میکنم

morteza271
دوشنبه 27 آذر 1391, 11:51 صبح
از تک تک دوستان کمال تشکر رو دارم.درباره مبحث افزونگی هم بحث جالبی مطرح شد.بابات برنامه مهندس مرتضی هم خیلی ممنونم.
خواهش میکنم ولی دوست خوبمون mohammaddou بیشتر وقت گذاشتن و بهتر پاسخ دادن.


فقط اگر من خواسته باشم ادرس عکس رو تو دیتابیس بذارم میشه برنامه رو به صورت شبکه استفاده کرد؟ یعنی مثلا آدرس عکس توی روت درایو d درسیستم سروره.
حالا یه کلاینت که ممکنه 20تا سیستم اونورتر باشه چجوری به این ادرس سرور مثلا برای گزارش گیریا دسترسی داشته باشه؟
میتونید عکس ها رو روی سرور هم قرار بدین و فقط آدرسش رو توی دیتابیس ذخیره کنید ولی من پیشنهاد نمیکنم چون به نظرم خطاهای زیادی احتمال داره بوجود بیاد و سرعت برنامه رو هم خیلی کم میکنه.
ولی فکر کنم بهتر باشه عکس رو هم توی دیتابیس ذخیره کنید و به آدرس اون کاری نداشته باشین.
هرچند ممکنه که حجم دیتابیس رو زیاد کنه ولی میتونید فقط تصاویری با حجم محدود رو قبول کنید و فایل های حجیم رو قبول نکنید تا کمتر دیتابیس سنگین شه.
من که راه دیگه ای به ذهنم نمیرسه، ببینیم دوستان چی میگن...

mahdidabaghi
دوشنبه 27 آذر 1391, 23:58 عصر
مرسی مهدس جان
من خودم تجربه ذخیره خود عکس رو در دیتابیس داشتم.تو اون پروژه واسه هر شی 60 تا فیلد و 4 تا عکس save میکردم.حالا شما فکرشو بکن سازمان طرف قراردادم میگفت من میخوام 90/000 اطلاعات مربوط به شی رو وارد کنم.یعنی 64*90000
هرچند من کاربران اونجا رو ملزم به ذخیره سازی عکس زیر 10 کیلو کردم ولی بازم 90000*4*10 یه خورده واسه حجم دیتابیس زیاد میشه!!!!!!!!نه؟؟؟؟؟؟؟؟؟؟
تازه بماند حجمی که واسه اون 90000*60 فیلد در نظر گرفته میشه.
کلا سلکت گیری واسه گزارش گیریا شم که باید یه سلکت توپ مینوشتم(که نوشتم) تا بیاد این همه رکورد رو با سرعت مناسب نشون بده.
حالا تو این پروژه میخوان عکس سند رو با نرم افزار نشون بدن و چون این اسناد به صورت متن هستن باید با کیفیت بالا(هر کدوم 5 mb) ذخیره بشن
ببخشید داستان طولانی شد.کلا خواستم بگم که خودم با توجه به موارد بالا با ذخیره آدرس عکس موافقترم.البته اگه همونجور که گفتم مشکل با نحوه بازیابی اون توی کلاینت های دیگه توی شبکه حل بشه.

veniz2008
سه شنبه 28 آذر 1391, 10:49 صبح
من خودم تجربه ذخیره خود عکس رو در دیتابیس داشتم.تو اون پروژه واسه هر شی 60 تا فیلد و 4 تا عکس save میکردم.حالا شما فکرشو بکن سازمان طرف قراردادم میگفت من میخوام 90/000 اطلاعات مربوط به شی رو وارد کنم.یعنی 64*90000
من برنامه شما رو ندیدم ولی احتمال بالای 99 درصد میدم که طراحی شما ایراد داشته. 60 فیلد برای یک موجودیت (یا رابطه) ؟؟؟. هنوز موردی رو ندیدم که 60 صفت ( فیلد) داشته باشه.

هرچند من کاربران اونجا رو ملزم به ذخیره سازی عکس زیر 10 کیلو کردم ولی بازم 90000*4*10 یه خورده واسه حجم دیتابیس زیاد میشه!!!!!!!!نه؟؟؟؟؟؟؟؟؟؟به نظرم 10kb واسه یه عکس خیلی خوبه ( البته اگه از کیفیت عکسه چیزی باقی بمونه :لبخند: ).یعنی شما واسه این تعداد عکس چیزی در حدود ( 3515MB ( 3.43GB حجم نیاز دارید. ما اگه یه نگاه به سایت های استخدامی و ثبت نامی( مخصوصا سازمان سنجش) اگه بکنیم می بینیم اونجا هم کاربر رو ملزم به رعایت کردن سایز و کیفیت معینی میکنن. خودتون در نظر بگیرید که چه تعداد رکورد در این موارد ثبت میشه.(البته قصد این رو ندارم که اون سیستم رو با سیستم های خودمون قیاس کنم. فقط میخوام یه ذهنیتی نسبت به موضوع پیدا کنیم). مهم ترین عامل در چنین مواردی طراحی اصولی دیتابیس، بهترین روش ذخیره سازی و بهترین روش واکشی داده هاست. کلید موفقیت در پروژه های سنگین، تکنیک های مناسبی هست که ما استفاده می کنیم.

leila_hassanpoor
سه شنبه 28 آذر 1391, 14:13 عصر
سلام دوستان برنامه نویس . من یه پروژه عکاسی دارم که باید تا یه هفته دیگه تحویل استاد بدم مشکلم اینه که می خوام عکس رو تو دیتا بیس ذخیره کنم و هنگامی که سرچ رو زدم عکس مشتری با مشخصاتش رو نشون بده . دیتا بیسم هم مال خود برنامه ویژوال استودیو هستش (Microsoft SQL Server Compact 3.5) . خواهشا کمکککککک .

veniz2008
سه شنبه 28 آذر 1391, 15:50 عصر
سلام دوستان برنامه نویس . من یه پروژه عکاسی دارم که باید تا یه هفته دیگه تحویل استاد بدم مشکلم اینه که می خوام عکس رو تو دیتا بیس ذخیره کنم و هنگامی که سرچ رو زدم عکس مشتری با مشخصاتش رو نشون بده . دیتا بیسم هم مال خود برنامه ویژوال استودیو هستش (Microsoft SQL Server Compact 3.5) . خواهشا کمکککککک .
واسه سوالتون اول در سایت جستجو کنید. موردی رو که شما مد نظرتون هست قبلا بارها و بارها در سایت بحث شده. با فرض اینکه جواب سوالتون پیدا نشد باید یه تاپیک جدید ایجاد کنید نه اینکه تاپیک دوستتون رو با یه سوال شخصی خراب کنید.
موفق باشید.

mahdidabaghi
چهارشنبه 29 آذر 1391, 00:56 صبح
من برنامه شما رو ندیدم ولی احتمال بالای 99 درصد میدم که طراحی شما ایراد داشته. 60 فیلد برای یک موجودیت (یا رابطه) ؟؟؟. هنوز موردی رو ندیدم که 60 صفت ( فیلد) داشته باشه.

مهندس جان اصلا تعجب نکن چون حالا شده.بذار اسم سازمان سکرت بمونه.ولی خود اون سازمان واسه اون موجودیت قبل این نرم افزار من چیزی حدود 80 صفت تعریف شده داشت که تازه با چونه زدن شد 60 تا.راجع به طراحی دیتابیس هم باید بگم با یکی از دوستان دیتابیس کار که تجربه چندین ساله تو این کار داشتند مشورت شده و بابت طراحی دیتابیس خیالتون راحت.یه مثال راحتشکه همون نوشتن سلکتی که (مثلا Select All که زیر 10 ثانیه اطلاعات رو نشون میده(واسه 50000 رکورد تست کردم)البته ادعایی هم واسه این کار ندارو .واسه اساتیدی مث شما که کار جیک ثانیه هس.ولی من مبتدی واسه اولین بار که انجامش دادم کلی حال کردم.ولی در کل تیبل ها و روابط بخوبی در دیتابیس رعایت شدند که افزونگی هم به حداقل برسه.
ممنون از شرکت شما در بحث.از بحث اصلی که همون دسترسی به ادرس عکس ها در سیستم های کلاینت هست خارج نشیم

morteza271
چهارشنبه 29 آذر 1391, 09:31 صبح
سلام.
همونطور که قبلا گفتم اگه بتونید کاربر رو محدود کنید به انتخاب تصاویری با حجم محدود بهتره ولی به هر دلیلی ممکنه شما نتونید این کار رو بکنید. و از طرفی هم اگه بخواین تصاویر با حجم مثلا 5مگ رو در بانک ذخیره کنید خیلی سریع سرعت برنامتون کم میشه و اعصاب کاربران داغون!!!

پس حالا که نمیتونید اینکار رو بکنید فکر کنم راهی به جز اینکه فقط آدرس عکس رو در بانک ذخیره کنید ندارین.
از طرفی باید یه مدیریت خوب روی تصاویر داشته باشین.
به صورتی که هر عکسی از رو هر سیستمی انتخاب شد شما باید اول از همه اونو به مسیر مورد نظر بر روی سرور و یا یکی از کلاینت ها انتقال بدین. تا حداقل تمامی عکس ها در یه مسیر خاص باشه و عکس ها بر روی سیستم های دیگه بخش نشه که دردسرش زیاد میشه و کنترل اینکار خیلی براتون سخت میشه.
یکی دیگه اینکه موقع اجرای برنامه به نظرم بهتره حتما دسترسی به این پوشه موردنظر بر روی شبکه رو چک کنید تا اگه مشکلی بود همون اول برنامه باشه و در خلال برنامه مشکلی پیش نیاد!

از طرفی چون عکس ها توی شبکه هستن و برنامه از روی یک سیستم باید عکس ها رو از روی سیتم دیگه لود کنه طبیعتا سرعت برنامه کم میشه که برای همین کار باید یه مدیریت خوب برای نمایش تصاویر هم در نظر بگیرین. به صورتی که لود شدن تصاویر رو در تردهایی کاملا مجزا انجام بدین تا لود شدن تصاویر سرعت برنامه رو زیاد نگیره...

یه مسئله دیگه که به نظرم میرسه اینه که برای هنگامی که میخواین پشتیبان گیری کنید این تصاویر رو یادتون نره و حتما این تصاویر رو هم به همراه فایل بک آپ به صورت زیپ شده نگه دارین و در هنگام بازیابی تصاویر رو به جای تصاویر موجود قرار بدین(یعنی اول تصاویر موجود رو حذف کنید و بعد تصاویر همراه فایل بک آپ رو کپی کنید.)

ببخشید طولانی شد(البته فعلا همینا به ذهنم رسید) ولی همونطور که گفتم اینکار خطاهای احتمالی زیادی به وجود میاره و حتما باید مدیریت قوی براش درنظر بگیرین.

موفق باشید.

Reza_Yarahmadi
چهارشنبه 29 آذر 1391, 12:17 عصر
من خودم تجربه ذخیره خود عکس رو در دیتابیس داشتم.تو اون پروژه واسه هر شی 60 تا فیلد و 4 تا عکس save میکردم.حالا شما فکرشو بکن سازمان طرف قراردادم میگفت من میخوام 90/000 اطلاعات مربوط به شی رو وارد کنم.یعنی 64*90000
هرچند من کاربران اونجا رو ملزم به ذخیره سازی عکس زیر 10 کیلو کردم ولی بازم 90000*4*10 یه خورده واسه حجم دیتابیس زیاد میشه!!!!!!!!نه؟؟؟؟؟؟؟؟؟؟
تازه بماند حجمی که واسه اون 90000*60 فیلد در نظر گرفته میشه.

گه بخواین تصاویر با حجم مثلا 5مگ رو در بانک ذخیره کنید خیلی سریع سرعت برنامتون کم میشه و اعصاب کاربران داغون!!!

در صورتی که شما از SQL Server و از نوع داده (Varbinary(max برای ذخیره عکس استفاده میکنید مشکلی از نظر سرعت در قسمت هایی از برنامه که ربطی به اسناد ذخیره شده نداره پیدا نمیکنید چون SQL Server داده های Blob رو در Pageهای جدای از Pageهای اصلی دیتابیس ذخیره میکنه و همچنین از نظر فضای کل دیتابیس هم در صورت استفاده از
SQL Server 2005 به بالا تا 524,272 ترا (+ (http://msdn.microsoft.com/en-us/library/ms143432.aspx))
SQL Server 2005 Express تا 4 گیگ
SQL Server 2008 Express تا 10 گیگ (+ (http://blogs.msdn.com/b/sqlexpress/archive/2010/04/21/database-size-limit-increased-to-10gb-in-sql-server-2008-r2-express.aspx))

درصورت استفاده از SQL Server 2008 به بالا در مورد FileStream (+ (http://www.dotnettips.info/Post/331)) جستجو کنید.
در مورد استفاده از دیتابیس برای ذخیره فایل و یا ذخیره آدرس فایل و ... اینجا (http://www.dotnettips.info/Post/307/%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%81%D8%A7%DB%8C%D9%84%E2%80%8C%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%DB%8C%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D8%A7%DB%8C%D9%84-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%85%D8%AA%D8%AF%D8%A7%D9%88%D9%84%D8%9F)رو ببینید بد نیست

mahdidabaghi
پنج شنبه 30 آذر 1391, 00:13 صبح
سلام.
همونطور که قبلا گفتم اگه بتونید کاربر رو محدود کنید به انتخاب تصاویری با حجم محدود بهتره ولی به هر دلیلی ممکنه شما نتونید این کار رو بکنید. و از طرفی هم اگه بخواین تصاویر با حجم مثلا 5مگ رو در بانک ذخیره کنید خیلی سریع سرعت برنامتون کم میشه و اعصاب کاربران داغون!!!

پس حالا که نمیتونید اینکار رو بکنید فکر کنم راهی به جز اینکه فقط آدرس عکس رو در بانک ذخیره کنید ندارین.
از طرفی باید یه مدیریت خوب روی تصاویر داشته باشین.
به صورتی که هر عکسی از رو هر سیستمی انتخاب شد شما باید اول از همه اونو به مسیر مورد نظر بر روی سرور و یا یکی از کلاینت ها انتقال بدین. تا حداقل تمامی عکس ها در یه مسیر خاص باشه و عکس ها بر روی سیستم های دیگه بخش نشه که دردسرش زیاد میشه و کنترل اینکار خیلی براتون سخت میشه.
یکی دیگه اینکه موقع اجرای برنامه به نظرم بهتره حتما دسترسی به این پوشه موردنظر بر روی شبکه رو چک کنید تا اگه مشکلی بود همون اول برنامه باشه و در خلال برنامه مشکلی پیش نیاد!

از طرفی چون عکس ها توی شبکه هستن و برنامه از روی یک سیستم باید عکس ها رو از روی سیتم دیگه لود کنه طبیعتا سرعت برنامه کم میشه که برای همین کار باید یه مدیریت خوب برای نمایش تصاویر هم در نظر بگیرین. به صورتی که لود شدن تصاویر رو در تردهایی کاملا مجزا انجام بدین تا لود شدن تصاویر سرعت برنامه رو زیاد نگیره...

یه مسئله دیگه که به نظرم میرسه اینه که برای هنگامی که میخواین پشتیبان گیری کنید این تصاویر رو یادتون نره و حتما این تصاویر رو هم به همراه فایل بک آپ به صورت زیپ شده نگه دارین و در هنگام بازیابی تصاویر رو به جای تصاویر موجود قرار بدین(یعنی اول تصاویر موجود رو حذف کنید و بعد تصاویر همراه فایل بک آپ رو کپی کنید.)

ببخشید طولانی شد(البته فعلا همینا به ذهنم رسید) ولی همونطور که گفتم اینکار خطاهای احتمالی زیادی به وجود میاره و حتما باید مدیریت قوی براش درنظر بگیرین.

موفق باشید.
مرتضی جان واقعا ازت ممنونم خیلی گلی از این که تو بحث شرکت میکنی و و نظرات قشنگتو بیان میکنی
یه سوال داشتم.تو نت سرچ زدم دوستان راهنمایی کرده بودن که در برنامه های تحت شبکه باید با آی پی سیستم ها کار کنیم.(منظور سرور و کلاینت هاست.)
حالا اگه عکس ها رو سرور و مثلا در root درایو d ذخیره شده باشه(یعنی همین ادرس در دیتابیس ذخیره شده باشه) ایا من واسه دسترسی به این ادرس در سیستم کلاینت باید کار خاصی انجام بدم؟
یکی از دوستان میگفت باید کانکشن استرینگ سرور رو به صورت ای پی سیستم بنویسی و یه میانبر از فایل exe(فارسی رو پاس بداریم!!!!) روی کلاینت ها میندازیم و تموم.این حرف ایشون درسته؟

morteza271
پنج شنبه 30 آذر 1391, 11:12 صبح
خواهش میکنم.
ببینید برای برنامه ی شبکه ای شما باید روی سرور یه sql server نصب کنید و دیتابیس رو اتچ کنید.
بعد روی کلاینت ها هم برنامتون رو نصب کنید.
و کانکشن استرینگ هم میتونه به صورت زیر باشه :
"Data Source=(local);Initial Catalog=DataBaseName;User Id=UserName;Password=Password;"
که شما میتونید به جای (local) نام سرور و یا ip سرور رو بذارین.

البته یه سری تنظیمات برای اتصال به دیتابیس باید بر روی ویندوز سیستم سرور و سیستم های کلاینت انجام بدین. اگه نمیدونین چه تنظمیاتی بگین تا یه فایل آموزشی براتون بذارم(این فایل رو از توی همین سایت قبلا دانلود کردم ولی الان آدرسشو ندارم).

mahdidabaghi
جمعه 01 دی 1391, 00:55 صبح
مرسی از راهنماییت
ممنون میشم اون فایل اموزشیت رو هم بذاری

morteza271
جمعه 01 دی 1391, 11:07 صبح
خواهش میکنم.
اینم اون فایل آموزشی :
http://uplod.ir/0plhgfkxirvn/Under_Net.pdf.htm
موفق باشید.