Как вставить строку между двумя строками и дать ей приоритет в базе данных? - PullRequest
3 голосов
/ 30 августа 2009

У меня есть стек сообщений в таблице базы данных. Я хочу отправить эти сообщения по приоритету, поэтому я добавил столбец «Приоритет» в таблицу «Сообщения».

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

Должен ли я обновить приоритет всех сообщений в этом сообщении.

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

Ответы [ 5 ]

5 голосов
/ 30 августа 2009

Используйте float столбец для приоритета, а не int .

Затем, чтобы вставить сообщение между двумя другими, назначьте среднее значение Приоритета двух сообщений как Приоритет нового сообщения. (Например, чтобы вставить промежуточное сообщение между сообщениями с приоритетом 2 и 3, присвойте ему приоритет 2.5).

Делая это, вам не нужно обновлять приоритет других сообщений, и вы можете продолжать усреднять / вставлять между ними и т. Д., Пока не столкнетесь с десятичными пределами точности с плавающей точкой (что займет некоторое время , особенно если необработанные значения Приоритета имеют тенденцию быть маленькими). ​​

Или добавьте еще один столбец после Приоритета в ORDER BY. В простейшем случае используйте битовый столбец с именем «ShowAfter» со значением по умолчанию, равным 0. Когда вы вставляете сообщение «cram», присвойте ему тот же приоритет, что и сообщение, которое вы хотите увидеть после, но значение [ShowAfter], равное 1.

2 голосов
/ 30 августа 2009

Просто дикая идея, не проверяйте это на производительность, но структура списка ссылок должна соответствовать желаемому здесь. Максимально вам нужно всего лишь изменить 3 записи

Узнайте, где вы хотите поставить новую запись, обратите внимание, какая запись идет до нее и какая запись идет после нее. Новая запись, установить предыдущую запись и следующую запись. связать предыдущую и следующую записи соответственно новой записи.

Вы делаете это, добавляя 2 поля (следующее и предыдущее) в схему.

1 голос
/ 30 августа 2009

Просто включите столбец отметки времени со значением по умолчанию getdate(). Таким образом, при отправке сообщений, order by priority asc, createtime desc.

Если вы не всегда хотите делать «первым пришел-первым вышел» (LIFO), вы можете сделать order by priority, senddate, а затем установить senddate на 1/1/1900 для всего, что вы хотите вытолкнуть первым.

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

0 голосов
/ 30 августа 2009

Похоже на идею @Джимми Чандры, но используйте один столбец ссылок.

Итак, у вас могут быть следующие столбцы:

ID | SortAfterID | OtherColumn1 | OtherColumn2

Теперь предположим, что у вас есть пять записей с идентификаторами от 1 до 5, и вы хотите, чтобы запись 5 была отсортирована между 2 и 3. Ваша таблица будет выглядеть примерно так:

ID | SortAfterID | OtherColumn1 | OtherColumn2
1  | NULL        | ...          | ...
2  | 1           | ...          | ...
3  | 5           | ...          | ...
4  | 3           | ...          | ...
5  | 2           | ...          | ...

Я бы установил ограничение, чтобы SortAfterID ссылался на идентификатор.

Если вы сейчас хотите вставить новую запись (ID = 6), которая идет между 1 и 2, вы бы:

  1. Вставить новую запись с ID = 6 и SortAfterID = 1.
  2. Обновить запись с ID = 2, чтобы SortAfterID = 6.

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

EDIT

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

0 голосов
/ 30 августа 2009

Интересно, может быть, вы могли бы использовать столбец идентификаторов в качестве первичного ключа, но использовать приращение, которое пропускает несколько значений?

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

Имеет смысл?

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