PDA

View Full Version : روش بهینه جهت ذخیره آرشیو مقادیر در بانک



spring69
جمعه 02 اسفند 1392, 21:05 عصر
سلام
بانک اطلاعاتی شامل اطلاعاتی با تغییرات سالانه داریم. تا کنون برای بروزرسانی از بانک سال قبل کپی پشتیبان گرفته شده و مقادیر آنها برای سال جدید بروز میشده. اکنون نیاز به ارائه آرشیو این اطلاعات داریم.
از نظر شما بهترین روش برای ذخیره آرشیو این تغییرات به چه شکل است؟
• بانک شامل حدودا 300 جدول با میانگین تعداد فیلد 30 عدد می باشد.
• موجودیت ها در آپدیت سالانه ممکن است افزایش یا کاهش یابند.
• مقادیر فیلدها در آپدیت سالانه ممکن است تغییر یابند یا بدون تغییر باقی بمانند.
با توجه به نکات بالا، برای هر فیلدی که مقدار آن تغییر کرده نیاز به ذخیره مقادیر قبلی و جدید می باشد ولی در صورتیکه بدون تغییر باقی مانده باشد، فقط مقدار قبلی حفظ گردد.

حمیدرضاصادقیان
جمعه 02 اسفند 1392, 22:15 عصر
سلام.
یک ذره ساختار به نظرم درست نمیاد.
شما وقتی اطلاعاتی رو آرشیو می کنید نباید دستخوش تغییرات بشه.
چون تمام ساختارهای شمارو بهم میریزه.
مثلا داده های 10 سال قبل مالی نباید دیگه تغییر کنند چون باعث میشه تمام 10 سال دستخوش تغییرات قرار بگیره.
ولی به نظرم تا یکی دوسال رو در دیتابیس اصلی داشته باشید و داده های مثلا از 3 سال قبل رو آرشیو کنید و در یک دیتابیس دیگه نگهداری کنید که مطمئن هستید تغییری نمیکنه.

spring69
دوشنبه 05 اسفند 1392, 16:17 عصر
با تشکر از آقای صادقیان بابت پاسخشون.


ولی به نظرم تا یکی دوسال رو در دیتابیس اصلی داشته باشید و داده های مثلا از 3 سال قبل رو آرشیو کنید و در یک دیتابیس دیگه نگهداری کنید که مطمئن هستید تغییری نمیکنه.
با این روش اگر کاربر درخواست مثلا مقایسه داده های سالهای مختلف رو کرد باید بریم سراغ بازگردانی چند بانک و خواندن از چند بانک و غیره که من قصد انجام این روش رو ندارم.



یک ذره ساختار به نظرم درست نمیاد.
شما وقتی اطلاعاتی رو آرشیو می کنید نباید دستخوش تغییرات بشه.
چون تمام ساختارهای شمارو بهم میریزه.
مثلا داده های 10 سال قبل مالی نباید دیگه تغییر کنند چون باعث میشه تمام 10 سال دستخوش تغییرات قرار بگیره.
در مورد تغییر اطلاعات آرشیو شده باید عرض کنم منظورم از تغییر اینجا این نبود که مقدار قبلی از بین بره و در اصل همه منظورم از ایجاد این تاپیک حل این مشکله که کجا اطلاعات آرشیوم رو ذخیره کنم که نه مجبور بشم بانک رو بسیار گسترده کنم نه اطلاعات قبلیم رو از دست بدم.
یک روش آقای نصیری در اینجا (http://www.dotnettips.info/post/1521/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%D9%87-%D8%A8%D9%87-%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D8%B1-%D8%A8%D8%A7%D9%86%DA%A9%E2%80%8C%D9%87%D8%A7%DB%8 C-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C-%D8%B1%D8%A7%D8%A8%D8%B7%D9%87%E2%80%8C%D8%A7%DB%8 C) پیشنهاد دادن که برای تعداد فیلدهای پایین (مثلا وقتی که حقوق کارمند قراره سالانه تغییر کنه و نیاز به حفظ آرشیو تغییرات هست) روش خوبی هست ولی ما اینجا حدودا 900 فیلد داریم که همچین شرایطی ممکنه براشون پیش بیاد و مقادیرشون تغییر کنه. اینجاست که دیگه ایجاد یک جدول Temporal‌به ازای هر فیلد و ذخیره مقادیر آرشیو همراه با تاریخ برای این تعداد فیلد منطقی بنظر نمیاد.



میخواستم اگر دوستان به همچین سناریویی قبلا برخورد کردن و یا راه حلی دارن اینجا ارائه بدن.

حمیدرضاصادقیان
سه شنبه 13 اسفند 1392, 07:39 صبح
با این روش اگر کاربر درخواست مثلا مقایسه داده های سالهای مختلف رو کرد باید بریم سراغ بازگردانی چند بانک و خواندن از چند بانک و غیره که من قصد انجام این روش رو ندارم.
ببینید شما یک دیتابیس Live دارید که دارن باهاش کار میکنند و داده هارو تغییر میدن. یک دیتابیس برای Archive درنظر میگیرید و تمام داده ها رو از یک بازه ای به قبل درون اون نگهداری می کنید.
در این حالت شما دوتا دیتابیس با اسم مشخص دارید که وقتی میخواهید گزارش بگیرید خیلی راحت میتونید از اون دیتابیس نیز استفاده کنید.
یک روش دیگه این هست که یک جدول Archive درون همون دیتابیس اصلی درنظر بگیرید و داده های قدیمی رو درون اون Insert کرده و از جدول جدید حذفشون کنید.
بعد اون جدول رو در یک FIleGroup دیگه ایجاد کرده و اصلا در یک هارد دیگه بر روی سرور قرار بدید.
با این روش شما کندی در کار احساس نخواهید کرد ، داده های شما در یک دیتابیس هست و به راحتی میتونید Query بنویسید.
تنها مشکلش افزایش حجم Backup هست که میشه از Filegroup Backup استفاده کرد که از هر FileGroup به صورت جداگانه Backup تهیه بشه.
یک راه دیگه Partitioning جدول فوق هست که مثلا براساس تاریخ این Partitioning انجام بشه .این روش به نوعی خودکار انجام میشه ولی در روش بالا باید یک trigger یا Job برای عمل انتقال بنویسید.