# زبان های اسکریپتی > Classic ASP > حرفه ای: طراحي يك سيستم ثبت نام چند مرحله اي

## siamak-s

با سلام خدمت دوستان!

من مي خواستيم يك سيستم ثبت نام چند مرحله اي درست مثل اون سيستمي كه سازمان سنجش يا مركز آزمون دانشگاه آزاد براي ثبت نام از داوطلبان كنكور داره طراحي بكنم. در حقيقت در اون سيستم ثبت نام در چند مرحله انجام ميشه ، به طور مثال در مرحله اول اطلاعات شخصي كاربر گرفته ميشه و بعد در مرحله ي دوم اطلاعات تصوير و بعد در مرحله ي سوم اطلاعات آزموني داوطلب گرفته ميشه و در آخر يك پيش نمايش كلي از اطلاعات دريافتي نشون داده ميشه و اگر اطلاعات درست بود و كاربر تاييد كرد ثبت نهايي ميشه.
حالا براي طراحي اين سيستم به نظر شما از چه شيوه اي بايد استفاده كرد، تقريبا 2 ، 3 ساعتي هست كه توي برنامه نويس دارم مي گردم ولي چيزي كه كار من رو راه بيندازه پيدا نكردم‌ ،‌مواردي در تالار ASP.NET پيدا كردم اما من مي خوام كه ASP بشه .
حالا به نظر شما چيكار بايد كرد ، در ضمن حجم ثبت نام بالاست ،  نكته ي ديگه بايد طوري باشه كه طرف اگر صفحه رو بست ديگه منابع سرور رو اشغال نكنه.
حالا به نظر ما چه كاري بهتره !؟ استفاده از Session ، استفاده از Hidden Field ها ، استفاده از خود Database سمت سرور يا ... ؟

ممنون ميشم اگر كمك كنيد.

----------


## mosyhey

خود این سایت هایی که گفته اید از چه روشی بهره می گیرند؟

از session ها نبایستی استفاده کرد چون از آنجا که کاربران و فیلد های فرم ها زیادند بار بسیار زیادی را بر سرور می آورد.

به نظر من همان استفاده از دیتابیس بهترین گزینه هست.

----------


## siamak-s

من خودم هم نمي دونم از چي استفاده مي كنند! 
خوب Session ها به نظر راحت ترين كار ميان! اما خوب من هم به خاطر همون حرفي كه شما زديد شك دارم كه از Session استفاده كنم چون مخصوصا كه تعداد ثبت نام ها زياد هست. 
مورد بعدي Hidden Fields هست كه خيلي گزينه ي به صرفه اي هست ولي خوب شما بايد امنيت رو بيخيالش بشي ، و خيلي هم مبتديانه به نظر ميرسه!
مورد سوم كه شما هم فرموديد ديتابيس هست، خوب وقتي كه صحبت ازديتابيس سمت سرور مياد يه مشكلاتي هم مياد، اينكه مثلا اگر طرف اطلاعات دو مرحله اش رو ثبت كرد و بعد پنجره رو بست اون اطلاعاتي كه داخل ديتابيس مونده چي ميشه!؟ و البته مشكلات ديگه ! با توجه به اينكه حجم كارهم زياد هست اين مي تونه مشكل ساز بشه.
ممنون ميشم ، اگر تجربه اي در رابطه با اجراي اين كار به وسيله ي ديتابيس داريد بهم بگيد.

----------


## binyaz2003

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

----------


## siamak-s

خوب اين ايده ي خوبي هست ، ولي به نظر بهينه نمياد ، ببينيد تعداد فيلد ها خيلي زياد هست و زماني هم كه طرف ثبت نامش تكميل شد در 3 تا تيبل اطلاعاتاتش تقسيم ميشه كه هر كدوم هم تعداد فيلد هاي زيادي دارند ، يا بايد يك تيبل تمپ باشه كه همه ي فيلد هاي اين 3 تا تيبل رو داشته باشه يا اينكه 3 تا تيبل تمپ باشه. نكته ي بعدي اينه كه حجم ثبت نام واقعا بالاست يعني ممكنه 1000 نفر در يك ساعت بخوان ثبت نام بكنن ، مشكلي كه پيش مياد ذخيره اين همه اطلاعات دي تيبل تمپ و بعد انتقال دوباره اين ها به تيبل اصلي مشكل ساز نميشه بار روي سرور رو زياد نمي كنه ؟ حالا در مورد ركوردهاي سوخته اي كه اين  وسط هم مي مونن كه ديگه بحث جدايي؟
من واقعا نمي دونم تو اين سيستم هاي ثبت نام به اون بزرگي دقيقا چي كار مي كنن ، به نظر كارايي فوق العاده اي داره. كسي چيزي در مورد سايت سازمان سنجش نمي دونه؟

