2010-11-06 4 views
8

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

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

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

 
Home 
About 
Products 
Shopping 

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

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

 
Name  Order 
Home  1 
About  2 
Products 3 
Shopping 4 

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

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

ответ

6

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

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

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

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

Обновление: Modified таблица

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

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

+0

проблема здесь в том, что она не решает проблему. для внесения одного изменения требуется, чтобы вы обновили все записи> эту строку – leora

+2

Ни одно изменение не требует обновления всех строк. Если вы добавите «Связаться с нами после дома», таблица, как показано на рисунке. Обновлен ответ. –

+0

Это похоже на обновление связанного списка. –

5

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

К сожалению, нет никакого соглашения, которое хорошо подходит для пользовательского порядка сортировки.
Можно было бы избежать использования аналитических/оконных/ранговых функций, таких как ROW_NUMBER, но это зависит от поддержки данных и базы данных (MySQL не поддерживает аналитические функции, Oracle 9i +/PostgreSQL 8.4 +/SQL Server 2005+ do). Но аналитические функции не помогают, если вы хотите, чтобы запись, начинающаяся с «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) 

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

2

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

Name Number 
Home  5 
About 10 
Products 15 
shopping 20 

строки с меньшим числом находятся в begginnig списка и строки с наибольшим числом будет последним пунктом в списке теперь вот трюк, если вы хотите изменить порядок Продукты строки и вставить его между Главная и О все, что вам нужно сделать, это изменить поле номер вашего продукта быть равно числу между Главная и О Номер
Главная номер 5 и О число 10, так что номер поля продукта будет (5 + 10)/2 = 7,5

Name Number 
Home  5 
About 10 
Products 7.5 
shopping 20 

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

Смежные вопросы