Как сохранить порядок записей в таблице базы данных - PullRequest
9 голосов
/ 06 ноября 2010

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

Моя проблема в том, что я хочу контролировать порядок пунктов меню. У меня может быть поле с именем order, но каждый раз, когда у меня появляется новая ссылка в меню, мне нужно будет вставить порядок и изменить все записи с более высоким порядком на + 1.

Например, допустим, я хочу ссылки (в этом порядке):

Home  
About  
Products  
Shopping  

я мог бы иметь таблицу с именем MenuLinks и иметь столбцы: Имя, Заказ

мои данные будут выглядеть так:

Name      Order  
Home      1  
About     2  
Products  3  
Shopping  4  

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

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

Ответы [ 3 ]

6 голосов
/ 01 февраля 2013

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

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

ID Name      NExT  
 1 Home      2  
 2 About     3  
 3 Products  4 
 4 Shopping  NULL

Добавление и удаление строк будет похоже на вставку и удаление связанного списка.

Обновление: Измененная таблица

ID Name       NExT  
 1 Home       5  
 2 About      3  
 3 Products   4 
 4 Shopping   NULL
 5 Contact us 2

Порядок будет 1> 5> 2> 3> 4, как определено в следующем столбце.Вы также можете использовать предыдущий столбец, который сделает его похожим на двусвязный список.

5 голосов
/ 06 ноября 2010

Без ORDER BY вы не можете гарантировать порядок данных - как правило, без ORDER BY он будет основан на порядке вставки.

К сожалению, не существует соглашения, которое хорошо работает для пользователянастраиваемый порядок сортировки.
Можно обойтись без использования аналитических / оконных / ранжирующих функций, таких как ROW_NUMBER, но это зависит от поддержки данных и базы данных (MySQL не поддерживает аналитические функции, Oracle 9i + / PostgreSQL 8.4 + / SQL Server 2005+делать).Но аналитические функции не помогают, если вы хотите, чтобы запись, начинающаяся с «B», появлялась до «A» /etc.

Вы можете использовать два оператора для вставки одной записи:

UPDATE YOUR_TABLE
   SET sort_order = sort_order + 1
 WHERE sort_order >= 2

INSERT INTO YOUR_TABLE
  (value, sort_order)
VALUES('new value', 2)

... или удалите существующие записи и заново вставьте список в новый порядок.

3 голосов
/ 11 мая 2015

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

Name    Number
Home     5
About    10
Products 15
shopping 20

строки с меньшим номером находятся в начале списка, а строка с наибольшим номером будет последним элементом вашего списка, теперь вот трюк, если вы хотите изменить порядок Продукты введите и вставьте его между Home и About Все, что вам нужно сделать, это изменить поле Number вашего Product наравно числу между Home и About Number
Home number равно 5, а число About равно 10, поэтому числополе Product будет (5 + 10) / 2 = 7,5

Name    Number
Home     5
About    10
Products 7.5
shopping 20

, и теперь вы можете отсортировать окончательный список на основе поля Number

...