PDA

View Full Version : سوال: ایجاد یک تکست باکس با قابلیت AutoComplete برای جستجو در یک جدول با 20000 رکورد با الگوریتمی بهینه.



iman_pc_love
پنج شنبه 04 اسفند 1390, 10:21 صبح
آقا من یک جدول دارم با 20000 رکورد میخام یه Textbox با قابلیت AutoComplete برای جستجو روی فیلد Name از این جدول بزارم حالا ممکنه وقتی فیلد Name انتخاب بشه مقادیر تکراری باشه و تعداد مثلاً بشه 15000 با این حال خاصیت AutoCompleteCustomSource رو چطور باید تنظیم کرد که این 20000 عنوان رو ساپورت کنه (البته به صورت بهینه)

با توجه به اینکه برنامه multi user هست و فقط برای ایجاد یه تکست باکس با قابلیت autoComplete دیتابیس رو خیلی خیلی مشغول میکنه راه حل بهینه ای برای این کار نیست؟ حرفه ای ها جواب بدن لطفاً

mehdi.mousavi
شنبه 06 اسفند 1390, 11:53 صبح
سلام.
شما باید برای TextChanged Event هندلری تعریف کنید و در اون، بر اساس ورودی زده شده در TextBox، فقط ده مورد اخیری که با اون رشته شروع شده رو (ده عددی فرضی هستش و طبیعتا نباید بیش از این هم باشه) از بانک بگیرید، سپس در همون Handler یک AutoCompleteStringCollection ایجاد کنید، مقادیر گرفته شده از بانک رو به اون Add کنید، و نتیجه رو در AutoCompleteCustomSource قرار بدید. از طرفی، اگر منظورتون اینه که گرفتن 10 رکورد از 20000 رکورد موجود در بانک زمان بر هستش، می تونید FTS رو روی بانک فعال کنید و از این قابلیت در SQL Server استفاده کنید (یا در بانک های دیگه، از روش های مشابه استفاده کنید).

موفق باشید.

iman_pc_love
شنبه 06 اسفند 1390, 14:42 عصر
منظورم این بود که چطور میتونم تعداد درخواست ها رو از بانک کم کنم فرض کنید این برنامه 200 کاربر داره، و این 200 کاربر همزمان دارن یکسره جستجو می کنن و اطلاعات را از دیتابیس می گیرن تقریباً مثل گوگل که همزمان میلیونها نفر دارن کار واحدی را انجام می دن خوب راهی هست که تعداد درخواست ها از دیتابیس کم بشه؟

mehdi.mousavi
دوشنبه 08 اسفند 1390, 10:42 صبح
منظورم این بود که چطور میتونم تعداد درخواست ها رو از بانک کم کنم فرض کنید این برنامه 200 کاربر داره، و این 200 کاربر همزمان دارن یکسره جستجو می کنن و اطلاعات را از دیتابیس می گیرن تقریباً مثل گوگل که همزمان میلیونها نفر دارن کار واحدی را انجام می دن خوب راهی هست که تعداد درخواست ها از دیتابیس کم بشه؟

سلام.
شما برای Minimum شدن درخواست ها از سرور، باید Timer ای داشته باشید که توسط اون تشخیص بدید که فرضا برای 300 میلی ثانیه تغییری در محتوای TextBox رخ نداده و سپس درخواست رو به سرور ارسال کنید. بدین ترتیب، اگر کاربر پشت سر هم حروف مورد نظرش رو برای جستجو وارد کنه، 300 میلی ثانیه از آخرین Key Stroke باید بگذره تا شما درخواست رو به سرور ارسال کنید. این مساله به طرز چشمگیری تعداد query های شما رو از سرور کاهش میده. اما اینکه چطور در مجموعه عظیمی از رکوردها، میشه دنبال رکوردی گشت که فرضا با فلان 5 حرف شروع میشه، به اعتقاد من بهترین روش فعال سازی FTS روی بانک هستش. بدین ترتیب، با میلیونها رکورد نیز فقط یک لحظه زمان میبره تا شما به 10 رکورد مورد نظر برسید. لطفا در مورد FTS و چگونگی استفاده از اون، جستجو کنید.

موفق باشید.

iman_pc_love
دوشنبه 08 اسفند 1390, 13:12 عصر
سلام.
شما برای Minimum شدن درخواست ها از سرور، باید Timer ای داشته باشید که توسط اون تشخیص بدید که فرضا برای 300 میلی ثانیه تغییری در محتوای TextBox رخ نداده و سپس درخواست رو به سرور ارسال کنید. بدین ترتیب، اگر کاربر پشت سر هم حروف مورد نظرش رو برای جستجو وارد کنه، 300 میلی ثانیه از آخرین Key Stroke باید بگذره تا شما درخواست رو به سرور ارسال کنید.
این روشه خوبیه، ممنون، اما یک نوع بهینه سازی دیگه به همراه این روش کار رو عالیتر می کنه، من ایده اش را می دانم ولی پیاده سازیش رو نمی دونم از چه طریقی انجام بدم، اینکه مثلا وقتی کاربر چند کاراکتر تایپ کرد و مثلاً 300 میلی ثانیه گذشت یه درخواست به سرور میره تا اینجا درست، خوب در طول روز کاربر ممکنه یک کلمه خاص رو چندین بار جستجو کنه ما می تونیم کاری بکنیم که مثلاً آخرین 10 لیست گرفته شده از دیتابیس رو جایی ذخیره کنیم که دیگه نیازی نباشه دوباره به سرور درخواست بدیم، ولی از اونجا که برنامه مولتی یوزر هست و لیست نام ها ممکنه مورد حذف، اضافه، ویرایش قرار بگیره البته تعداد تغییرات زیاد نیست ولی به هر حال هست، چطور می تونم بین لیست ذخیره شده و پایگاه داده هماهنگی ایجاد کنم؟