У меня есть данные о родстве, которые пользователи должны определить «официальный» заказ, а не в алфавитном порядке по имени, по дате, созданной/опубликованной, по значению (например, зарплата, продажи или ранг).Управление заказами сортировки - не выполняется с помощью SortOrder * 10^n или реализация со связанными списками
SortOrder * 1^п
Я полагаю, такие сортируемым объект должен был бы иметь столбец целое число SortOrder
, где меньшие значения означают ближе к первому элементу (SortOrder = 1
означает первый элемент).
Многие предложили автоматически назначать SortOrder = newId * 1000
(n = 3) при вставке новой записи. Позже вниз линию, мы бы вставить запись между двумя записями, и порядок сортировки вставленной пластинки должен быть установлен на
inserted.SortOrder = (previous.SortOrder + next.SortOrder)/2
Да, но сделать это достаточно много раз, вы будете бежать из «точности» - то, что порядок сортировки вы бы назначили вставленной записи, когда предыдущий. SortOrder = 3000 и next.SortOrder = 3001?
Увеличьте значение n, вы просто задержите проблему.
Связанный список Реализация
Некоторые предполагают, чтобы иметь NextRecordId
. Таким образом, у нас есть «след» записей. Вставка записи между двумя требует только два обновления -
previous.NextRecordId = inserted.Id
inserted.NextRecordId = next.Id
И следующие пункты next
не будут затронуты.
Это похоже на хорошее предложение, но есть проблемы.
Как вы извлекаете данные для отображения в правильном порядке? ORDER BY NextRecordId
(либо ASC
, либо DESC
) не будет работать. Для ORDER BY ASC
сначала будут выбраны записи, чей NextRecordId является самым маленьким. Это не тот порядок, который нам нужен.
Кажется, что нам нужно выполнить итерацию (в хранимой процедуре), и для каждой итерации потребуется SELECT WHERE [email protected]
, а затем поместите каждый результат в новую таблицу.
Как вы будете отслеживать, какая запись является первой - есть ли бит IsFirst
или иметь FirstChildRecordId
в родительской таблице? Можно сказать, что запись с NextRecordId = 0
является последней. Кажется, что создание столбцов в базе данных для реализации структур данных - это не очень хорошая идея, нет?
Итак, я застрял на этом, и я искал этот форум и онлайн - не могу найти подходящего решения. Кажется, что все они требуют своего рода пост-техобслуживание (пересадка, но как вы определяете, когда) или потенциально дорогостоящее вычисление (обновить порядок сортировки всех записей после индекса вставки) за сортировку «перемещение».
Любые новые идеи или рекомендации?