Как изменить исторические данные в таблице истории - PullRequest
0 голосов
/ 09 октября 2018

У меня есть таблица с древовидной структурой и датами для отслеживания изменений (дочерний, родительский, корень, срок_действия, дата_экспира, статус).Но теперь я хочу изменить исторические данные также.Например, таблица теперь имеет эти 3 записи,

1 c1    p1    r1    2018-09-11    2018-09-13    NA 
2 c1    p2    r2    2018-09-13    2018-09-15    NA 
3 c1    p3    r3    2018-09-15    9999-12-01    A 

Теперь мы хотим изменить родительский элемент «c1» на «p4» с корнем «r4» между «2018-09-12» и «2018-09-14».так что стол будет таким,

1 c1    p1    r1    2018-09-11    2018-09-12    NA 
2 c1    p4    r4    2018-09-12    2018-09-14    NA 
3 c1    p2    r2    2018-09-14    2018-09-15    NA 
4 c1    p3    r3    2018-09-15    9999-12-01    A 

Что касается производительности, что является лучшим дизайном для этой проблемы?

1 Ответ

0 голосов
/ 09 октября 2018

Я не хочу уточнять, правильна ли ваша модель данных, просто ответьте на вопрос.Вам нужно два update с датами, один insert и, необязательно, один delete, чтобы удалить строки, если новый период охватывает весь предыдущий период (ы).

declare
  r data%rowtype; 
begin
  r.child  := 'c1';
  r.parent := 'p4';
  r.root   := 'r4';
  r.effective_date := date '2018-09-12';
  r.expire_date := date '2018-09-14';
  r.status := 'NA';

  delete from data 
    where r.effective_date <= effective_date and expire_date <= r.expire_date;
  update data set expire_date = r.effective_date 
    where expire_date between r.effective_date and r.expire_date;
  update data set effective_date = r.expire_date 
    where effective_date between r.effective_date and r.expire_date;
  insert into data values r;
end;

Таблица, которую я использовал дляtest:

create table data(child, parent, root, effective_date, expire_date, status) as (
    select 'c1', 'p1', 'r1', date '2018-09-11', date '2018-09-13', 'NA' from dual union all 
    select 'c1', 'p2', 'r2', date '2018-09-13', date '2018-09-15', 'NA' from dual union all 
    select 'c1', 'p3', 'r3', date '2018-09-15', date '9999-12-01', 'A'  from dual );

Это простые операции, если у вас есть индексы по датам, они должны быть быстрыми.Вы можете объединить два обновления в одну статистику, используя or и case when, но я сомневаюсь, что это крайне важно.

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