Относительно "ведения истории", посмотрите на это видео: https://www.youtube.com/watch?v=EtgYbX0Roxg Возможно, Flashback Data Archive будет лучшим вариантом. Или, возможно, временная валидность может помочь упростить ваши запросы с текущей моделью.
Что касается "обновления каждой строки", я думаю, что вы имеете в виду только строки, у которых "последовательность отображения" выше, чем у только что переупорядоченного, верно?
Один шаблон проектирования, который вы могли бы Рассматривается переход на одно обновление, скажем, после нажатия кнопки сохранения, а не использование события удаления для каждого изменения. Для этого может потребоваться обновление многих строк, но, по крайней мере, вы будете делать это реже.
Если вы хотите продолжить экономить на капле и хотите минимизировать работу в базе данных, вы можете использовать столбец «display_previous_id» вместо столбца «display_sequence». Идея состоит в том, что каждый ряд будет указывать на ряд перед ним. Вы можете использовать оператор Oracle CONNECT BY, чтобы вернуть данные в правильном порядке.
С этим изменением обновление столбца данной строки всегда потребует трех обновлений. Во-первых, перемещаемая строка должна указывать на своего нового родителя. Во-вторых, строка, ранее указывающая на родителя, должна указывать на новую строку. Наконец, строка, указывающая на перемещаемую строку, должна указывать на предыдущего родителя перемещаемой строки. В то время как более эффективный, компромисс в том, что вы должны быть очень осторожны, когда дело доходит до целостности данных.
Вот пример:
create table colors (
id number
constraint colors_id_pk primary key,
name varchar2(255) not null,
previous_id number
constraint colors_previous_id_fk
references colors (id)
);
insert into colors (id, name, previous_id) values (1, 'Red', null);
insert into colors (id, name, previous_id) values (2, 'Orange', 1);
insert into colors (id, name, previous_id) values (3, 'Yellow', 2);
insert into colors (id, name, previous_id) values (4, 'Green', 3);
insert into colors (id, name, previous_id) values (5, 'Blue', 4);
insert into colors (id, name, previous_id) values (6, 'Indigo', 5);
insert into colors (id, name, previous_id) values (7, 'Violet', 6);
Вот как вы получите значения в правильном порядке:
select level, name
from colors
connect by prior id = previous_id
start with previous_id is null
order by level;
Что возвращает:
1 Red
2 Orange
3 Yellow
4 Green
5 Blue
6 Indigo
7 Violet
Представьте, что кто-то тянет Инди go (6) между оранжевым (2) и желтым (3). Инди go должен будет указать свой предыдущий_идентификатор на оранжевый, так как это родитель. Желтый, который ранее указывал на оранжевый, должен был указывать на инди go. Наконец, Violet, который ранее указывал на Indi go, должен будет указывать на Blue.
Вы хотели бы сделать это как одну единицу работы, и вы бы хотели сериализовать такие обновления. Чтобы сделать это, вы должны использовать хранимую процедуру PL / SQL, например, такую:
create or replace procedure move_color(
p_color_id in colors.id%type,
p_new_previous_id in colors.id%type
)
is
-- There is only one record without a parent (the first color
-- to display). This cursor will lock that row to serialize
-- update operations on the table through this procedure.
cursor lock_cur
is
select 1
from colors
where previous_id is null
for update;
cursor color_cur
is
select *
from colors
where id = move_color.p_color_id
for update;
l_color_rec color_cur%rowtype;
begin
open lock_cur;
open color_cur;
fetch color_cur into l_color_rec;
update colors
set previous_id = l_color_rec.previous_id
where previous_id = l_color_rec.id;
if move_color.p_new_previous_id is null
then
update colors
set previous_id = l_color_rec.id
where previous_id is null;
else
update colors
set previous_id = l_color_rec.id
where previous_id = move_color.p_new_previous_id;
end if;
update colors
set previous_id = move_color.p_new_previous_id
where current of color_cur;
close color_cur;
close lock_cur;
end;
. Вы запустите это, чтобы внести изменения:
begin
move_color(6, 2);
end;
И если вы повторите запрос, вы увидите это:
1 Red
2 Orange
3 Indigo
4 Yellow
5 Green
6 Blue
7 Violet
Теперь, независимо от того, сколько у вас строк, необходимо обновить только три. Как видите, модель данных немного сложнее, поэтому вам придется определить, оправдывают ли цели средства для вашего приложения.