Дизайн базы данных для отслеживания изменений - с Hibernate - PullRequest
2 голосов
/ 07 марта 2012

Привет, Все, у меня проблемы с дизайном базы данных.Как вы можете видеть из моего текущего дизайна, регистрация может иметь несколько записей EmployerRegistration, которые могут иметь несколько записей ClientRegistration.Это довольно просто отсюда.Каждый год пользователю необходимо создавать новую регистрацию.

К сожалению, мне необходимо отслеживать изменения / поправки.Могут быть внесены изменения в информацию о регистрации (имя, адрес и т. Д.) Или информацию о регистрации клиента (удалить / добавить клиента или удалить / добавить работодателя).

Я пробовал несколько разных конструкций, но до сих порничто не кажется "правильным".Отслеживание изменений в таблице регистрации легко, так как это влияет на все таблицы выше.Все идентификаторы обновлены.Это изменения в таблице ClientRegistration, которые заставляют меня зацикливаться.Как вы видите, у меня есть колонка версий, которую я пробовал, но она мне не сильно помогает.С Hibernate кажется, что для каждой измененной регистрации клиента нужен свой уникальный объект регистрации, но создание совершенно новой регистрации для любых изменений регистрации клиента не кажется правильным / эффективным.

Я боролся с этим примернонеделю, поэтому любая помощь будет принята с благодарностью.Спасибо!

enter image description here

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Вы проверили Hibernate Envers ?Это плагин автоматического управления версиями для Hibernate.Делает отслеживание истории изменений объекта очень легко.Он настроен AOP-способом, поэтому вы можете просто аннотировать объект, который вы хотите проверить, и позволить Envers обрабатывать детали:

@Entity
@Audited
public class Person {
    @Id
    @GeneratedValue
    private int id;

    private String name;

    private String surname;

    @ManyToOne
    private Address address;
    ...
}
1 голос
/ 07 марта 2012

Вы можете использовать Envers, который теперь входит в состав hibernate-core. Проверьте документы

0 голосов
/ 07 марта 2012

Сталкивались ли вы с концепцией временного моделирования данных? Вы могли бы хотеть Google для этого. Одним из очень популярных методов временного моделирования является логика «Эффективная дата», широко используемая в Peoplesoft. Вкратце, это выглядит так:

Каждая таблица в системе будет иметь такой шаблон проектирования:

    Table{
       Primary_key,
       effdt,
       effseq,
       other data,
       modified_ts
    };

Несколько версий записи «складываются» с использованием первичного ключа, effdt и effseq. Effdt хранит только дату, а не дату и время. effseq (int) используется для хранения нескольких изменений в один и тот же день. Измененный_ts хранит отметку даты изменения данных.

данные в таблице будут выглядеть так:

PrimaryKey1   2012-01-01  1  MyData1  MyData2
PrimaryKey1   2012-02-01  1  MyData1  Change1
PrimaryKey1   2012-02-01  2  Change2  Change1

Чтобы получить последние данные из любой таблицы, вы должны использовать такой запрос:

select * from MyTable A
where effdt = (select max(effdt) from MyTable where PrimaryKey = A.PrimaryKey)
and effseq = (select max(effseq) from MyTable where PrimaryKey = A.PrimaryKey 
                                                           and Effdt=A.EFfdt)

Это поможет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...