PDA

View Full Version : ذخیره و بازیابی رکوردهای با طول متغیر



SAASTN
دوشنبه 05 مهر 1389, 19:37 عصر
فرض کنید داخل برنامه چند لیست مختلف از اطلاعات وجود داره و ما می خوایم این اطلاعات رو بصورت باینری داخل فایل ذخیره و بازیابی کنیم. خوب لیست ها رو از طریق Stream داخل فایل ذخیره می کنیم و ... (از KHStream استفاده می کنم).
مشکل از جایی شروع میشه که طی Upgrade نرم افزار، ممکنه فیلد هایی به رکوردها اضافه بشه. در اینصورت به علت تغییر در سایز رکورد و در نهایت تغییر سایز Stream، نسخه های جدیدتر نمی تونن فایل ایجادشده توسط نسخه قبلی رو بخونن و بلعکس.
راهکاری که من تا حالا استفاده می کردم این بوده که موقع اضافه شدن فیلدهای جدید یه کپی از رکورد قبلی با نام دیگه ای نگه می داشتم و با توجه به ورژن نسخه ای که توی فایل ذخیره شده تصمیم می گرفتم که از کدوم رکورد برای بازیابی استفاده کنم.
ولی خوب این روش به هیچ وجه قابل اتکا نیست و وقتی برنامه گسترش پیدا بکنه و تعداد نسخه ها زیاد بشن کنترل از دست خارج میشه.
می خواستم بدونم دوستان روش استانداری برای حل این مشکل میشناسن یا راهکاری به ذهنشون می رسه؟
متشکرم

tdkhakpur
دوشنبه 05 مهر 1389, 22:01 عصر
مشکل از جایی شروع میشه که طی Upgrade نرم افزار، ممکنه فیلد هایی به رکوردها اضافه بشه. در اینصورت به علت تغییر در سایز رکورد و در نهایت تغییر سایز Stream، نسخه های جدیدتر نمی تونن فایل ایجادشده توسط نسخه قبلی رو بخونن و بلعکس.


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


len := SizeOf(rec)
KHStream.write(@len, SizeOf(len));
KHStream.write(@rec, len);

و به هنگام بازیابی


len := SizeOf(rec)
KHStream.read(@len, SizeOf(len));
case len of
10 :
KHStream.read(@rec1, len);
20 :
KHStream.read(@rec2, len);
end;

اعداد 20 و 10 یک مثال از طول ساختار های مختلفی مانند rec1, rec2 هست.

SAASTN
دوشنبه 05 مهر 1389, 22:08 عصر
من همین بررسی رو بر اساس ورژن فایل انجام می دادم، مسئله اینه که می خوام اون Rec1 و Rec2 رو بردارم چون همینجوری میره تا Rec20 و Rec50 ...

tdkhakpur
سه شنبه 06 مهر 1389, 08:44 صبح
مسئله اينه که مي خوام اون Rec1 و Rec2 رو بردارم چون همينجوري ميره تا Rec20 و Rec50 ...

اگر منظورتان اين هست که نميتوانيد مشخص کنيد مثلا رکورد nام در اين حالت کجاي stream قرار دارد ميتوانيد به روش زير مکان رکور را پيدا کنيد.


KHStream.Position :=0;
for i:= 1 to n do
if KHStream.Position<KHStream.Size then
begin
KHStream.read(@len, SizeOf(len));
KHStream.Position := KHStream.Position+len
end;//بعد از حلقه محل جدید در استریم جای رکورد مورد نظر هست
KHStream.read(@len, SizeOf(len));// طول رکورد پیا شده را میخواند
KHStream.read(@Rec, len);// رکورد را میخواند

SAASTN
سه شنبه 06 مهر 1389, 20:11 عصر
نه نه، شاید مسئله رو واضح توضیح ندادم.
شما فرض کنید من فقط یه لیست از Rec1 دارم. توی Stream میریزمش ذخیره می کنم بعد هم بازیابی می کنم و مشکلی وجود نداره. توی نسخه 2 نرم افزار یه فیلد جدید به همین Rec1 اضافه میشه. حالا من اگه بخوام فایلی که با نسخه 1 ذخیره شده بوده رو بازیابی کنم با مشکل روبرو می شم. چون سایز Rec1 نسبت به نسخه 1 تغییر کرده. راهکاری که من استفاده می کردم این بوده که یه رکورد جدید تعریف می کردم با فیلدهایی که در نسخه 1 وجود داشته مثلا با نام Rec1_1 تا موقع خوندن فایل های قدیمی ازش استفاده کنم و توی فیلدهایی که در اون نسخه وجود نداشتن یه مقدار پیشفرض می ریختم. حالا اگه همینطور نرم افزار بره جلو به ترتیب رکورد های Rec1_2, Rec1_3 و ... بوجود میان که کار رو خیلی مشکل می کنه.

tdkhakpur
سه شنبه 06 مهر 1389, 20:58 عصر
حالا من اگه بخوام فایلی که با نسخه 1 ذخیره شده بوده رو بازیابی کنم با مشکل روبرو می شم. چون سایز Rec1 نسبت به نسخه 1 تغییر کرده

فرمت ذخیره سازیتان در نسخه اول چه شکلی بود؟ یعنی مستقیما داده را ذخیره کردید یا قبلش یه سری هدر هم قرار دادید؟
اگر به شکل ساده یعنی فقط رکورد را ذخیره کرده باشید راهی جز تغییر الگوریتم ذخیره سازیتان نیست والا در سرعت دسترسی مشکل خواهید داشت.
میتوانید داده های ورژن قبلی را خوانده و با الگوریتم بهینه داخل stream جدید ثبت کنید یعنی برای هر یک از رکوردها طول را هم قبل از ثبت رکورد در stream ذخیره کنید.
irdataBase زیربنای بانکهای اطلاعاتی (http://barnamenevis.org/forum/showthread.php?t=240356) ‏

SAASTN
سه شنبه 06 مهر 1389, 22:04 عصر
رمت ذخیره سازیتان در نسخه اول چه شکلی بود؟ یعنی مستقیما داده را ذخیره کردید یا قبلش یه سری هدر هم قرار دادید؟
هدر قراردادم ولی نه سایز هر رکورد، بلکه ورژن نسخه ای که فایل رو ساخته که خودش تعیین می کنه سایز و ساختار رکورد در فایل موجود به چه شکل هست.
الان هم می خوام یه ساختار جدید بنویسم که این مسئله رو حل کنه، حالا سوال کلی من اینه که کسی جایی چیزی دیده که چطور میشه این مشکل رو حل کرد یا چیزی به ذهنش میرسه؟ چون می خوام اگه چیزی موجوده دوباره کاری نکنم و همینطور از نظرات اساتید استفاده کنم تا قبل از دست به کار شدن به راه حل جامعتری برسم.

tdkhakpur
سه شنبه 06 مهر 1389, 23:18 عصر
هدر قراردادم ولی نه سایز هر رکورد، بلکه ورژن نسخه ای که فایل رو ساخته که خودش تعیین می کنه سایز و ساختار رکورد در فایل موجود به چه شکل هست.

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