Oracle и React: как сохранить порядок при следующей загрузке страницы - PullRequest
0 голосов
/ 17 марта 2020

Я действительно новичок во всем этом, но суть в том, что у меня есть таблица перетаскивания, которую я создал с помощью реакции.

Значения взяты из таблицы, которую я создал в oracle (200 строк около 23 столбцов).

В настоящее время у меня есть идентификатор, который я добавил, когда делал ETL, чтобы держать вещи в правильном порядке. Моя цель - обновить таблицу oracle, когда я перетаскиваю элемент, чтобы он мог сохранять порядок.

Я действительно не вижу способа сделать это без обновления каждой строки. Я храню историю, поэтому я не обновляю строки, я вставляю новые строки.

По сути, мне нужно что-то, что я могу отсортировать при извлечении таблицы, чтобы сохранить точный порядок последнего перетаскивания. и пропустите.

Любые предложения будут полезны, единственное, о чем я могу подумать, это сопоставить новый индекс каждому, а затем захватить ключ с новым индексом и обновить каждую строку новым индексом.

Есть ли другой, более эффективный подход, который я могу рассмотреть. Имейте в виду, что я новичок, поэтому мне придется больше всего исследовать, как вы говорите, больше всего вероятности, поэтому, если есть маленький шаг, лучше сообщить мне, что мне, вероятно, стоит разобраться в этом.

Edit: я должен упомянуть, что я использую Node.js и oracledb, чтобы получить информацию из наших oracle таблиц версии 12.

Я получаю данные как json, но сама таблица не сохранить json, который не выходит за рамки, у меня просто стандартные строки и столбцы. По правде говоря, я попытался сохранить как json через эту настройку и просто сдался и перешел к стандартным типам данных.

1 Ответ

0 голосов
/ 19 марта 2020

Относительно "ведения истории", посмотрите на это видео: 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

Теперь, независимо от того, сколько у вас строк, необходимо обновить только три. Как видите, модель данных немного сложнее, поэтому вам придется определить, оправдывают ли цели средства для вашего приложения.

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