PDA

View Full Version : حرفه ای: ذخیره تاریخچه تغییرات ساختار درختی



رامین مرادی
چهارشنبه 23 خرداد 1397, 10:31 صبح
سلام وقت بخیر دوستان .
من یه جدول دارم که به وسیله اون ساختار درختی رو پیاده سازی کردم.فیلدهای اون جدول به این صورته : کد - کد والد-عنوان
که وقتی فرزندی از یه گره بوجود میاد کد والد دلالت بر کد پدرش داره. با این روش تا n سطح میتونم گره رو ایجاد و مدیریت کنم.
یه جدول دیگه هم دارم که یه سری اطلاعات از هر گره یا تعدادی از گره ها رو نگه میدارم و با کد ساختار جدول درختی ارتباط یک به چند داره

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

148373

parvizwpf
چهارشنبه 23 خرداد 1397, 13:31 عصر
یک جدول مشابه همین کنارش بگیرید به علاوه فیلد نوع نغییر مثلا بگه حذف بوده ادیت بوده یا ....

رامین مرادی
چهارشنبه 23 خرداد 1397, 14:18 عصر
یک جدول مشابه همین کنارش بگیرید به علاوه فیلد نوع نغییر مثلا بگه حذف بوده ادیت بوده یا ....
دوتا جدول دارم. یکی ساختار درختمه. یکی هم اون جدول کناری که گذاشتم.

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

mr.sirwan
چهارشنبه 23 خرداد 1397, 15:33 عصر
شما میتونی یه فیلد مثلا HasEdited به ستونات اضافه کنی و یه جدول واسه مقادیر قبل از تغییرات بسازی. هر موقع تغییری برای یه رکورد انجام گرفت، فیلد hasEdited مربوط به اون رکورد رو برابر true کن و مقدار قبلی رو داخل جدول تغییرات درج کن، حالا هرموقع خواستی نمودار رو رسم کنی، واسه هر رکورد فیلد hasedited رو چک کن، اگه true بود بره توی جدول تغییرات مقدار اولیه رو بخونه و اون رو به جای مقدار جدید توی نمودار نشون بده
من اینو بصورت کاملا ساده گفتم، شما میتونی بسته به موقعیت و نیازت همین راهکار رو تعمیم بدی

رامین مرادی
پنج شنبه 24 خرداد 1397, 08:03 صبح
شما میتونی یه فیلد مثلا HasEdited به ستونات اضافه کنی و یه جدول واسه مقادیر قبل از تغییرات بسازی. هر موقع تغییری برای یه رکورد انجام گرفت، فیلد hasEdited مربوط به اون رکورد رو برابر true کن و مقدار قبلی رو داخل جدول تغییرات درج کن، حالا هرموقع خواستی نمودار رو رسم کنی، واسه هر رکورد فیلد hasedited رو چک کن، اگه true بود بره توی جدول تغییرات مقدار اولیه رو بخونه و اون رو به جای مقدار جدید توی نمودار نشون بده
من اینو بصورت کاملا ساده گفتم، شما میتونی بسته به موقعیت و نیازت همین راهکار رو تعمیم بدی

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

Mahmoud Zaad
پنج شنبه 24 خرداد 1397, 09:03 صبح
سلام
چیزی که به نظر من می رسه و البته تست نشده، شما در این مورد کلاً نباید رکوردی رو حذف یا ویرایش کنید. یعنی اولاً یه فیلد داشته باشید که نشان دهنده وضعیت رکورد باشه به این صورت که 0 برای رکورد فعال، 1 برای رکورد ویرایش شده و 2 برای رکورد حذف شده. حالا هر تغییر یا حذفی که اتفاق افتاد از یک طرف فیلد وضعیت در رکورد مورد نظر رو ویرایش یعنی اون فیلد وضعیت رو به 1 یا 2 تغییر بدید. از طرف دیگه اگر رکورد ویرایش بود یک رکورد جدید با اطلاعات جدید ثبت کنید و فیلد وضعیتش رو 0 قرار بدید. تا اینجای کار اگر ما رکوردهایی که فیلد وضعیتشون 0 هست رو سلکت کنیم، درخت فعلی یعنی آخرین تغییرات کاربر به دست میاید و سابقه تغییرات رو هم داریم.
برای حالتی که میخواهید تغییرات قبلی رو ببینید 2 حالت وجود داره یکی اینکه مثل حالت Undo , Redo باشه و با هر بار Back زدن، یک تغییر قبلی نمایش داده بشه. که در اینجا میشه با استفاده از id رکورد تمام رکوردهایی که idشون کمتر و مساوی با رکورد فعلی هست و فیلد وضعیتشون مساوی 0 هست(به جز رکورد جاری) رو نمایش داد و همینطور برای رکوردهای کمتر.
ولی یه حالت هم وجود داره که کاربر امروز یه درختی رو ذخیره کنه بعد فردا چند رکورد رو ویرایش کنه و چند تا رو حذف کنه و کل این تغییرات رو بعنوان یک درخت جدید ذخیره کنه. یعنی شما وقتی Undo میزنید یکی یکی تغییرات رو نمایش نده و یکدفعه برگرده به قبل از اون 10 تغییر. اینجا میشه از تاریخ کمک گرفت یا یک فیلد جدید. به اینصورت که یک دکمه ذخیره نهایی باشه و وقتی اولین بار اطلاعات ذخیره میشه همه رکوردها مقدارشون 1 باشه. در سری های بعدی تغییرات و حذف و اضافه ها رو پیدا کنیم و مقدار این فیلد رو برای اونها 2 بگذاریم و ...

