PDA

View Full Version : سوال: راهنمایی برای نوشتن نرم افزار آمار(حضور و غیاب)



ahmad_lovely
پنج شنبه 17 اسفند 1391, 15:40 عصر
با سلام
من میخوام برنامه با سی شارپ بنویسم که آمار حضور و غیاب افراد رو ثبت کنم. حالا به یه مشکلی برخوردم. اینکه افرادی که قراره آمارشون هر روز ثبت بشه هزار تا هزاروصد نفرن، با این وجود اگه بخوام برای هر نفر هرروز یه رکورد توی دیتابیس اضافه بشه، حجم دیتابیس خیلی می ره بالا. از اساتید می خوام یه روشی رو بهم پیشنهاد کنن که انقد حجم دیتابیس زیاد نشه.
وضعیت افراد علاوه بر حاضر موارد دیگه ای هم دارن، مثل مرخصی، استراحت پزشکی و...
خیلی ممنون

veniz2008
پنج شنبه 17 اسفند 1391, 16:17 عصر
سلام.
شما به چه تعداد رکورد میگی زیاد؟
دوست من، اصلا اینطور نیست که فکر کنید 100 هزار و 500 هزار رکورد تعداد زیادی محسوب میشه. حتی ممکنه برای یک فرد نیاز باشه که در یک روز چندین رکورد ثبت کنی. مثلا کاربرانی رو در نظر بگیرید که مرخصی ساعتی میگیرن. اگر در روز 1 بار مرخصی ساعتی بگیره باید 3 رکورد واسه این شخص ثبت کنی (زمان ورود، زمان مرخصی و دوباره زمان ورود مجدد). شما اگر دیتابیس رو اصولی طراحی کنید و از روش های مناسب (مثلا ایندکس گذاری صحیح) استفاده کنید نگران این موضوع نباشید. sql server قدرتمندتر از این حرفهاست که با این تعداد رکورد دچار مشکل بشه. البته میتونید مثلا هر چندماه یکبار از داده هاتون اگر بهشون نیاز ندارید یک backup تهیه کنید و اطلاعات قدیمی تر رو حذف کنید تا دیتابیس خیلی هم سنگین نشه.

ahmad_lovely
پنج شنبه 17 اسفند 1391, 16:40 عصر
ممنون از پاسختون، یعنی اینطور که شما میگین روزی هزار رکورد درج بشه مشکلی پیش نمیاد، به همراه بکاپ گرفتن بعد از یه زمانی


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

veniz2008
پنج شنبه 17 اسفند 1391, 16:57 عصر
دغدغه اصلی دوستان از سنگین شدن دیتابیس مربوط به زمان جستجو میشه که sql باید از بین انبوهی از اطلاعات، داده رو در زمان قابل قبولی پیدا و برگشت بده.
برای اینکه کارایی بهتر برنامه شما داشته باشه بهتره از stored procedure ها استفاده کنید تا سرعت اجرای کوئری های شما بیشتر بشه. برای داده های زیاد ایندکس گذاری یه عامل خیلی مهمه. یه ایندکس خوب، باعث میشه که sql از بین هزاران رکورد، توجه خودش رو به بازه کوچیکی از داده ها معطوف کنه . بنابراین سرعت کار به مراتب بالاتر میره (اگر ایندکس نذارید sql ناجارا ممکنه تمام رکوردها رو پویش کنه تا داده مورد نظر رو پیدا کنه). سعی کنید تا حد امکان از join های اضافه بین جداول پرهیز کنید و کوئری های کاراتری رو بنویسید.

ahmad_lovely
پنج شنبه 17 اسفند 1391, 17:41 عصر
ممنون از پاسختون، عذر می خوام میشه بیشتر در مورد ایندکس توضیح بدید، یکم برام مبهم شده!

veniz2008
پنج شنبه 17 اسفند 1391, 17:52 عصر
Index (شاخص یا نمایه) بر روی ستون (ها) تعریف میشه و بسته به نوع index داده ها یا بصورت فیزیکی یا در پس زمینه مرتب میشن و sql همیشه یه آمار از این مرتب سازی نزد خودش داره. در حالت عادی چنین مرتب سازی صورت نمیگیره. زمانیکه از ایندکس استفاده میکنید، sql با توجه به ستون هایی که انتخاب شدن داده ها رو مرتب میکنه و زمانیکه شما داده خاصی رو جستجو میکنید، به جای اینکه همه داده ها از ابتدا جستجو و مقایسه بشن، sql داده رو که از قبل مرتب شده است برای شما پیدا میکنه. به اینصورت در زمان پیدا کردن رکورد کاهش محسوسی اتفاق می افته. متاسفانه مطلب درباره ایندکس بسیار کم وجود داره. بنابراین توصیه میکنم حتما یه کتاب تهیه کنید و کامل با اصول ایندکس ها اشنا بشید.

ahmad_lovely
پنج شنبه 17 اسفند 1391, 18:16 عصر
میتونید یه نمونه کد برام بزارید تا بهتر متوجه بشم؟

veniz2008
پنج شنبه 17 اسفند 1391, 18:31 عصر
باور کنید اگر بخوام یه موردی رو باز کنم و توضیح بدم شاید چندین صفحه طول بکشه ( البته نه خود index ، چون ایندکس ها اگر بصورت کد بخوای پیاده سازی کنی 5 خط هم نمیشه و البته میتونی بصورت ویزاردی هم ایندکس ها رو تعریف کنی. منظورم توضیح دادنش هست که چطور باید انتخاب کنیم و چه نکاتی رو باید رعایت کنیم). بذارید یه مثال بزنم. جدولی رو با 1 میلیون رکورد در نظر بگیرید که یک فیلد کلید با نام UserID و از نوع int و identity داره و به ترتیب از شماره 1 تا 1000000 درونش داده ریخته شده. حالا دنبال رکوردی میگردیم که UserID = 600000 رو داره. اگر از ایندکس استفاده نکنید، sql از اول شروع میکنه و تک تک رکوردها رو پیمایش میکنه تا زمانیکه به داده مورد نظر برسه. ولی در این مورد اگر از یک ایندکس غیر دسته ای (NonClustered Index) بر روی ستون UserID استفاده کنید. موقع جستجو ، sql که داده ها رو براساس BTree مرتب میکنه، در زمان بسیار کمتری داده مورد نظر رو پیدا میکنه و دیگه به بررسی تک تک رکوردها نمی پردازه.

ahmad_lovely
پنج شنبه 17 اسفند 1391, 20:54 عصر
خیلی ممنون از راهنمایی هاتون، حتما میرم دنبالش