Как правильно хранить данные?

LiveKillers

Новичок
Как правильно хранить данные?

Ситуация следующая:

- есть несколько таблиц, из которых осуществляется выборка.
- результаты выводятся в таблицу, в которой каждая строка - ссылка.
- по ссылке выдаётся некая информация, которая снова берётся из нескольких таблиц.

[выборка параметров] -> [вывод основной таблицы] -> [вывод расширенной информации]

Иными словами, мы имеем некоторый набор уникальных id, по которым можно получить информацию.
Так вот, задача такова:
нужно сохранить весь этот набор id. Проблема в том, что их слишком много, порой доходит до 100 000 уникальных id.
Я храню их в виде массива в сессии в следующем виде:
порядковый номер => id
(1 => 20784, 2 => 101989, 3 => 2345, ...., 29000 => 34567)
Этим достигается возможность легко определить предыдущий id и следующий (то есть сделать элементарные ссылки "Назад" и "Вперёд", поскольку расширенная информация выдаётся в отдельном окне).

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

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


Ну и вопрос: Правильно ли я храню набор id, или есть другой более правильный или рациональный способ?
И второй вопрос: существует ли возможность по запросу типа
SELECT <fields_list> FROM <tables_list> WHERE <conditions> ORDER BY (field)
узнать предыдущий и следующие id не прибегая к полной выборке, если известен текущий id?

P/S Под id понимается число типа INT из поля с параметром auto_increment, поле является первичным ключом
 

Фанат

oncle terrible
Команда форума
Этот вопрос задают здесь ровно раз в неделю. Как на работу ходят прямо.
Вполне возможно, что предыдущий и следующий id можно получить из запроса, если его текст сохранить (запросы различаются в зависимости от параметров).
сохранять надо не текст запроса, а параметры.
Однако так как допускается произвольная сортировка данных (а не только прямая и обратная) то выяснить предыдущий и следующий id отдельными двумя запросами мне не представляется возможным.
Это еще почему?
выборка как только двух, и тем более, всех id занимает весьма продолжительное время.
с какой это стати выборка двух id занимает продолжительное время?
Ну и вопрос: Правильно ли я храню набор id, или есть другой более правильный или рациональный способ?
единого рационального способа не существует.
но обычно, когда люди сталкиваются с таким вопросом, уних не возниаает проблем с нахождением следующего/предыдущего
существует ли возможность по запросуузнать предыдущий и следующие id
подставляй поля из order by во where
 

LiveKillers

Новичок
В принципе, всё ясно.
Но только вот что:
Если записи сортируются, например, по текстовому полю, то id будут идти в разброс. И как узнать предыдущий и следующие id по запросу я не знаю.
Если SELECT <> FROM <> WHERE <> ORDER BY (textfield)
то как нужно подставить textfield во WHERE почему-то не понимаю.
 

Фанат

oncle terrible
Команда форума
обычно подставить.
что такое сортировка? Это когда БОЛЬШЕЕ идёт за МЕНЬШИМ.
а во where мы что делаем? сравниваем большее с меньшим!
 

LiveKillers

Новичок
Для сортировок по id это, конечно, так.
Там если сортируешь по id, то строгий порядок нам обеспечен, и мы можем узнать предыдущий id, узнав первый, что меньше текущего, а следующий - первый что больше текущего.
Это я знаю :)
Но когда сортируем по другому полю, то как здесь нужно сравнивать?
Там id идут не по принципу "больше-меньше", а самым различным образом. Если сортировать по текстовому полю, то как здесь узнать это самое "больше-меньше"?
Возможно, я не объяснил, что данные в главной таблице могут сортироваться разным образом, и в ссылках "Предыдущая" и "Следующая" запись необходимо сохранять этот порядок.
Если есть набор 12, 2309, 456, 9, 34354, 23434, 88 то и двигаемся мы по этому набору точно в таком порядке.
 

Фанат

oncle terrible
Команда форума
Там id идут не по принципу "больше-меньше",
при чем здесь id? у тебя что - оператор WHERE ограничен только одним полем? ты туда пожешь подставить только id?
Но когда сортируем по другому полю, то как здесь нужно сравнивать?
это поле и сравнивать! логично?
Если есть набор 12, 2309, 456, 9, 34354, 23434, 88 то и двигаемся мы по этому набору точно в таком порядке.
ну не сам же по себе этот набор берется? Не из воздуха?
он - результат сортировки по какому-то полю?
при которой поле с 2309 идет после поля с 12.
и какая проблема запросить запись с полем, которое менгьше текущего?
 

LiveKillers

Новичок
Ну надо же... до меня дошло.
Я определённо рад. Фанату спасибо.

Хотя, конечно здесь есть свои нюансы: значение текущего поля, по которому производится сортировка, может быть NULL, а следующее может быть как NULL, так и NOT NULL.
 

Фанат

oncle terrible
Команда форума
ну, поменять NULL на пустую строку - не проблема.
а если поля не уникальные, то добавить в сортировку и в условие еще одно поле
 
Сверху