PDA

View Full Version : سوال: نمايش حجم زيادي از اطلاعات يک جدول داخل يک کنترل



maryam_80
چهارشنبه 22 آبان 1387, 08:01 صبح
با سلام
يک سوال دارم به شرح زير:
فرض کنيد که شما 2 تا جدول به نامهاي dealer با 7000 رکورد و customer با 1000000 رکورد داريد. حالا از شما خواسته مي شود که يک فرم ورودي ايجاد کنيد که در آن بتوانيد براي هر مشتري يک dealer در نظر بگيرید. در نتيجه شما يک جدول سوم در نظر مي گيريد برای ثبت مشتري و dealer.....
و اما فرم!
شما براي نمایش نام مشتري از چه کنترلي و به چه نحوي استفاده ميکنيد؟؟؟؟؟
من از dropdownlist و sqldatasource استفاده کردم ولي بدليل حجم زياد اطلاعات که به ميليون ميزنه سيستم هنگ کرد.
غرض از عرض اين قصه کسب تجربه از بزرگان برنامه نويس در مورد چگونگي بار کردن بيش از يک ميليون رکورد به داخل کنترلهايي مثل dropdown هست ؟؟

ali_sorouri2005
چهارشنبه 22 آبان 1387, 10:59 صبح
براي اين كار كه بايد از paging استفاده كنيد مثلا با gridview
ولي بازم به مشكل مي خوري چون كاربر بايد بين 1000000 ركورد بگرده .
بايد يه جستجو بذاري.

mahdi_farhani
چهارشنبه 22 آبان 1387, 15:27 عصر
اولاً که دیگه نباید از SqlDatasource استفاده کنی و باید بیایی به با DataReader و معماری سه لایه (برای راحتی کار ) استفاده کنی.
بعد از اون میتونی قبل از نمایش مشتریان براش فیلتر بزاری که محدوده کاریت کمتر بشه

maryam_80
چهارشنبه 22 آبان 1387, 17:19 عصر
ممنون از راهنمايي


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



براي اين كار كه بايد از paging استفاده كنيد مثلا با gridview

به نظر شما اين منطقي هست که براي انتخاب يک فيلد مثل نام مشتري شما روي فرم يک گريدويو بزاريد با n تا page????

دوستان جداي از روشهاي n-tier من مي خواهم بدانم که چطور ميشه به کاربر اين امکان را داد که نام مشتري را از بين 1000000 رکورد انتخاب کند ان هم در کمتر از چند ثانيه؟؟؟

باز هم ميگم روي فرم ورودي شما فقط دو تا فيلد براي انتخاب و ثبت کردن داريد پس
روشي را بگيد که هم GUI و هم Performance لازمه را داشته باشد

maryam_80
پنج شنبه 23 آبان 1387, 17:14 عصر
برنامه نويسان حرفه اي اين سايت نظر یا پيشنهادي ندارند؟

Chabok
پنج شنبه 23 آبان 1387, 17:37 عصر
با سلام . حتی فرض کنیم بدون مشکل شما رکوردها رو آوردین . اون بد بختی که میخواد با سیستم کار کنه چجوری قراره رکورد مورد نظرش رو پیدا کنه و انتخاب کنه ؟

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

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

اگر این کارها رو دوست ندارید انجام بدین شرایط کار رو واضح تر شرح بدین تا بشه کمک کرد.

شما در درجه اول نحوه نمایش و کار با سیستم رو اصلاح کنید . بعدش برید سراغ کدهای پشت صحنه مثل 3 لایه و ...

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

maryam_80
پنج شنبه 23 آبان 1387, 18:22 عصر
اصل ماجرا از اين قرار هست که بنده اينجا يک interview براي Senior .NET Developer رفته بودم .در اونجا يک برگه به من دادند که در اون 2 تا جدول به نامهاي dealer و customer بود و از من خواستند تا فرمي را تهيه کنم که به توان در آن براي هر مشتري يک dealer انتخاب کرد البته اين فاز اول کار بود. که حدود 30 دقيقه هم وقت داشتم .
من هم سري از detailview استفاده کردم و بعد ديدم که سيستم هنگ کرد وبعد متوجه شدم که جداول من داراي 7000 , 1000000 رکورد مي باشند.
در جدول مشتري من فقط کد و نام مشتري را داشتم پس نميشد فيلتر گذاشت يا حداقل من نميدونستم که رو چي فيلتر کنم
خلاصه من که اين موقعيت کاري را به راحتي از دست دادم و از اون روز فکر مي کنم يک Junior بيش نيستم :عصبانی++:
ولي برام مهم هست که بدانم نکته کليدي کجا بوده ؟؟؟؟:متفکر:

abbasegold
پنج شنبه 23 آبان 1387, 20:45 عصر
من اگر بخواهم چنین برنامه ای بنویسم به شرح زیر عمل می کنم :

برای انتخاب نام مشتری دو فیلتر (یکی مربوط به نام و دیگری کد) قرار میدهم. بر روی OnTextChanged شرط میگذارم (میتوان این قسمت را Client Side هم نوشت) که اگر تعداد کاراکتر های وارد شده در هر فیلتر بیشتر از 3 شد، Select اجرا شود.

