PDA

View Full Version : سوال: مکانیزم انتقال اطلاعات از دیتابیس هنگام استفاده از Table



mohsen24000
یک شنبه 16 مهر 1391, 09:58 صبح
باسلام (مخصوصا آقا شاهین:چشمک:)
سؤالی که برای من پیش اومده اینه که - تحت شبکه - وقتی یک کامپوننت Table حالا Ado یا Uni یا... open میشه
مخصوصا اگه اون تیبل دارای فیلد BLob هم باشه...
آیا لزوما همه اطلاعات مربوط به رکورد جاری از سرور (دیتابیس) خوانده می شود!؟
یا اگر به یک گرید متصل بشه، فقط Data ی فیلدهایی که در گرید مشخص شده انتقال داده می شود!؟
به عبارتی ساده تر چه موقع دیتای مربوط به فیلد Blob به Client انتقال داده می شود!؟
در نهایت آیا استفاده از شی Table جهت درج اطلاعات - تحت شبکه - با وجود فیلد Blob قابل قبوله و یا حتما می بایست از Query برای Insert یا Update کردن استفاده بشه!؟

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

BORHAN TEC
یک شنبه 16 مهر 1391, 10:55 صبح
سلام

آیا لزوما همه اطلاعات مربوط به رکورد جاری از سرور (دیتابیس) خوانده می شود!؟
بله.

یا اگر به یک گرید متصل بشه، فقط Data ی فیلدهایی که در گرید مشخص شده انتقال داده می شود!؟
همیشه اینطور نیست. اگر تجربه کار با dbExpress را داشته باشید خواهید دید که TSqlDataSet اطلاعات را می خواند و در TClientDataSet هم شما می توانید اطلاعاتی را که TSqlDataSet خوانده را باز هم فیلتر کنید. به عبارت دیگر ما در اینجا دو بار اطلاعات را گلچین می کنیم و آنچه که شما در DBGrid میبینید از دیتای رد و بدل شده کمتر خواهد بود.

به عبارتی ساده تر چه موقع دیتای مربوط به فیلد Blob به Client انتقال داده می شود!؟
موقعی که آرا درخواست کنید. البته در این زمینه می تواید تکنیکهایی را هم لحاظ کنید. مثلاً در یک فیلد جدا یک HashCode از دیتای Blob ذخیره کنید تا با چک کردن آن متجه شوید که آیا نسبت به قبل دیتای مربوطه تغییر کرده یا خیر.

در نهایت آیا استفاده از شی Table جهت درج اطلاعات - تحت شبکه - با وجود فیلد Blob قابل قبوله و یا حتما می بایست از Query برای Insert یا Update کردن استفاده بشه!؟
فکر نمی کنم تفاوت زیادی داشته باشه ولی بهتر است که این موضوعات را به صورت عملی از لحاظ سرعت چک کنید.

mohsen24000
یک شنبه 16 مهر 1391, 11:15 صبح
موقعی که آن را درخواست کنید. البته در این زمینه می تواید تکنیکهایی را هم لحاظ کنید. مثلاً در یک فیلد جدا یک HashCode از دیتای Blob ذخیره کنید تا با چک کردن آن متوجه شوید که آیا نسبت به قبل دیتای مربوطه تغییر کرده یا خیر.

پس این درخواست با قرار گرفتن کرسر بر روی رکورد انجام میشه و دیتای فیلد Blob مربوط به رکورد جاری در بستر شبکه انتقال داده میشه!؟ که در این صورت غیر از کوئری چه راهی رو پیشنهاد می کنید که فیلد Blob خوانده نشود.



فکر نمی کنم تفاوت زیادی داشته باشه ولی بهتر است که این موضوعات را به صورت عملی از لحاظ سرعت چک کنید.

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

BORHAN TEC
یک شنبه 16 مهر 1391, 11:49 صبح
پس این درخواست با قرار گرفتن کرسر بر روی رکورد انجام میشه و دیتای فیلد Blob مربوط به رکورد جاری در بستر شبکه انتقال داده میشه!؟ که در این صورت غیر از کوئری چه راهی رو پیشنهاد می کنید که فیلد Blob خوانده نشود.
طبق دانسته های من تنها راه این است که فیلد مورد نظر را در کوئری قید نکنید.

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

البته توجه داشته باشید که این روش طراحی برای موقعی است که میزان داده های Blob زیاد باشد و در موقعی که مقدار این داده ها کم است می توانید موارد ذکر شده در بالا را کلاً نادیده بگیرید.

mohsen24000
یک شنبه 16 مهر 1391, 12:00 عصر
-اگر هدف شما قرار دادن تصاویر است بهتر است که کاری کنید که تا جای ممکن تصاویر فشرده شوند.
- باید در سمت کلاینت گزینه ای باشد که کاربر با تنظیم آن به سرور بگوید که آیا مایل به دریافت تصاویر است یا خیر؟
- بهتر است که تصاویر در صورت امکان در مکانی خارج از فایل پایگاه داده قرار بگیرند، چون ثابت شده که با قرار دادن اینگونه اطلاعات در پایگاه داده Performance به شدت کاهش می یابد.
- در صورت امکان سعی نکنید که تصاویر در Grid به نمایش در آیند و بهتر است در چنین فرم هایی از طراحی زیر استفاده کنید:

سپاس.
نه اطلاعات Blob لزوما تصویر نیست و ممکنه هرچیزی باشه (اتوماسیون اداری).
تصاویر هم در گرید نمایش داده نمیشه و تا زمانی که نیاز نباشه Blob خوانده نمی شود.
بهترین راه برای Fetch شدن فیلد خاص در کامپوننت Table چی میتونه باشه!؟
در کل هدف سوال، بهینه ترین روش برای Transfer کمترین اطلاعات ممکن بین سرور و کلاینت هنگام Data Entry توسط کاربر است!!؟
پاسخ یک توسعه دهنده یکی از کامپوننتهای رایج بانک اطلاعات:
BLOB field is loaded when you navigate to the current record and read blob field by BLOB stream.
You can better use TTable to insert blob data.

BORHAN TEC
یک شنبه 16 مهر 1391, 13:13 عصر
BLOB field is loaded when you navigate to the current record and read blob field by BLOB stream.
توجه داشته باشید که این مورد در مورد کامپوننت های رایج خود دلفی صدق می کند. به عنوان مثال در EhLib DBGrid شما می توانید کاری کنید که با Fetch کردن داده ها فیلدهای Blob (در اینجا تصاویر) در داخل خود گرید نمایش داده شوند بدون این که شما کرسر را بین رکوردها جابه جا کنید.

You can better use TTable to insert blob data.
اگر این شخص واقعاً توسعه دهنده کامپوننت های مبتنی بر بانک اطلاعاتی باشد باید حرف وی را پذیرفت.

در کل هدف سوال، بهینه ترین روش برای Transfer کمترین اطلاعات ممکن بین سرور و کلاینت هنگام Data Entry توسط کاربر است!!؟
اگر هدف شما کاهش اطلاعات رد و بدل شونده بین سرور و کلاینت می باشد و در صورتی که از Middle Tier Architecture استفاده کرده باشید می توانید از فیلترهای خاص فشرده سازی استفاده کنید. به عنوان مثال شما می توانید از فیلترهای Zlib در DataSnap استفاده کنید که قبل از ارسال داده ها فشرده شده و نهایتاً در سمت کلاینت داده ها برای استفاده از حالت فشرده خارج شوند.