----------


## binyaz2003

در مورد سنجش که کارشناسي رو حساب کنيد خيلي ديگه بشه 30 تا فيلد بخواد تازه خيلي هاشون مثل کد شهر و ... عددي و کوچکند.فکر نکنم آنچنان حجمي داشته باشه بزرگترينش بايد آدرس باشه.حالا از شما چقد هست نميدونم.

----------


## siamak-s

تقریبا تعداد فیلدهای ثبت نامی من هم همون حدود هست ، حدود 20 فیلد اطلاعات شخصی در یک تیبل ، 7 تا در یک تیبل دیگه و حدود 8 تا در یک تیبل دیگه هست. پس به نظر شما بهترین راه همون استفاده از تیبل تمپ هست!؟ بعد اگر قرار این طور باشه حالا 3 تا تیبل تمپ باشه (یعنی به ازای هر تیبل اصلی دقیقا یک تیبل تمپ) بهتر هست یا اینکه یک تیبل تمپ باشه و همه ی فیلد ها رو داشته باشه؟ و بعد موقعی که ثبت نام قطعی شد فیلدهای تیبل تمپ به فیلد های تیبل اصلی منتقل شند؟
خواهشا اگر باز هم مورد دیگه ای هم به نظرتون میرسه یا توی نت پیدا کردید اطلاع بدید (البته من خیلی 
گشتم) چون حساسیت این کار فوق العاده بالاست.
سوال دیگه به نظر شما فکر می کنید کدوم دیتابیس بهتره؟ من قبلا تجربه ای با SQL Server 2000 داشتم واقعا دیوانه کننده بود،خیلی کند بود، حالا به نظر شما بین MySQL و SQL Server 2000 و یا حتی Access (واقعا گاهی اوقات عملکردش از این دو تا هم بهتره!) کدوم رو پیشنهاد می کنید؟ توجه داشته باشید که حدود 20000 نفر قرار هست در مدت کمی ثبت نام کنند.ممنون.

----------


## kashaneh

دوست عزیز پیشنهاد من MS SQL Server 2005 است... من خودم تجربه ثبت نام حدود 1000 نفر در روز رو باهاش داشتم و واقعا بدون نقص کار کرد (البته ثبت نام ساده با یک جدول ولی حدود 25 فیلد) ... 

در مورد روش کلی کار هم به نظرم اگر از یک جدول کمکی کنترلی استفاده بشه بهتره... یعنی اطلاعات در جداول اصلی ریخته بشن و فقط در این جدول کمکی (temp) از اول بیاییم وضعیت ثبت نام جاری رو ناموفق فرض کنیم تا زمانیکه به مرحله آخر رسیدیم و اونو به وضعیت موفق تغییر بدیم... به این ترتیب جدول کمکی ما فکر می کنم به حداکثر 2 فیلد (ID - Status) نیاز خواهد داشت... حال وقتی یک ثبت نام جدید خواست اتفاق بیفتد یا در زمانی دیگر به صورت دستی، کلیه ID ها از جدول کمکی که در وضعیت ناموفق هستند رو شناسایی و اطلاعات رو از جدول اصلی پاک کنیم... به نظرم اینطوری خیلی از حجم کاری (فضا - زمان) کاسته میشه...

موفق باشی

----------


## siamak-s

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

----------


## mosyhey