بدین ترتیب اگر کاربر بخواهد رکوردی که مربوط به Bill Gates با کد 123456014 میباشد را انتخای کند ، با وارد کردن سه کاراکتر Bil در فیلتر نام یا 123 در فیلتر کد ، رکوردهای مورد نظر که تعداد آنها طبیعتاً محدود است آورده می شود و حال می توان این لیست را در GridView یا ... نشان داد.

peymannaji
پنج شنبه 23 آبان 1387, 22:19 عصر
علاوه بر معماری برنامه نویسی تون در دات نت یک چیز دیگه هم باید در نظر بگیری . اونم خود دیتابیس هست ... سمت SQLSERVER هم شما میتونید کارایی رو افزایش بدین ... بعنوان مثال با INDEX گزاری روی فیلدهای کلیدی و ...

mahdi_farhani
پنج شنبه 23 آبان 1387, 22:34 عصر
درسته که Index گذاری روی فیلدها در سرعت فراخوانی اطلاعات تاثیر داره ، ولی اینجا بحث چیز دیگه ای و بحث سر نحوه نمایش اطلاعات هست .
اونجا که من گفتم معماری سه لایه تو پرانتز گذاشتم یعنی واجب نیست به قول معروف مستحب
ولی نکته که اینجا هست از SQLDataSource بهتره استفاده نشه ، از Dataset هم بهتره استفاده نشه چون بازدهی کمتری نسبت به DataReader دارن ، پس گزینه اول برای Featch کردن DataReader میشه .
نکته که میشه روش تکیه کرد نحوه فیلتر کردن دیتا هست.
که این خودش جای بحث داره
قبل از Fetch کردن فیلتر کنیم ، یا همه رو بخونیم بعد فیلتر کنیم ؟؟؟؟؟؟؟؟؟
بحث خیلی جالبیه ، همه ما روز به این نقطه میریسیم که دیتا سیستم بره بالا و بازدهی سیستم که بشه ، پس چه بهتر که همین جا جلشو بگیریم .

peymannaji
پنج شنبه 23 آبان 1387, 22:47 عصر
یادمه زمانی که میخواستم فایل مربوط به IP2location رو کانورت کنم . یک فایل اکسل بود که بعدش به mdb‌تبدیلش کردم . حاوی 4 میلیارد رکورد بود . جالبه که بدونید وقتی که فایل رو باز کردم انتظار اینو داشتم که یک 20 دقیقه ای سیستم تو هنگ باشه . اما دیدم که اکسس2007 نیومد کل رکورد هارو نمایش بده مثلا 500 تاشو نشون میداد و زمانی که اسکرول به سمت پایین میومد رکورد های جدید اضافه میشد ... نمدونم اما شاید بشه از این موضوع هم ایده گرفت ... به هر حال منم با نظر آقای فراهانی موافقم هرجوری هست تو این تاپیک مسئله رو حل و فصل کنیم ... چون منم واقعا نیاز به این مورد دارم ...

mahdi_farhani
پنج شنبه 23 آبان 1387, 22:55 عصر
تو SQL هم اگر بخواهی بازش کنی چند رکورد رو میاره و شما میتونی شروع به کار کردن بکنی و خودش ادامه میده ، من دیروز با Vostro 1510 2.5 6m va 3 g ram بیشتر از 30 دقیقه طول کشید تا همه رو لود کرد برام.
یکسری Query نوشتم که من که سهلم خوده SQL هم توش موند Timeout بم داد .
برای نتیجه بهتر من Country_Code های IR با یک View جدا کردم که حدود 3333 رکورد شد . و نتیجه خیلی سریع بود ، بعد از اون شروع به تحلیل و کوئری نوشتم کردم .
کل اینها رو گفتم که برسیم سر فیلتر کردن.
اول و آخر این بحث این هست که محدوده بررسی اطلاعات باید کم بشه ، چون به هیچ عنوان نمیشه تو یک سیستم با این حجم داده انتظار بهتری داشت .
البته با این معلومات کمی که من دارم .............................

adonis
جمعه 24 آبان 1387, 01:04 صبح
یه راهی برای paging هست که سرچ کنی تو گوگل ریخته. به جای اینکه موقع صفحه بندی هر بار اون همه رکورد رو از دیتابیس بیاری بیرون و صفحه مربوطه رو نشون بدی نگاه می کنی که صفحه چند هستی و به تعداد مثلا 20 تا رکورد میکشی بیرون و با عوض کردن صفحه هر بار فقط 20 تا داده می کشی بیرون. البته همچنان زدن query روی یه جدول به اون عظمت نکته ایه!

maryam_80
جمعه 24 آبان 1387, 01:59 صبح
ممنون از تمام دوستان

من که براي اين شغل بدجوري فيلتر شدم :ناراحت: ولي يک چيز به خود من ثابت شد که يک برنامه نويس حرفه اي بايد شخصي فراتر از يک copy paste کار باشد (کاملا شخصي هست و به فرد خاصي مربوط نميشه) چون در مدت کمتر از 30 دقيقه در شرايطي بس استرس آور ،فکر کردن ،پيدا کردن راه حل،استفاده صحيح از کنترلها،نوشتن کد و تست کردنش در اين بازه زماني فقط و فقط کسي را مي خواهد که اولا اصول صحيح برنامه نويسي را بداند و ثانيا تجربه کافي در کد نويسي و استفاده از تکنيک ها را داشته باشد.