البته میگم تست نشده ولی امتحان کنید ضرر نداره!

mr.sirwan
پنج شنبه 24 خرداد 1397, 13:55 عصر
خب برا حذف گره چه پیشنهادی دارید؟
یا مثلا فیلد یا فیلدهای در طول زمان ده بار تغییر داشته باشه چی؟
من باید بسته به تاریخ تغییر هر مورد بتونم نمایش بدم کل جدولو(یعنی امروز که تغییری رخ داد بتونم به کاربر نشون بدم که امروز قبل تغغیر ساختارمون اینشکلی بود)

در مورد تعداد دفعات تغییر، شما میتونی به همون جدول تغییرات، یه ستون تاریخ هم اضافه کنی که تاریخ ویرایش اون رکورد رو نشون میده، موقع رسم نمودار هم بسته به تاریخی که از کاربر دریافت کردی میری توی جدول تغییرات، اون ویرایشی که مربوط به تاریخ موردنظره رو واکشی میکنی

درمورد حذف بیشتر توضیح بدین، الان توی اون ساختار درختی، قراره گره ای حذف بشه؟ یا عمل ذخیره تغییرات و حذف فقط مختص جدول دومی هست؟

رامین مرادی
پنج شنبه 24 خرداد 1397, 14:06 عصر
سلام
چیزی که به نظر من می رسه و البته تست نشده، شما در این مورد کلاً نباید رکوردی رو حذف یا ویرایش کنید. یعنی اولاً یه فیلد داشته باشید که نشان دهنده وضعیت رکورد باشه به این صورت که 0 برای رکورد فعال، 1 برای رکورد ویرایش شده و 2 برای رکورد حذف شده. حالا هر تغییر یا حذفی که اتفاق افتاد از یک طرف فیلد وضعیت در رکورد مورد نظر رو ویرایش یعنی اون فیلد وضعیت رو به 1 یا 2 تغییر بدید. از طرف دیگه اگر رکورد ویرایش بود یک رکورد جدید با اطلاعات جدید ثبت کنید و فیلد وضعیتش رو 0 قرار بدید. تا اینجای کار اگر ما رکوردهایی که فیلد وضعیتشون 0 هست رو سلکت کنیم، درخت فعلی یعنی آخرین تغییرات کاربر به دست میاید و سابقه تغییرات رو هم داریم.
برای حالتی که میخواهید تغییرات قبلی رو ببینید 2 حالت وجود داره یکی اینکه مثل حالت Undo , Redo باشه و با هر بار Back زدن، یک تغییر قبلی نمایش داده بشه. که در اینجا میشه با استفاده از id رکورد تمام رکوردهایی که idشون کمتر و مساوی با رکورد فعلی هست و فیلد وضعیتشون مساوی 0 هست(به جز رکورد جاری) رو نمایش داد و همینطور برای رکوردهای کمتر.
ولی یه حالت هم وجود داره که کاربر امروز یه درختی رو ذخیره کنه بعد فردا چند رکورد رو ویرایش کنه و چند تا رو حذف کنه و کل این تغییرات رو بعنوان یک درخت جدید ذخیره کنه. یعنی شما وقتی Undo میزنید یکی یکی تغییرات رو نمایش نده و یکدفعه برگرده به قبل از اون 10 تغییر. اینجا میشه از تاریخ کمک گرفت یا یک فیلد جدید. به اینصورت که یک دکمه ذخیره نهایی باشه و وقتی اولین بار اطلاعات ذخیره میشه همه رکوردها مقدارشون 1 باشه. در سری های بعدی تغییرات و حذف و اضافه ها رو پیدا کنیم و مقدار این فیلد رو برای اونها 2 بگذاریم و ...

البته میگم تست نشده ولی امتحان کنید ضرر نداره!

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

Mahmoud Zaad
پنج شنبه 24 خرداد 1397, 15:27 عصر
درسته با اتونامبر به مشکل میخوریم.