هرچند کار برنامه نویسی برای وب و آن هم با کاربران زیاد کاری بسیار حساس است و هر خط کد و هر ارتباط با دیتابیس را بایستی در نظر داشت ولی فکر هم نکنم اینقدر که شما سخت می گیرید، خودداری نیاز باشد. مثلاً اگر قرار است جدول کاربران شما در نهایت 1.000.000 رکورد داشته باشد اگر 100.000 تا هم کار را نیمه کاره رها کردند و شد 1.100.000 رکورد، کاهش چندانی بر روی کارآیی آن دیتابیس نخواهد گذاشت. تازه پس از پایان زمان ثبت نام و گرفتن پشتیبان از دیتابیس می توان به طور دستی جدول را ویراست.

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

حساس ترین ثبت نام را اگر ثبت نام کنکور سراسری بگیریم، باید بدانید که همین امسال یک شب تا صبح قطع بود تا صبح که دوباره راه اندازی شد.

----------


## siamak-s

ممنون از اینکه بحث رو دنبال می کنید، خوب به نظر همین فیلد  Status بهترین گزینه باشه. اگر که من اینقدر حساسیت به خرج میدم به خاطر تجربه های گذشته ام بود که در ساعات پیک کار (معمولا ساعات آخر ثبت نام) فوق العاده به سرور فشار میاد. مورد دیگه اینکه این کار قرار هست روی سرور Share اتفاق بیفته و یک مقدار هم به همین دلیل منابع کمی در اختیار برنامه هست.
در هر حال بازم ممنون میشم اگر ایده ی دیگه به نظرتون رسید بگید.
فقط یک سوال دیگه اینکه اگر در رویداد Session_OnEnd بررسی بشه که اگر ثبت نام کامل نشده بود رکوردهای مربوط به اون Session از Table ها حذف بشه چه طور هست؟ از لحاظ بار روی سرور؟
ممنون از همه ی دوستانم. :لبخند:

----------


## mehrdad85

سلام 

دوستان یه سوال داشتم ممنون میشم پاسخ بدید 
ببینید نتیجه این شد که داخل table  اصلی یک فیلد از نوع boolean  در نظر بگیریم که وضعیت اون رکورد را نشون میده 
اگه تمامی فیلد هاا به درستی تکمیل شده باشند و به عبارتی ثبت نام به درستی انجام شده باشد این فیلد مقدار true میگیرد و اگر هر نوع مشکلی در حین ثبت نام وجود داشته باشد این فیلد مقدار false  میگیرد. هر مرحله درج در دیتابیس در یک صفحه انجام می شود . تفاوت این سیستم من با سیستم ثبت نام در این است که فرض کنید یک نفر مسول است که بعد از ورود به سیستم با نام عبور و پسورد اقدام به وارد کردن اطلاعات ثبت نامی که به صورت کاغذی در فرم ثبت شده است در سیستم نماید . 
اکنون دیگر استفاده از Session  وجود ندارد 
چطور میتونم بفهمم که اطلاعات مربوط به مرحله مثلا سوم درج دنباله اطلاعات مرحله دوم است یا اینکه ثبت نامی از آغز انجام گرفته  است؟
نمیدونم تونستم سوالمو و منظورمو درست مطرح کنمک یا نه اما اجازه بدید یه مثال بزنم
ثبت نام از دو مرحله الف و ب تشکیل شده 
در مرحله الف فیلد های 1و2و3 وارد دیتابیس میشن و در مرحله ب فیلد های 4و5و6 در دیتابیس ثبت میشن 
فیلد 7 نیزبیانگر وضعیت است که رکورد مورد نظر قابل قبول است یا خیر

کاربر وارد سیستم میشه 
مرحله الف را در دیتابیس ثبت میکنه و به صفحه مربوط به مرحله ب می رود حال از کجا میشه فهمید که در اطلاعات وارد شده در این مرحله مربوط به رکورد مرحله الف است یا اینکه در یک رکورد جدید این اطلاعات ثبت می شود ؟


مرسی
واقعا نیازمند کمکتون هستم 
با تشکر

----------


## ras-amir

برای فشار نیومدن به سرور هم می تونید از دیتابیس خود پی اچ پی استفاده کنید تا حجم بانک اطلاعاتی تون کم و کوچیک بشه.
(برای خالی نبودن عرضه بود!)

----------

