Предположим, что у класса есть 5 известных свойств - дата, время, тема, контур, местоположение. Когда я смотрю на свое расписание, меня больше всего интересует самая последняя (то есть текущая / точная) версия этих свойств. Также было бы полезно узнать, что изменилось. (В качестве примечания: если дата, время или место изменились, я также ожидал, что мне будет отправлено электронное письмо / смс с уведомлением, если я не проверю обновленное расписание: -))
Я бы предположил, что 'diff' выполняется во время изменения графика. Итак, когда создается версия 2 класса, запишите, какие значения изменились, и сохраните это в двух полях «changelog» объекта версии 2 (уже должна быть одна родительская таблица, расположенная поверх всех ваших таблиц - используйте эту! ). Одним из полей журнала изменений является «читаемый человеком текст», например «Дата изменена с понедельника 1 мая на вторник 2 мая, время изменено с 10:00 до 10:30». Второе поле журнала изменений представляет собой разделенный список измененных полей, например, «дата, время». Для этого перед сохранением необходимо выполнить циклическое переключение значений, представленных пользователем, сравнить их с текущими значениями базы данных и объединить 2 строки, одну для чтения человеком, одну список имен полей. Затем обновите данные и установите свои сцепленные строки в качестве значений 'changelog'.
При отображении расписания загружайте текущую версию по умолчанию. Переберите поля в списке полей журнала изменений и аннотируйте отображение, чтобы показать, что значение изменилось (* или выделение и т. Д.). Затем на отдельной панели отобразится удобочитаемый журнал изменений.
Если в расписание вносятся изменения более одного раза, вы, вероятно, захотите объединить журналы изменений между версиями 1 и 2 и 2 и 3. Скажите, что в версии 3 изменился только план курса - если это был единственный журнал изменений, который вы имели, когда при отображении расписания изменения даты и времени отображаться не будут.
Обратите внимание, что этот денормализованный подход не будет подходить для анализа - например, для определения, в каком конкретном месте всегда есть классы, из которых оно изменилось, - но вы можете расширить его, используя модель E-A-V для хранения журнала изменений.