ORM или что-то для эффективной обработки таблиц SQL со столбцом заказа - PullRequest
6 голосов
/ 30 января 2009

Я получил приложение Java, использующее таблицы SQL, которые содержат упорядоченный список объектов, упорядоченных по столбец заказа. Я хотел бы добавить / удалить вещи в / из середины из списка. Теперь мне интересно, есть ли какой-то постоянный фреймворк / orm / you-name-it может предоставить такую ​​функциональность с пакетным обновлением заказа колонка.

В базовом случае Hibernate (и, вероятно, другие также) обеспечивают это функциональность. Проблема в том, что объекты обрабатываются по одному, что становится проблема, когда список достаточно велик. Альтернативное решение было бы выполните это с помощью пакетного обновления SQL, например, как показано ниже:

UPDATE table SET order_col = order_col + 1 WHERE order_col > 47
INSERT TO table VALUES ('new_id', 'new_description, ..., 47)

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

Теперь я понимаю, что это вид пакетных обновлений не подходит так хорошо, когда мы думаем об объектах и ​​их контроль версий, грязная проверка и т. д. Я бы по-прежнему спрашивал, есть ли у кого-нибудь хорошие идеи или настойчивость Framework / ORM / you-name-it предоставит некоторую помощь. Конечно, я могу сделать это с пользовательским SQL / HQL / ... но мне было интересно если бы уже было какое-то решение (я думаю, что кто-то другой мог бы сделали что-то подобное раньше и даже поместили под открытым исходным кодом). Также приветствуются другие хорошие идеи, связанные с проблемой =)

Ответы [ 2 ]

5 голосов
/ 30 января 2009

Мой совет - сделать две вещи:

  1. Выберите очень большие приращения между вашими предметами, скажем, миллион. Таким образом, вы можете переместить элемент на 8 000 000 до 7 000 000, изменив только его на 6 500 000; и
  2. Время от времени переупорядочивайте элементы как пакетное задание.

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

Менять сразу целую кучу вещей просто грязно и требовать неприятностей.

4 голосов
/ 30 января 2009

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

Прежде всего, умножьте sortorder на 1000

UPDATE testtable SET sortorder = sortorder * 1000

Теперь вставьте и вставьте подходящие значения sortorder, чтобы новые записи были в нужном месте.

Теперь выполните обновление таблицы и обновите значения, используя функцию ROW_NUMBER

UPDATE testtable
SET sortorder = subq.newsortorder
FROM
  (
  SELECT
    ID as innerID,
    ROW_NUMBER() OVER(ORDER BY sortorder ASC) as newsortorder
  FROM testtable
  ) subq
WHERE subq.innerID = ID

Идентификатор выбран как innerID, поскольку обновленная таблица не может быть псевдонимом, и в противном случае столбец идентификатора может оказаться неоднозначным.

Это обновление sortorder с номером строки при сортировке по sortorder.

...