Шаблоны базы данных: каков стандартный способ сортировки таблицы вручную? - PullRequest
3 голосов
/ 24 декабря 2011

У меня есть (Postgres) таблица БД, в которую я хотел бы добавить поле 'sort' для ручного ввода.В интерфейсе приложения у меня будет поле перетаскивания, чтобы пользователи могли вручную пересортировать записи, которые затем должны опубликовать запрос AJAX, который пересортирует записи в БД, и мне просто интереснокак организовать это в базе данных.

Например, наиболее очевидный вариант, который я могу придумать, - это увеличить целое число 'sort' для каждой записи со значением сортировки> = недавно отсортированная опция, но этобудет чрезмерно (и я полагаю, излишне) тяжелым для базы данных, если эти списки превысят несколько элементов.

Другой вариант - сделать столбец 'sort' BigDecimal и сделать его значением

SortValue[A] = SortValue[B] + (SortValue[C] - SortValue[B])/2

Где A - это поле, которое я пересортирую, B - это поле непосредственно над ним, а C - поле под ним, но это выглядит очень грязным решением, не говоря уже о возможном ограничении десятичным знакомпределы.

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

Cheers ...

Ответы [ 2 ]

5 голосов
/ 24 декабря 2011

Предположим, у вас есть такие данные:

id | pos
---+----
 8 |  1
 3 |  2
 6 |  3
 7 |  4
 2 |  5
 1 |  6

, и вы хотите переместить 2 из положения 5 в положение 3.

Все, что вам нужно сделать, это:

update t set pos = pos + 1 where pos >= 3 and pos < 5

Чтобы сделать отверстие:

id | pos
---+----
 8 |  1
 3 |  2
   |
 6 |  4
 7 |  5
 2 |  5
 1 |  6

А затем это:

update t set pos = 3 where id = 2

, чтобы заполнить отверстие:

id | pos
---+----
 8 |  1
 3 |  2
 2 |  3
 6 |  4
 7 |  5
 1 |  6

Вы бы,конечно, все эти обновления должны быть включены в транзакцию.

Если у вас есть ограничение pos во избежание дублирования (хорошая идея), тогда вы можете использовать pos = 0 в качестве временного значения:

update t set pos = 0 where id = 2;
update t set pos = post + 1 where pos >= 3 and pos < 5;
update t set pos = 3 where id = 2;

В качестве альтернативы, если вы используете последнюю версию PostgreSQL (AFAIK 9.0+), вы можете отложить свое уникальное ограничение до конца транзакции и не беспокоиться о временном дублировании.

Другие случаи аналогичны и оставлены в качестве упражнения.

0 голосов
/ 24 декабря 2011

Вы подразумеваете, что нет никакого атрибута, который пользователи используют для сортировки данных. Если бы это было так, то я бы подумал, что вам не придется беспокоиться о размере списка и использовать это большое десятичное число или просто целое число, разнесенное на некоторое значение, которое корректируется - «нормализуется» - обратно к соответствующему значению необходимо (когда пробелы заняты).

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