2013-12-14 1 views
0

У меня есть данные о родстве, которые пользователи должны определить «официальный» заказ, а не в алфавитном порядке по имени, по дате, созданной/опубликованной, по значению (например, зарплата, продажи или ранг).Управление заказами сортировки - не выполняется с помощью 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 является последней. Кажется, что создание столбцов в базе данных для реализации структур данных - это не очень хорошая идея, нет?


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

Любые новые идеи или рекомендации?

ответ

1

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

Первоначально присваивать нулевые номера в порядке сортировки: '001', '002'. , ,

Затем, если вы хотите добавить что-то между двумя значениями, просто добавьте 5 к значению. Сортировка для строк ставит '001', '0015' и '002' в том порядке, в котором вы хотите.

Конечно, вы можете сделать это более эффективным, проверив последнюю цифру. Если это '5', и вам нужно что-то большее, поставьте 7 или 8. Вы также можете сделать это более эффективным, расширив набор символов, включив буквы, а также цифры.