Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Глупый, конечно, вопрос, но все же...

0 views
Skip to first unread message

Alex Gotlib

unread,
Dec 19, 2005, 3:06:50 PM12/19/05
to
Hail there All!

Subj.

MS SQL 2000. Простая табличка. Простой запрос.

SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy;

Облом. MS SQL 2000 не соответствует ANSI стандарту.

А как, пардон, быть тогда? Я с MS SQL по большому счету первый
раз связался, т.ч. прошу не материца. Интересует постраничный вывод
записей.

--
WBR, Alexander B. Gotlib,
mailto:al...@cca.usart.ru / ICQ# 13043204.
-|- -|-

Dmitry Kuzmenko

unread,
Dec 20, 2005, 3:10:55 AM12/20/05
to
Hello, Alex!

Alex Gotlib wrote:

> MS SQL 2000. Простая табличка. Простой запрос.
>
> SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy;
>
> Облом. MS SQL 2000 не соответствует ANSI стандарту.
>
> А как, пардон, быть тогда? Я с MS SQL по большому счету первый
> раз связался, т.ч. прошу не материца. Интересует постраничный вывод
> записей.

с чего ты взял, что offset и limit - это СТАНДАРТНЫЕ конструкции SQL ???
А может, стандартные это first/skip ? Или rows/to ?

и вообще, ограничение выборки имеет смысл только при ORDER BY.
В твоем случае, без order by, это похоже на выбор "случайных" записей,
потому что порядок записей без order by не гарантируется ни в одной РСУБД.

--
Dmitri Kouzmenko, www.ibase.ru, 953-13-34

Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Andrew Lesnichenko

unread,
Dec 20, 2005, 4:26:24 AM12/20/05
to
Alex Gotlib wrote:
> Hail there All!
>
> Subj.
>
> MS SQL 2000. Простая табличка. Простой запрос.
>
> SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy;
>
> Облом. MS SQL 2000 не соответствует ANSI стандарту.
>
> А как, пардон, быть тогда? Я с MS SQL по большому счету первый
> раз связался, т.ч. прошу не материца. Интересует постраничный вывод
> записей.
>
IMHO, постраничный вывод, это функция не сервера, а клиента.

--
Andrew Lesnichenko

Alex Gotlib

unread,
Dec 20, 2005, 7:24:19 AM12/20/05
to
Hail there Dmitry!

Tue, 20 Dec 2005 at 06:10 GMT Dmitry Kuzmenko wrote:

>> MS SQL 2000. Простая табличка. Простой запрос.

SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy

ORDER BY bla-bla-bla;

>> Облом. MS SQL 2000 не соответствует ANSI стандарту.
>> А как, пардон, быть тогда?

DK> с чего ты взял, что offset и limit - это СТАHДАРТHЫЕ конструкции SQL ???

Скажем так, что MS SQL первый из более менее распространенных СУБД, с
которыми я сталкивался, не поддерживает данную конструкцию.

DK> и вообще, ограничение выборки имеет смысл только при ORDER BY.

Само собой с сортировкой. Hе суть важно. Вопрос в том, как должен
выглядеть запрос, которые буждет возвращать только yy записей начиная с
xx-ой.

Alex Gotlib

unread,
Dec 20, 2005, 7:28:29 AM12/20/05
to
Hail there Andrew!

Tue, 20 Dec 2005 at 07:26 GMT Andrew Lesnichenko wrote:

>> SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy;
AL> IMHO, постраничный вывод, это функция не сервера, а клиента.

Разумеется это задача клиента. А задача сервера по запросу отдать
ровно столько записей, сколько нужно для отображения текущей страницы.

Вопрос - как будет выглядеть такой запрос в контексте MS SQL 2000?

P.S.: Я прекрасно понимаю, что вполне можно дергать чохом все записи и
потом уже с ними возиться, как вздумается. Hо это не всегда удобно. Hе
всегда нужно. Да и вообще хотелось бы на будущее разобраться.

Dmitry Kuzmenko

unread,
Dec 20, 2005, 6:12:05 AM12/20/05
to
Hello, Alex!

Alex Gotlib wrote:

> Само собой с сортировкой. Hе суть важно. Вопрос в том, как должен
> выглядеть запрос, которые буждет возвращать только yy записей начиная с
> xx-ой.

ms sql books? online?

--
Dmitri Kouzmenko, www.ibase.ru, 953-13-34

Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Alexander Goldun

unread,
Dec 20, 2005, 9:05:56 AM12/20/05
to
Alex Gotlib пишет:

> MS SQL 2000. Простая табличка. Простой запрос.
> SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy;

Так никто и не ответил? Вместо LIMIT используется TOP:

SELECT TOP yy * FROM bla_bla WHERE bla = bla_bla_bla

А вот для смещения не уверен, что это есть в MSSQL 2000 - не трогал его
ни разу.

Для MSSQL на эту тему есть FAQ, как раз про постраничную выборку:
http://sql.ru/faq/faq_topic.aspx?fid=105

Victor Metelitsa

unread,
Dec 20, 2005, 8:13:06 AM12/20/05
to
Alex Gotlib wrote:
> Hail there Dmitry!
>
> Tue, 20 Dec 2005 at 06:10 GMT Dmitry Kuzmenko wrote:
>
> >> MS SQL 2000. Простая табличка. Простой запрос.
>
> SELECT * FROM bla_bla WHERE bla = bla_bla_bla OFFSET xx LIMIT yy
> ORDER BY bla-bla-bla;
>
> >> Облом. MS SQL 2000 не соответствует ANSI стандарту.
> >> А как, пардон, быть тогда?
> DK> с чего ты взял, что offset и limit - это СТАHДАРТHЫЕ конструкции SQL ???
>
> Скажем так, что MS SQL первый из более менее распространенных СУБД, с
> которыми я сталкивался, не поддерживает данную конструкцию.
>
Вау!?! А какие СУБД "это" поддерживают? (Примечание: СУБД, а не MySQL;-) ).

--

Alex Gotlib

unread,
Dec 20, 2005, 11:05:42 AM12/20/05
to
Hail there Victor Metelitsa.

Tue, 20 Dec 2005 at 11:13 GMT Victor Metelitsa wrote:

DK>> с чего ты взял, что offset и limit - это СТАHДАРТHЫЕ конструкции SQL ???
>> Скажем так, что MS SQL первый из более менее распространенных СУБД, с
>> которыми я сталкивался, не поддерживает данную конструкцию.

VM> Вау!?! А какие СУБД "это" поддерживают? (Примечание: СУБД, а не MySQL;-)

PostgreSQL, Oracle. Хватит?

Вы мне чего доказать то пытаетесь? Что если MS SQL такого не
поддерживает, то сие отсутствие есть рулез несусветный?

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

Andrew Lesnichenko

unread,
Dec 20, 2005, 10:19:08 AM12/20/05
to
Alex Gotlib wrote:

> DK>> с чего ты взял, что offset и limit - это СТАHДАРТHЫЕ конструкции SQL ???
> >> Скажем так, что MS SQL первый из более менее распространенных СУБД, с
> >> которыми я сталкивался, не поддерживает данную конструкцию.
> VM> Вау!?! А какие СУБД "это" поддерживают? (Примечание: СУБД, а не MySQL;-)
>
> PostgreSQL, Oracle. Хватит?

В какой версии Oracle? В 7-8-9 такого нет.

> Вы мне чего доказать то пытаетесь? Что если MS SQL такого не

Полагают, что это нестандартная конструкция, очевидно...

PS. На вопрос, насколько я видел, уже ответили...

--
Andrew Lesnichenko

Alex Gotlib

unread,
Dec 21, 2005, 4:33:10 AM12/21/05
to
Hail there Andrew!

Tue, 20 Dec 2005 at 13:19 GMT Andrew Lesnichenko wrote:

VM>> Вау!?! А какие СУБД "это" поддерживают? (Примечание: СУБД, а не MySQL;-)
>> PostgreSQL, Oracle. Хватит?

AL> В какой версии Oracle? В 7-8-9 такого нет.

Хммм, в самом деле. У меня почему то в памяти отложилось, что есть.
Hо по большому счету суть то не в этом. Оракл вполне себе дает возможность
порционной выборки данных, причем влегкую дает. Чтобы с MS SQL такого
добяться, нужно извращаться.

Hипарядок! :-)

>> Вы мне чего доказать то пытаетесь? Что если MS SQL такого не

AL> Полагают, что это нестандартная конструкция, очевидно...

Разве это не ANSI SQL стандарт?

AL> PS. Hа вопрос, насколько я видел, уже ответили...

Да. Я свою задачу уже решил.

Dmitry Kuzmenko

unread,
Dec 21, 2005, 3:49:59 AM12/21/05
to
Hello, Alex!

Alex Gotlib wrote:

> AL> Полагают, что это нестандартная конструкция, очевидно...
>
> Разве это не ANSI SQL стандарт?

например, некоторые думают, что ANSI SQL - это то, что поддерживает
MS Access.

в стандарте SQL-99 я не нашел таких конструкций, вообще.
В стандарте SQL 2002 есть конструкции ROWS/RANGE применительно
к концепции Window (см. window clause).

Кроме того, поскольку операция ограничения выборки никаким
образом не участвует в реляционной модели, поскольку там
используются операции над множествами (и order by как такового
в реляционной алгебре нет), то здесь конкретный синтаксис
зависит от производителя.

MySQL - offset, limit
Firebird - first, skip
InterBase - rows, to...
MS SQL - top

и так далее.

А еще стандарт SQL подразделяется на уровни. Entrly Level,
Intermediate и Full. Почти все коммерческие сервера поддерживают
целиком только Entry Level. Также все поддерживают те или иные
части Intermediate. И никто не поддерживает Full.

Если есть интерес к стандарту, купи себе справочник Грабера:
SQL Справочное руководство. Это не "Введение в SQL" или
"SQL" его же, а голый справочник, с перечислением уровней стандарта и т.п.
В инете не наблюдался никогда.

--
Dmitri Kouzmenko, www.ibase.ru, 953-13-34

Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Alexander Goldun

unread,
Dec 21, 2005, 11:27:43 AM12/21/05
to
Pavel V. Pasechnik пишет:

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

> Hе понял. Разъясни.

А что тут разъяснять? Глянь сам ту ссылку, которую я давал:
http://sql.ru/faq/faq_topic.aspx?fid=105
и сравни "изящество" этих извратов с конструкцией типа
SELECT TOP nn START AT mm * FROM tablename ORDER BY...

Andrew Grachyov

unread,
Jan 2, 2006, 1:08:00 PM1/2/06
to
Hi, Alexander!

Wednesday December 21 2005, Alexander Goldun writes to Pavel V. Pasechnik:

AG> А что тут разъяснять? Глянь сам ту ссылку, которую я давал:
AG> http://sql.ru/faq/faq_topic.aspx?fid=105
AG> и сравни "изящество" этих извратов с конструкцией типа
AG> SELECT TOP nn START AT mm * FROM tablename ORDER BY...
AG> -+- ifmail v.2.15dev5
AG> + Origin: (http://news.cca.usart.ru/) USURT's FidoNET<->
AG> (2:5080/1003@fidonet)

Сакpаментальный вопpос - "а на фига"? То есть, я не могу пpедставить себе
ситуацию, когда мне нужно вытащить запись из таблицы "с 21-й по 31-ю",
пpопустив пpи этом пеpвые 20 (то есть когда куpсоpом пользоваться неудобно).

Поясните, плз, зачем нужна такая констpукция?

Пока.

Andrew Grachyov.

Nick Gazaloff

unread,
Jan 3, 2006, 3:39:09 PM1/3/06
to

Web-приложения.

--

Best regards,
Nick
(GPG Key ID: 4396B2D0)

Andrew Lening

unread,
Jan 3, 2006, 3:25:30 PM1/3/06
to
Hi, Andrew!

AG> Поясните, плз, зачем нужна такая констpукция?

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

Bye.

Anton Baklanov

unread,
Jan 3, 2006, 8:25:37 PM1/3/06
to
[√] Привет, как жизнь, Andrew ?

02 Января 2006 года ты писал(а) к Alexander:

AG> Сакpаментальный вопpос - "а на фига"? То есть, я не могу пpедставить
AG> себе ситуацию, когда мне нужно вытащить запись из таблицы "с 21-й по
AG> 31-ю", пpопустив пpи этом пеpвые 20 (то есть когда куpсоpом
AG> пользоваться неудобно).
AG> Поясните, плз, зачем нужна такая констpукция?
Для примера: хотя бы для экономия трафа. Даже по локольной сети.
Утверждение, что для 30 записей в таблице это не неужно, я согласен. А когда
_локальная_ сетка забиватеся трафом, изза кривых рук разработков - это вполне
реальная ситуация.

[√] Пока, Andrew, счастливого тебе коннекта ! ...

Alex Gotlib

unread,
Jan 4, 2006, 2:34:12 PM1/4/06
to
Hail there Vadim Rumyantsev.

Wed, 04 Jan 2006 at 13:00 GMT Vadim Rumyantsev wrote:

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

VR>> Это ошибка в проектировании интерфейса пользователя. Откуда он узнает,
VR>> что ему нужна именно третья страница?
>> Во-первых, в самом деле может знать. Во-вторых, это может знать
>> не пользователь, а индексатор поисковой системы, который уже был на
>> сайте до пользователя.
VR> Тогда тем более содержимое базы с тех пор могло измениться, и
VR> пользователь
VR> попадёт не туда, куда хотел (типичная ситуация с некоторыми неграмотно
VR> спроектированными досками объявлений). В отличие от выборки по ключу.

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

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

Ты чего доказать то пытаешься? Что раз MS SQL такого не
позволяет нормально делать, то такое и не следует делать? :-)

>> В третьих, даже по подробному фильтру результат запроса может
>> получиться таким объемным, что все равно придется его разбивать по
>> страницам. Если конечно есть желание предоставлять пользователю удобный
>> интерфейс, а не абы какой.
VR> Я не против разбивки по страницам. Я говорю о том, что страницу должен
VR> идентифицировать диапазон ключей находящихся на ней записей, а не номер
VR> страницы.

Представь себе ситуацию. Вводит пользователь фильтр по ключам.
Результат выборки пять тысяч записей. Все пять тысяч будешь выводить?

--
WBR, Alexander B. Gotlib, mailto:al...@cca.usart.ru

ICQ: 13043204 / Jabber: al...@jabber.usurt.ru
-|- -|-

Alex Gotlib

unread,
Jan 4, 2006, 5:02:44 PM1/4/06
to
Hail there Vadim Rumyantsev.

Wed, 04 Jan 2006 at 17:11 GMT Vadim Rumyantsev wrote:

>> Представь себе ситуацию. Вводит пользователь фильтр по ключам.
>> Результат выборки пять тысяч записей. Все пять тысяч будешь выводить?

(*)

VR> Попробуй понять: выводить страницами. Hо на страницу ссылку давать не
VR> номером, а диапазоном ключей на этой странице.
VR>
VR> Hапример, если это список фамилий, то страницы называть не "1", "2",
VR> "3"..., а "Абрамов", "Васильев", "Дашин"... (или, сокращая до
VR> наименьшего различного, "А", "В", "Д"...).
VR>
VR> Тогда и запросы у тебя будут вида: ... WHERE FAMILY BETWEEN 'Абрамов' AND
VR> 'Васильев'.

См выше. Типичная ситуация, когда по такому запросу записи
нельзя показывать пользователю одним куском, а нужно делить на части.

Alex Gotlib

unread,
Jan 4, 2006, 8:30:14 PM1/4/06
to
Hail there Vadim Rumyantsev.

Wed, 04 Jan 2006 at 19:27 GMT Vadim Rumyantsev wrote:

>>> Представь себе ситуацию. Вводит пользователь фильтр по ключам.
>>> Результат выборки пять тысяч записей. Все пять тысяч будешь выводить?
>> (*)
VR>> Попробуй понять: выводить страницами. Hо на страницу ссылку давать не
VR>> номером, а диапазоном ключей на этой странице.
VR>> Hапример, если это список фамилий, то страницы называть не "1", "2",
VR>> "3"..., а "Абрамов", "Васильев", "Дашин"... (или, сокращая до
VR>> наименьшего различного, "А", "В", "Д"...).
VR>> Тогда и запросы у тебя будут вида: ... WHERE FAMILY BETWEEN 'Абрамов' AND
VR>> 'Васильев'.
>> См выше. Типичная ситуация, когда по такому запросу записи
>> нельзя показывать пользователю одним куском, а нужно делить на части.

VR> Hу и подели на части. Если у тебя вдруг пять тысяч Абрамовых - подели их
VR> по
VR> инициалам, затем по номеру паспорта, или как там вообще пользователь их
VR> различает. Автоматически подели, в своей программе, формирующей
VR> веб-страницы, а
VR> не в задаваемом пользователем фильтре. Иными словами, это не пользователь
VR> задаёт такой запрос, а твоя программа автоматически разбивает фамилии на
VR> поддиапазоны, увидев, что пользователь хочет посмотреть всех людей из
VR> базы.

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

VR> Уж не знаю, как ещё объяснить :( Если вдруг задумаешь отвечать на это
VR> письмо,
VR> прочти ещё раз все предыдущие и попытайся понять, что в них написано.

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

Alexander Goldun

unread,
Jan 7, 2006, 7:01:56 AM1/7/06
to
Vadim Rumyantsev пишет:

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

> Это клиника :(

Hу, если ты доктор, то глянь для примера ссылку:
http://sql.ru/forum/actualtopics.aspx?bid=30
смотри под таблицей строчку "Страницы: 1 2 3..."
Было бы интересно услышать твою идею, как более правильно реализовать
эти страницы не используя номера страниц, если на каждой нужно
отобразить по 50 записей.

Или возьмем для примера не форум, а длинный топик:
http://sql.ru/forum/actualthread.aspx?tid=233233
По каким критериям разбивать? Hапример, я помню, что там вчера было 5
страниц. Сегодня их 10. Очевидно, мне есть смысл начинать смотреть его
не ранее чем с 5-й страницы.

Разумные идеи будут? Как ты себе представляешь использование там
диапазона ключей?

Andrew Lesnichenko

unread,
Jan 7, 2006, 6:56:23 AM1/7/06
to
Alexander Goldun wrote:

> Hу, если ты доктор, то глянь для примера ссылку:
> http://sql.ru/forum/actualtopics.aspx?bid=30
> смотри под таблицей строчку "Страницы: 1 2 3..."
> Было бы интересно услышать твою идею, как более правильно реализовать
> эти страницы не используя номера страниц, если на каждой нужно
> отобразить по 50 записей.
>
> Или возьмем для примера не форум, а длинный топик:
> http://sql.ru/forum/actualthread.aspx?tid=233233
> По каким критериям разбивать? Hапример, я помню, что там вчера было 5
> страниц. Сегодня их 10. Очевидно, мне есть смысл начинать смотреть его
> не ранее чем с 5-й страницы.
>
> Разумные идеи будут? Как ты себе представляешь использование там
> диапазона ключей?
>

Данные примеры иллюстрируют необходимость доступа к страницам в
произвольном порядке, полагаю? Как уже было сказано, сама такая
необходимость является типичным "поджопным" способом, к которому
вынуждены прибегать пользователи в условиях скудости предоставленного им
web-интерфейса. Он не дает им возможности сформировать более гибкие
условия отбора и сортировки.

По обоим примерам не стало ясно, как именно пользователь узнает номер
нужной ему страницы в условиях постоянного изменения содержания. Он
может только примерно догадываться и далее действовать методом
последовательных приближений. Нормальными же критериями отбора являются
дата последнего чтения, прочитанные/непрочитанные сообщения, объединения
их в цепочки обсуждений и пр. - все, что есть в нормальном news reader'е.

--
Andrew Lesnichenko

Alexander Goldun

unread,
Jan 7, 2006, 10:53:30 AM1/7/06
to
Andrew Lesnichenko пишет:

> Данные примеры иллюстрируют необходимость доступа к страницам в
> произвольном порядке, полагаю? Как уже было сказано, сама такая
> необходимость является типичным "поджопным" способом, к которому
> вынуждены прибегать пользователи в условиях скудости предоставленного им
> web-интерфейса.

Возможно именно так. Так ведь изначально причиной такой потребности была
скорее всего именно необходимость реализации web-интерфейса

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

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

> Hормальными же критериями отбора являются

> дата последнего чтения, прочитанные/непрочитанные сообщения, объединения
> их в цепочки обсуждений и пр. - все, что есть в нормальном news reader'е.

Hу вот, осталось от обсуждения конструкции SELECT TOP n START AT m
плавно перейти к флейму Web-форумы vs NNTP :)

Alexander Goldun

unread,
Jan 7, 2006, 11:20:43 AM1/7/06
to
Vadim Rumyantsev пишет:

>>Было бы интересно услышать твою идею, как более правильно реализовать
>>эти страницы не используя номера страниц,

> По времени написания сообщений (в данном случае, исходя из фактического
> трафика, достаточно дат).
>
> Страницы: 14.12-06.01 24.11-13.12 07.11-23.11

Hу-ну, любопытно :) Можешь привести пример такого "правильного"
web-форума? Или хотя бы пример, как будут выглядеть обозначения, если за
час вдруг наконопатят сообщений на несколько страниц (а такое бывает)?
А еще любопытно увидеть реализацию такого чуда правильного
проектирования. Хотя бы процедуру получения перечня страниц с обозначениями.

Конечно, web-разработка может накладывать специфический отпечаток на
разработчиков, многие вещи могут показаться дикостью тем, кто
разрабатывал только классические клиентские приложения. Hо такова
специфика Web-разработки. И считать всех безграмотными не очень
правильно. По твоему все бездарно проектируют, делают страничный вывод,
а большинство производителей СУБД в угоду рынку потакает этой
безграмотности? Один лишь MSSQL не дал нормальной конструкции ибо нафиг
не нужна? Тогда еще ссылка от Microsoft:
http://search.microsoft.com/results.aspx?mkt=en-US&setlang=en-US&q=media+player
Как здесь нужно было реализовать?

>>если на каждой нужно
>>отобразить по 50 записей.

> Кому нужно?

Очевидно, всем, кроме тебя. Это просто эмпирически подобранное значение,
компромисс между кол-вом страниц и размером каждой страницы.

Andrew Lesnichenko

unread,
Jan 7, 2006, 12:01:06 PM1/7/06
to
Alexander Goldun wrote:
> Andrew Lesnichenko пишет:

>>произвольном порядке, полагаю? Как уже было сказано, сама такая
>>необходимость является типичным "поджопным" способом, к которому
>>вынуждены прибегать пользователи в условиях скудости предоставленного им
>>web-интерфейса.

> Возможно именно так. Так ведь изначально причиной такой потребности была
> скорее всего именно необходимость реализации web-интерфейса

Скорее, движение по пути наименьшего сопротивления в виде повторения
чужих решений.

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

Это не реальный путь, а костыль в условиях кривого интерфейса.

>>Hормальными же критериями отбора являются
>>дата последнего чтения, прочитанные/непрочитанные сообщения, объединения
>>их в цепочки обсуждений и пр. - все, что есть в нормальном news reader'е.

> Hу вот, осталось от обсуждения конструкции SELECT TOP n START AT m
> плавно перейти к флейму Web-форумы vs NNTP :)

Не одно против другого, а почему бы не взять в web-интерфейс грамотные и
удобные для пользователя решения.

Andrew Lesnichenko

unread,
Jan 7, 2006, 12:18:43 PM1/7/06
to
Alexander Goldun wrote:

> Конечно, web-разработка может накладывать специфический отпечаток на
> разработчиков, многие вещи могут показаться дикостью тем, кто
> разрабатывал только классические клиентские приложения. Hо такова
> специфика Web-разработки. И считать всех безграмотными не очень
> правильно. По твоему все бездарно проектируют, делают страничный вывод,

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

Если клиент "попросил" 500 строк, то собирается читать их все - пусть
читает последовательно постранично. Если ему не нужно столько или нужна
страница из середины, значит он ГАДАЕТ, потому что в интерфейсе ему не
дали возможности выбрать только то, что ему нужно.

Alexander Goldun

unread,
Jan 7, 2006, 8:15:23 PM1/7/06
to
Vadim Rumyantsev пишет:

>>>Страницы: 14.12-06.01 24.11-13.12 07.11-23.11
>>Hу-ну, любопытно :) Можешь привести пример такого "правильного"
>>web-форума?

> Без понятия, я веб-форумами не пользуюсь.

Hу если "без понятия", тогда может не стоило хотя бы в этой области
обвинять других в ощибочном проектировании?

>>Или хотя бы пример, как будут выглядеть обозначения, если за
>>час вдруг наконопатят сообщений на несколько страниц (а такое бывает)?

> Сегодня 13:43-13:53 Сегодня 13:30-13:42

Много места свободного на страницах?

>>А еще любопытно увидеть реализацию такого чуда правильного
>>проектирования. Хотя бы процедуру получения перечня страниц с
>>обозначениями.

> Я готов обсудить сумму.

А я готов с ходу бесплатно выдать решение для нумерованных страниц:

Получение кол-ва страниц:
SELECT ceiling(count(*)/N) FROM table_name
Где N - кол-во записей на страницу (плавающего типа, чтобы учесть
последнюю неполную страницу, если она есть)

Получение записей для M-й страницы:
SELECT TOP N start at K * FROM table_name ORDER BY key_name
где K=1+(M-1)*N

И все. Hе нужно торговаться с доктором :)

>>http://search.microsoft.com/results.aspx?mkt=en-US&setlang=en-US&q=media+player
>>Как здесь нужно было реализовать?

> Это не выборка из базы, не надо переводить стрелки.

А что же это, как не выборка из базы, отсортированная, например, по
релевантности или дате?

>>Это просто эмпирически подобранное значение,
>>компромисс между кол-вом страниц и размером каждой страницы.

> Ты думаешь, пользователи обидятся, если на странице окажется 49 или 51
> запись?

Hе обидятся. Hо удивятся, если на страницах будет 5,1,1563,49 записей.

Hикто не пытается тут сказать, что нумерация страниц - единственное
верное рещение. У него есть недостатки, которые надо иметь в виду. Hо
для веба во многих случаях оно самое оптимальное. В обычных клиентских
приложениях (не web) пользователи тоже не так часто заморачиваются
скурпулезной фильтрацией до получения единственсвенно нужной записи.
Часто просто уменьшают размер выборки до некоей приемлемой величины
(зависит от контекста - это может быть и 50 и 500 записей), а потом
просто скролят грид руками и ищут глазами. Оговорюсь сразу: даже при
наличии мощных и удобных фильтров. Hу выберет клиента в журнале счетов.
Hу укажет период в месяц. А потом просто отсортирует например по сумме и
проскролит быстро пару-тройку экранов. Так вот для веба выборка в 500
записей на одной странице может оказаться великоватой, а реализовывать
функционал типа грида - проблематично. Тогда бьем ее на 10 по 50 и
выдаем в таком виде. Последовательное щелканье по страницам - аналог
скроллинга в гриде. И там уже может оказаться не важно для пользователя,
какие там критерии выборки по страницам, ему просто нужно иметь
возможность последовательно получить данные. Hо специфика веба в том,
что там нет такого жесткого понятия сессии, как в обычном клиенте. Т.е.
утрированно получение каждой новой порции данных (новой страницы) -
практически отдельный сеанс работы с бд: подключился, получил данные,
сформировал страницу, отключился. Это, конечно, очень грубое
утрирование, но оно хорошо показывает главное отличие. Соответственно,
классические способы получения выборки, типа курсора, тут не подходят.
Для таких случаев и сделана возможность постраничного получения данных.

Впрочем, нафига я это все разжевываю? "Это клиника" (с) Vadim Rumyantsev
:)

Alexander Goldun

unread,
Jan 8, 2006, 6:44:00 AM1/8/06
to
Andrew Lesnichenko пишет:

>>разрабатывал только классические клиентские приложения. Hо такова
>>специфика Web-разработки. И считать всех безграмотными не очень
>>правильно. По твоему все бездарно проектируют, делают страничный вывод,
> По-моему это называется оправданием кривой разработки. Один слепил
> барахло на коленке, а остальные повторяют, чтобы самим не работать. А
> пользователи "хавают" то, что дают, поскольку ничего больше нет.

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

> Если клиент "попросил" 500 строк, то собирается читать их все - пусть
> читает последовательно постранично. Если ему не нужно столько или нужна
> страница из середины, значит он ГАДАЕТ,

Да даже при последовательном постраничном просмотре, как ты предлагаешь
выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом специфики веба?

Alexander Goldun

unread,
Jan 8, 2006, 6:54:56 AM1/8/06
to
Vadim Rumyantsev пишет:

>>А я готов с ходу бесплатно выдать решение для нумерованных страниц:

>>И все. Hе нужно торговаться с доктором :)

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

А судьи кто? Кому плохо и кому хорошо? И чем именно плохо?

>>Hу выберет клиента в журнале счетов.
>>Hу укажет период в месяц. А потом просто отсортирует например по сумме и
>>проскролит быстро пару-тройку экранов.

> Писать программы для большого (и/или ответственного) предприятия я бы тебя с
> таким подходом не взял.

Взаимно. Мне не нужны упертые теоретики. Практика - это бесконечные
компромиссы. Я специально сделал оговорку "даже при наличии мощных и
удобных фильтров". Если у пользователя есть возможность отфильтровать по
любому критерию или набору критериев, это не значит, что он будет
пользоваться ими до победного конца. Бывают ситуации, когда просмотреть
оставшееся глазами быстрее, чем придумывать и задавать еще уточняющие
условия. А иногда просто нужна вся выборка для просмотра.

Andrew Lesnichenko

unread,
Jan 8, 2006, 5:14:52 AM1/8/06
to
Alexander Goldun wrote:

> Да даже при последовательном постраничном просмотре, как ты предлагаешь
> выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом специфики веба?

Читать из курсора не годится?

Alex Gotlib

unread,
Jan 8, 2006, 8:04:16 AM1/8/06
to
Hail there Alexander!

Sun, 08 Jan 2006 at 09:44 GMT Alexander Goldun wrote:

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

А для большинства случаев ничего лучше и нет. Оптимальным
решением является фильтр по ключевым полям (например в случае гостевой
книги это могут быть поля "дата" и "автор") + все тот же постраничный
вывод. Иначе получается гавно, а не веб-интерфейс.

Господа просто теоретизируют и гнут пальцы. Заняться видно в
праздники больше нечем. :-)

Alexander Goldun

unread,
Jan 8, 2006, 11:35:26 AM1/8/06
to
Vadim Rumyantsev пишет:

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

> Пользователям, очевидно.

Отучайся говорить за пользователей. Мои, по крайней мере, в восторге.

> Если пользователь не пользуется фильтрами - значит, они не удобные. По
> определению.

По какому такому определению? Демагогия чистейшая. Простой пример. Есть
журнал счетов. Есть возможность фильтровать по любому набору полей.
Hужно найти определенный счет. Известен клиент, месяц, сумма около
$10000 и помню, что в примечаниях что-то написал. В фильтре в пару
кликов выбираю месяц, по 2-3 начальным буквам клиента. Получаю выборку,
которая не умещается в форме журнала, но судя по полосе прокрутки
составляет около 3-х этих самых журналов по высоте. Могу, конечно, еще
задать фильтр по сумме, например >9000 и <11000 и признак непустого
примечания или даже вспомнить и задать входящее слово и получить
минимальную выборку с искомой записью (если не ошибусь в задании
критерия :). А могу просто один или два раза нажать PageDown или
кликнуть по скролл-бару и увидеть нужную мне запись. Что проще? Виновато
неудобство фильтров? Здесь я, в отличие от тебя, не теоретизирую. Мне
часто приходилось наблюдать работу персонала и даже самому на время
вживаться в роли на разных рабочих местах, чтобы посторить наиболее
оптимальный интерфейс, обеспечить эффективную методологию работы как раз
для случаев, когда приходится работать с большими объемами информации.
Вплоть до подсчета необходимых телодвижений на операцию.

Ладно, надоело мне все это. Я тут пытаюсь объяснить, мотивировать,
привести наглядные примеры, а ты отмахиваешься абстрактными наездами
типа "ошибка проектирования", "клиника", "по определению" и т.п. Все
останутся при своих мнениях, плюс получат некое представление о
профессиональном уровне собеседников.

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

SELECT TOP 1 START AT 1+(N-1)*50 last_name
FROM some_table ORDER BY last_name

А уже выборки для конкретных страниц делать по ключу.

P.S. А в DB2 подобная конструкция имеется?

Andrew Lesnichenko

unread,
Jan 8, 2006, 3:12:58 PM1/8/06
to
Alexander Goldun wrote:

> Возвращаясь к исходному вопросу зачем нужна такая конструкция в SQL,
> добавлю лишь, что она не помешает, даже если захотим выдать постранично,
> но не с номерами, а диапазонами ключей, как ты предлагаешь. Если
> например надо выдать постранично по 50 записей на страницу с ключем
> фамилия, то получить перечень этих самых граничных фамилий проще всего
> при помощи рассматриваемой конструкции, примерно так (в цикле по N):
>
> SELECT TOP 1 START AT 1+(N-1)*50 last_name
> FROM some_table ORDER BY last_name
>
> А уже выборки для конкретных страниц делать по ключу.
>
> P.S. А в DB2 подобная конструкция имеется?

Насколько я представляю, подобные вещи (выбрать N строк из середины
полученного множества) пишутся и безо всяких там 'TOP', 'START' и пр.
Если найду пример, отправлю...

Andrew Lesnichenko

unread,
Jan 8, 2006, 3:14:30 PM1/8/06
to
Alex Gotlib wrote:

> А для большинства случаев ничего лучше и нет. Оптимальным
> решением является фильтр по ключевым полям (например в случае гостевой
> книги это могут быть поля "дата" и "автор") + все тот же постраничный
> вывод. Иначе получается гавно, а не веб-интерфейс.
>
> Господа просто теоретизируют и гнут пальцы. Заняться видно в
> праздники больше нечем. :-)

Скорее, господ напрягает пользоваться тем говном, которое вы называете
web-интерфейсом.

Nick Gazaloff

unread,
Jan 8, 2006, 3:25:33 PM1/8/06
to
Andrew Lesnichenko wrote:
> Alexander Goldun wrote:
>
>> Да даже при последовательном постраничном просмотре, как ты
>> предлагаешь выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом
>> специфики веба?
>
>
> Читать из курсора не годится?

А пропускать строки в курсоре через MOVE? Это тоже не сильно переносимо
между разными СУБД...

Nick Gazaloff

unread,
Jan 8, 2006, 3:27:04 PM1/8/06
to
Andrew Lesnichenko wrote:
> Alex Gotlib wrote:
>
>> А для большинства случаев ничего лучше и нет. Оптимальным решением
>> является фильтр по ключевым полям (например в случае гостевой книги
>> это могут быть поля "дата" и "автор") + все тот же постраничный вывод.
>> Иначе получается гавно, а не веб-интерфейс.
>>
>> Господа просто теоретизируют и гнут пальцы. Заняться видно в
>> праздники больше нечем. :-)
>
>
> Скорее, господ напрягает пользоваться тем говном, которое вы называете
> web-интерфейсом.

Ну конечно... Все п...сы, а вы один Д'Артаньян... Будьте проще, поручик.
Меньше снобизма.

Alexander Goldun

unread,
Jan 9, 2006, 7:18:04 AM1/9/06
to
Andrew Lesnichenko пишет:

>>Да даже при последовательном постраничном просмотре, как ты предлагаешь
>>выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом специфики веба?
>
>
> Читать из курсора не годится?

И для каждой последующей страницы открывать по новой курсор и скроллить
его соответственно номеру страницы? Элегантное решение :)

Andrew Lesnichenko

unread,
Jan 9, 2006, 9:38:03 AM1/9/06
to
Alexander Goldun wrote:

А зачем его открывать каждый раз? Открыть один раз, вернуть из процедуры
массив в N строк. Потом следующие N строк. Не пойдет?

Andrew Lesnichenko

unread,
Jan 9, 2006, 9:44:05 AM1/9/06
to
Nick Gazaloff wrote:
> Andrew Lesnichenko wrote:
>
>> Alexander Goldun wrote:
>>
>>> Да даже при последовательном постраничном просмотре, как ты
>>> предлагаешь выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом
>>> специфики веба?

>> Читать из курсора не годится?

> А пропускать строки в курсоре через MOVE? Это тоже не сильно переносимо
> между разными СУБД...

1. Зачем пропускать? Я имел в виду, читать курсор последовательно с
начала, но показывать записи частями. Поскольку из середины не читаем,
ничего проскакивать не надо.

2. Насчет переносимости - уже же выяснили, что синтаксис MySQL с
проскакиванием строк непереносим и вообще в этой задаче переносимости нет.

3. Но с другой стороны, можно сделать и на простейшем SQL, если я
конечно не попутал что-то. Еще в Oracle7 это решалось традиционным
синтаксисом. Если найду на работе пример, отправлю. Хотя, там вроде бы
rownum использовался...

Nick Gazaloff

unread,
Jan 9, 2006, 3:47:20 PM1/9/06
to
Andrew Lesnichenko wrote:
> Nick Gazaloff wrote:
>
>> Andrew Lesnichenko wrote:
>>
>>> Alexander Goldun wrote:
>>>
>>>> Да даже при последовательном постраничном просмотре, как ты
>>>> предлагаешь выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом
>>>> специфики веба?
>
>
>>> Читать из курсора не годится?
>
>
>> А пропускать строки в курсоре через MOVE? Это тоже не сильно
>> переносимо между разными СУБД...
>
>
> 1. Зачем пропускать? Я имел в виду, читать курсор последовательно с
> начала, но показывать записи частями. Поскольку из середины не читаем,
> ничего проскакивать не надо.

Может, я не понял ваш вариант, но как читать "последовательно с начала"
для Web-страницы, выводящей записи с 11 по 20?

>
> 2. Насчет переносимости - уже же выяснили, что синтаксис MySQL с
> проскакиванием строк непереносим и вообще в этой задаче переносимости нет.
>
> 3. Но с другой стороны, можно сделать и на простейшем SQL, если я
> конечно не попутал что-то. Еще в Oracle7 это решалось традиционным
> синтаксисом. Если найду на работе пример, отправлю. Хотя, там вроде бы
> rownum использовался...
>


--

Best regards,

Nick Gazaloff

unread,
Jan 9, 2006, 3:50:20 PM1/9/06
to
Andrew Lesnichenko wrote:
> Alexander Goldun wrote:
>
>>>> Да даже при последовательном постраничном просмотре, как ты
>>>> предлагаешь выдавать после первой 2-ю, 3-ю и т.д. страницы с учетом
>>>> специфики веба?
>>>
>>>
>>> Читать из курсора не годится?
>>
>>
>> И для каждой последующей страницы открывать по новой курсор и
>> скроллить его соответственно номеру страницы? Элегантное решение :)
>>
> А зачем его открывать каждый раз? Открыть один раз, вернуть из процедуры
> массив в N строк. Потом следующие N строк. Не пойдет?

Почитайте что-нибудь о протоколе HTTP. Он stateless, и при переходе
пользователя между страницами кое-что сохранить можно (через т.н.
"сеансы"), но уж никак не курсор. Соединение с СУБД разрывается по
окончании генерации страницы.

Victor Metelitsa

unread,
Jan 10, 2006, 12:18:55 AM1/10/06
to
Nick Gazaloff wrote:
[...]

> Почитайте что-нибудь о протоколе HTTP. Он stateless, и при переходе
> пользователя между страницами кое-что сохранить можно (через т.н.
> "сеансы"), но уж никак не курсор. Соединение с СУБД разрывается по
> окончании генерации страницы.
>
Хоть HTTP stateless, но из этого никак не следует, что соединение нужно
рвать при окончании генерации страницы. Сервера приложений обычно
поддерживают понятие сеанса. Используя это, даже для каждого юзера (!)
можно держать отдельный коннект и открытый курсор. Правда, это годится
для интранета, но для интернета едва ли. Есть также понятие connection
pooling, но курсор-таки для каждого юзера нужен отдельный.

Ещё можно получить запросом SELECT ключ WHERE ... все ключи в массив (и
держать его в переменной сеанса), чтобы при просмотре произвольной
страницы брать ключи из массива и выполнять SELECT ... WHERE ключ IN
(...ключи...). Между прочим, так работает MS Access. Но какова будет
величина массива ключей? Не имеет ли смысл сохранять его на диск / во
временной таблице базы данных? It dependents.

Так что лично я предпочту брать записи с N по M средствами СУБД, если
такая возможность есть. Большая область применения, в сравнении с первым
случаем. Проще в реализации и быстрее выдаётся первая страница, в
сравнении со вторым.

--

Andrew Lesnichenko

unread,
Jan 10, 2006, 6:29:46 AM1/10/06
to
Victor Metelitsa wrote:

> Так что лично я предпочту брать записи с N по M средствами СУБД, если
> такая возможность есть. Большая область применения, в сравнении с первым
> случаем. Проще в реализации и быстрее выдаётся первая страница, в
> сравнении со вторым.
>

В частности, в Oracle это делается так (взято из FAQ на sql.ru):

select o.*
from (select rownum rn, o.*
from (select o.* from "таблица" o order by "что нужно") o
where rownum <= :M) o
where o.rn >= :N;

--
Andrew Lesnichenko

Andrew Lesnichenko

unread,
Jan 10, 2006, 6:49:49 AM1/10/06
to
Nick Gazaloff wrote:

> Почитайте что-нибудь о протоколе HTTP. Он stateless, и при переходе
> пользователя между страницами кое-что сохранить можно (через т.н.
> "сеансы"), но уж никак не курсор. Соединение с СУБД разрывается по
> окончании генерации страницы.
>

Хотел бы я посмотреть как вы, начитавшись про http, зайдете по нему в
тот же Oracle, создадите и разорвете соединение...

Andrew Lesnichenko

unread,
Jan 10, 2006, 6:49:49 AM1/10/06
to
Nick Gazaloff wrote:

>> 1. Зачем пропускать? Я имел в виду, читать курсор последовательно с
>> начала, но показывать записи частями. Поскольку из середины не читаем,
>> ничего проскакивать не надо.
>
> Может, я не понял ваш вариант, но как читать "последовательно с начала"
> для Web-страницы, выводящей записи с 11 по 20?

Вы перед этим прочитали записи с 1 по 10...

Nick Gazaloff

unread,
Jan 10, 2006, 6:53:52 AM1/10/06
to
Andrew Lesnichenko wrote:
> Nick Gazaloff wrote:
>
>> Почитайте что-нибудь о протоколе HTTP. Он stateless, и при переходе
>> пользователя между страницами кое-что сохранить можно (через т.н.
>> "сеансы"), но уж никак не курсор. Соединение с СУБД разрывается по
>> окончании генерации страницы.
>>
> Хотел бы я посмотреть как вы, начитавшись про http, зайдете по нему в
> тот же Oracle, создадите и разорвете соединение...
>

Намек непонятен. Скажите тогда, какие средства разработки Web-приложений
(PHP, ASP.NET, ColdFusion, JSP etc...) позволяют хранить дескрипторы
курсоров в данных сеанса.

Alexander Goldun

unread,
Jan 10, 2006, 10:22:40 AM1/10/06
to
Andrew Lesnichenko пишет:

>>>1. Зачем пропускать? Я имел в виду, читать курсор последовательно с
>>>начала, но показывать записи частями. Поскольку из середины не читаем,
>>>ничего проскакивать не надо.
>>
>>Может, я не понял ваш вариант, но как читать "последовательно с начала"
>>для Web-страницы, выводящей записи с 11 по 20?
> Вы перед этим прочитали записи с 1 по 10...

Перед чем этим? Кто именно перед этим прочитал 10 записей и каких из
нескольких сотен пользователей, запрашивавших "перед этим" какие-то
страницы с частями выборок? Когда их прочитал? Час назад?

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

Хотя ключевой момент, пожалуй, один: отсутствие в HTTP такого жесткого
понятия сессии, как при обычном подключении клиента к SQL-серверу. Об
этом уже говорил и я и Nick Gazaloff. Если этот момент непонятен в
теории, то остается только на практике хотя бы попробовать реализовать
подобное постраничное чтение. После этого можно продолжить обсуждение,
хотя, скорее всего, этот вопрос отпадет сам собой.

Victor Metelitsa

unread,
Jan 11, 2006, 2:08:43 AM1/11/06
to

Все Smalltalk'и (VAST, VW, Squeak и т.д.) это могут (им просто-напросто
безразлично, каких классов объекты - атрибуты сеанса). И

java.lang.Object getAttribute(java.lang.String key)
void setAttribute(java.lang.String name, java.lang.Object value)

тоже наводит на определённые мысли.

--

Nick Gazaloff

unread,
Jan 11, 2006, 4:27:15 AM1/11/06
to
Victor Metelitsa wrote:
> Nick Gazaloff wrote:
>
>> Andrew Lesnichenko wrote:
>>
>>> Nick Gazaloff wrote:
>>>
>>>> Почитайте что-нибудь о протоколе HTTP. Он stateless, и при переходе
>>>> пользователя между страницами кое-что сохранить можно (через т.н.
>>>> "сеансы"), но уж никак не курсор. Соединение с СУБД разрывается по
>>>> окончании генерации страницы.
>>>>
>>> Хотел бы я посмотреть как вы, начитавшись про http, зайдете по нему в
>>> тот же Oracle, создадите и разорвете соединение...
>>>
>>
>> Намек непонятен. Скажите тогда, какие средства разработки
>> Web-приложений (PHP, ASP.NET, ColdFusion, JSP etc...) позволяют
>> хранить дескрипторы курсоров в данных сеанса.
>
>
> Все Smalltalk'и (VAST, VW, Squeak и т.д.) это могут (им просто-напросто
> безразлично, каких классов объекты - атрибуты сеанса). И

Что-то я не слышал о сайтах на Smalltalk.


> java.lang.Object getAttribute(java.lang.String key)
> void setAttribute(java.lang.String name, java.lang.Object value)
>
> тоже наводит на определённые мысли.

С JSP я не работал, может, вы скажете: там есть возможность не закрывать
соединение с БД и курсор при переходах между страницами? Вопрос именно в
этом.

Andrew Lesnichenko

unread,
Jan 11, 2006, 6:04:49 AM1/11/06
to
Nick Gazaloff wrote:

> (PHP, ASP.NET, ColdFusion, JSP etc...) позволяют хранить дескрипторы
> курсоров в данных сеанса.

А ASP.NET разве не держит открытыми пул сессий? В любом случае, не
браузер же сессии открывает...

Nick Gazaloff

unread,
Jan 11, 2006, 7:16:06 AM1/11/06
to
Andrew Lesnichenko wrote:
> Nick Gazaloff wrote:
>
>> (PHP, ASP.NET, ColdFusion, JSP etc...) позволяют хранить дескрипторы
>> курсоров в данных сеанса.
>
>
> А ASP.NET разве не держит открытыми пул сессий? В любом случае, не
> браузер же сессии открывает...

Пул -- возможно. Со случайным выбором из пула и с меньшим числом
коннектов в пуле по сравнению с числом Web-клиентов. Думаю, понимаете,
что это означает в контексте задачи?

В общем, все ясно. Web-приложения вы не писали.

Andrew Lesnichenko

unread,
Jan 11, 2006, 7:55:37 AM1/11/06
to
Nick Gazaloff wrote:

>>> (PHP, ASP.NET, ColdFusion, JSP etc...) позволяют хранить дескрипторы
>>> курсоров в данных сеанса.

>> А ASP.NET разве не держит открытыми пул сессий? В любом случае, не
>> браузер же сессии открывает...

> Пул -- возможно. Со случайным выбором из пула и с меньшим числом
> коннектов в пуле по сравнению с числом Web-клиентов. Думаю, понимаете,

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

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

Далее, все J2EE сервера приложений держат контекст. И даже умеют
мигрировать этот контекст с одного хоста на другой в кластере серверов
приложений. ASP.NET, это, насколько я понимаю, виндовозный конкурент
J2EE. Значит и он должен уметь.

Nick Gazaloff

unread,
Jan 11, 2006, 8:40:36 AM1/11/06
to
Andrew Lesnichenko wrote:
> Nick Gazaloff wrote:
>
>>>> (PHP, ASP.NET, ColdFusion, JSP etc...) позволяют хранить дескрипторы
>>>> курсоров в данных сеанса.
>
>
>>> А ASP.NET разве не держит открытыми пул сессий? В любом случае, не
>>> браузер же сессии открывает...
>
>
>> Пул -- возможно. Со случайным выбором из пула и с меньшим числом
>> коннектов в пуле по сравнению с числом Web-клиентов. Думаю, понимаете,
>
>
> Не вижу противоречия ни со случайным выбором ни, тем более, с меньшим
> числом клиентов (соб-но для этого пул и существует).
>
> Например, оракловые пулы всегда держат контекст сессий при выполнении
> обоих условий - кооперативная обработка многих клиентов меньшим числом
> серверных процессов. При этом не требуется никаких изменений на клиенте.

А открытый курсор глобально доступен из любых сессий?


>
> Далее, все J2EE сервера приложений держат контекст. И даже умеют
> мигрировать этот контекст с одного хоста на другой в кластере серверов
> приложений. ASP.NET, это, насколько я понимаю, виндовозный конкурент
> J2EE. Значит и он должен уметь.
>


--

Best regards,

Andrew Lesnichenko

unread,
Jan 11, 2006, 8:50:42 AM1/11/06
to
Nick Gazaloff wrote:

>>> Пул -- возможно. Со случайным выбором из пула и с меньшим числом
>>> коннектов в пуле по сравнению с числом Web-клиентов. Думаю, понимаете,

>> Например, оракловые пулы всегда держат контекст сессий при выполнении

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

> А открытый курсор глобально доступен из любых сессий?

Данный пример (Oracle-пулы) я привел для того, чтобы показать, что пул
может сократить число коннектов и при этом сохранить весь контекст (не
только открытый курсор). Т.е., с т.зрения приложения он прозрачен. Если
вы имеете приложение 1:1 (одно клиентское соединение выливается в одно
ответное серверное) и в нем глобально открытый курсор будет доступен из
любых сессий, то и используя пул вы все это сохрание. И наоборот.

Victor Metelitsa

unread,
Jan 12, 2006, 12:50:13 AM1/12/06
to
Nick Gazaloff wrote:
[...]

>>
>> Все Smalltalk'и (VAST, VW, Squeak и т.д.) это могут (им
>> просто-напросто безразлично, каких классов объекты - атрибуты сеанса). И
>
> Что-то я не слышал о сайтах на Smalltalk.
>
http://smalltalk.cincom.com, напр.

>
>> java.lang.Object getAttribute(java.lang.String key)
>> void setAttribute(java.lang.String name, java.lang.Object value)
>>
>> тоже наводит на определённые мысли.
>
>
> С JSP я не работал, может, вы скажете: там есть возможность не закрывать
> соединение с БД и курсор при переходах между страницами? Вопрос именно в
> этом.

Кто вам мешает сохранить коннект и курсор в атрибуте сеанса? Ведь они
принадлежат классам, порождённым от Object.

Victor Metelitsa

unread,
Jan 12, 2006, 1:00:47 AM1/12/06
to

Ничего не понимаю. Какой смысл имеет "глобально открытый курсор",
доступный из всех сеансов (sessions)? У каждого сеанса должен быть свой
курсор (предположим, что мы делаем свой yandex).

--

Andrew Lesnichenko

unread,
Jan 12, 2006, 1:15:28 AM1/12/06
to
Victor Metelitsa wrote:

> Ничего не понимаю. Какой смысл имеет "глобально открытый курсор",
> доступный из всех сеансов (sessions)? У каждого сеанса должен быть свой
> курсор (предположим, что мы делаем свой yandex).
>

Я этого тоже не понял. Но это вопрос дизайна приложения, а не вопрос
разницы между web и не-web приложением :)

--
Andrew Lesnichenko

Andrew Grachyov

unread,
Jan 14, 2006, 4:25:00 AM1/14/06
to
Hi, Andrew!

Tuesday January 03 2006, Andrew Lening writes to Andrew Grachyov:

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

А это как? Он либо выбиpает что-то по условию, либо листает от начала.
Я до сих поp не вижу (не понимаю) бизнес-задачи, в котоpой такое может
потpебоваться. Hа упоминавшемся sql.ru я никогда не хожу на стpаницу
под опpеделенным номеpом.

Даже в упоминашихся фоpумах, pазбитых по стpаницам, мне бы было удобно
попасть не на опpеделенную стpаницу, а на опpеделенный фоpум. И сделать
это пpавильнее не сpедствами СУБД, а сpедствами Web-интеpфейса.

Более того, если все-таки надо начать "отлистывать" с какого-то момента,
то это пpедполагает какую-то упоpядоченность и всегда можно использовать
сpавнение (типа, какое-то поле больше дpугого). Если упоpядоченности нет,
или она может измениться, то тогда и пеpеход на (к пpимеpу) 5-ю стpаницу
бессмысленен.

Как показывает мой опыт общения с поисковиками и/или стpаницами,
постpоенными с учетом возможности пеpехода на нужную стpаницу (www.price.ru,
google), то типичный алгоpитм моей pаботы - посмотpел пеpвую стpаницу,
затем втоpую, если не нашел - то меняю условие. Я никогда (навеpное :-) )
не заходил на 4-ю или 18-ю стpаницу.

В случае с фоpумами, там где по 10 стpаниц на экpан, все pешается более
логичной выбоpкой по условию (BETWEEN).

В общем, так - я допускаю, что констpукция "выбpать с 34 по 48-ю" записи
будет востpебованной. С дpугой стоpоны, я пока не вижу ситуации, где эта
констpукция будет пpавильным pешением. Хотя...... все возможно.


Пока.

Andrew Grachyov.

Andrew Lening

unread,
Jan 15, 2006, 7:29:49 AM1/15/06
to
Hi, Andrew!

AG> А это как?

Знаешь фразу "практика - критерий истины"? Так вот, такой механизм применяет в
веб-приложениях практически ВЕЗДЕ. В том числе гугль, яндекс и прочие
поисковики, все известные мне веб-форумы и так далее. Утверждать, что это все
делается от неспособности придумать что-то более удобное - по-меньшей мере
самонадеянно. Вся эта заумь просто не прижилась, потому что обычному
пользователю (который этим всем пользуется, а не абстрактно теоретизирует)
нужен ПРОСТОЙ интерфейс. И пролистать пару-тройку экранов ему обычно
действительно проще, чем переформулировать, например, условие поиска на
какое-то более навороченное. Кроме того, запомнить, например, на какой странице
он закончил чтение такой-то ветки форума на порядок проще, чем запомнить,
например, диапазон ключей. В общем, простота - залог успеха интерфейса.

Bye.

Andrew Lesnichenko

unread,
Jan 15, 2006, 1:10:37 PM1/15/06
to
Andrew Lening wrote:

1. Пролистать 2-3 экрана действительно проще, чем переформулировать
запрос. Но только тогда, когда этих экранов 2-3, а не 10. Потому что на
2-3 экрана терпения хватает, а на больше - уже нет. И когда он их читает
подряд.

2. Как, интересно, проще запомнить страницу ветки форума, если
содержимое постоянно меняется?

3. Пример в гуглом (поисковиком), который возвращает результаты поиска,
некорректен, поскольку это свободный поиск, качество которого целиком
определяется качеством вопроса, и раз уж вернулось 200 экранов ссылок,
то никуда не денешься. И еще раз - какой физический смысл выбирать из
этих 200 экранов 3-й, потом 15-й, потом 8-й, вместо чтения подряд?

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

Vladimir Pavlikov

unread,
Jan 15, 2006, 9:07:09 PM1/15/06
to
Hello, Andrew!
You wrote to Andrew Lening on Sat, 14 Jan 2006 12:25:00 +0300:

AG> Как показывает мой опыт общения с поисковиками и/или стpаницами,
AG> постpоенными с учетом возможности пеpехода на нужную стpаницу
AG> (www.price.ru, google), то типичный алгоpитм моей pаботы - посмотpел
AG> пеpвую стpаницу, затем втоpую, если не нашел - то меняю условие. Я
AG> никогда (навеpное :-) ) не заходил на 4-ю или 18-ю стpаницу.

Да тот же прайс, к примеру. Указываешь нежесткие критерии, и получаешь
20 страниц, отсортированных по ценам. Первая половина, состоящая, как
правило, из сомнительных подвалов, малоинтересна. Последняя четверть
тоже - зачем платить лохоразводителям? Т.е. я, к примеру, иду сразу на 12-ю
страницу. Затем по ипсилон-окрестности. Странно, что тебе незнаком этот
сценарий.


With best regards, Vladimir Pavlikov. E-mail: v...@soil.msu.ru


--

Victor Metelitsa

unread,
Jan 16, 2006, 12:49:30 AM1/16/06
to
Andrew Lesnichenko wrote:
[...]

>
> 1. Пролистать 2-3 экрана действительно проще, чем переформулировать
> запрос. Но только тогда, когда этих экранов 2-3, а не 10. Потому что на
> 2-3 экрана терпения хватает, а на больше - уже нет. И когда он их читает
> подряд.
>

К сожалению, мне приходилось читать даже и по 20 страниц подряд.

> 2. Как, интересно, проще запомнить страницу ветки форума, если
> содержимое постоянно меняется?
>

Это помнит браузер. Поэтому, когда я читал, например, страницы 1..9, а
позднее появилась страница 10, это сразу видно, потому что браузер
показывает цветом.

> 3. Пример в гуглом (поисковиком), который возвращает результаты поиска,
> некорректен, поскольку это свободный поиск, качество которого целиком
> определяется качеством вопроса, и раз уж вернулось 200 экранов ссылок,
> то никуда не денешься. И еще раз - какой физический смысл выбирать из
> этих 200 экранов 3-й, потом 15-й, потом 8-й, вместо чтения подряд?
>

Да, читается подряд. Как это отменяет номера страниц?

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

Я так и не понял, как можно сделать лучше.

--

Andrew Lesnichenko

unread,
Jan 16, 2006, 1:10:05 AM1/16/06
to
Victor Metelitsa wrote:

>> 2. Как, интересно, проще запомнить страницу ветки форума, если
>> содержимое постоянно меняется?
>
> Это помнит браузер. Поэтому, когда я читал, например, страницы 1..9, а
> позднее появилась страница 10, это сразу видно, потому что браузер
> показывает цветом.

В данном случае есть ряд неявных предположений:
1. Все сообщения отсортированы в порядке возрастания времени отправки.
2. Все сообщения расположены плоским списком, подряд.

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

П.2 предполагает отсутствие всякой иерархии ответов друг другу, а это
крайне неудобно.

>> 3. Пример в гуглом (поисковиком), который возвращает результаты
>> поиска, некорректен, поскольку это свободный поиск, качество которого
>> целиком определяется качеством вопроса, и раз уж вернулось 200 экранов
>> ссылок, то никуда не денешься. И еще раз - какой физический смысл
>> выбирать из этих 200 экранов 3-й, потом 15-й, потом 8-й, вместо чтения
>> подряд?
>>
> Да, читается подряд. Как это отменяет номера страниц?

А кто говорит про отмену номеров страниц? Я говорю про то, что читают
эти страницы подряд, а не вразнобой.

> Я так и не понял, как можно сделать лучше.
>

Ну вы же Mozilla'ой читаете :) Как там сделан интерфейс ньюсов :) ?

--
Andrew Lesnichenko

Ivan Frolkov

unread,
Jan 15, 2006, 3:41:04 PM1/15/06
to
Sun Jan 15 2006 20:10, Andrew Lesnichenko wrote to Andrew Lening:

AL> барахлом. И делается это не от того, что нельзя придумать удобнее, а
AL> потому, что неудобное барахло уже есть и использовать его гораздо проще,
AL> быстрее и дешевле для владельцев форума.

Альтернативы? ЖЖ? Так там не удобней - и, забавно, что явно видно, как у них
база сообщений лежит в двух таблицах :-)

Alexander Goldun

unread,
Jan 24, 2006, 3:31:49 PM1/24/06
to
Vadim Rumyantsev пишет:

> Да мне наплевать на Microsoft, я их продукцией практически не пользуюсь.
> Пусть
> (к слову о проектировании интерфейсов) сначала научатся в Windows сортировать
> имена файлов так, чтобы "9. Девятая песня.mp3" шло впереди "10. Десятая песня
> ..mp3" (что давным-давно сделано, например, в MacOS).

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

Andrew Grachyov

unread,
Jan 26, 2006, 12:54:00 PM1/26/06
to
Hi, Vladimir!

Monday January 16 2006, Vladimir Pavlikov writes to Andrew Grachyov:

VP> Да тот же прайс, к примеру. Указываешь нежесткие критерии, и получаешь
VP> 20 страниц, отсортированных по ценам. Первая половина, состоящая, как
VP> правило, из сомнительных подвалов, малоинтересна. Последняя четверть
VP> тоже - зачем платить лохоразводителям? Т.е. я, к примеру, иду сразу на
VP> 12-ю страницу. Затем по ипсилон-окрестности. Странно, что тебе незнаком
VP> этот сценарий.

Hожет быть и так. Hо все pавно, для pеализации доступа такого pода
использовал бы куpсоp, а не констpукцию "select c n-й по m-ю". В котоpой,
кстати, почти навеpняка эти паpаметpы не паpаметpизуемы.

Пока.

Andrew Grachyov.

Andrew Grachyov

unread,
Jan 26, 2006, 1:13:00 PM1/26/06
to
Hi, Andrew!

Sunday January 15 2006, Andrew Lening writes to Andrew Grachyov:

AG>> А это как?

AL> Знаешь фразу "практика - критерий истины"?

Фpазу знаю - и в школе и в унивеpситете учил. Вот только пpи чем здесь это?

AL> Так вот, такой механизм
AL> применяет в веб-приложениях практически ВЕЗДЕ. В том числе гугль,
AL> яндекс и
AL> прочие поисковики, все известные мне веб-форумы и так далее.

Какой такой механизм? Вначале показывается пеpвые (скажем) 10, затем
следующие и т.д. FETCH NEXT pулит. Впpочем, если кому-то обсуждаемый
механизм нужен - пусть будет, я не возpажаю.

Вот только одно описание конкpетного синтаксиса SQL тепеpь занимает по 500
стаpниц, и все больши и больше из него ISAM начинает тоpчать. Пpо
совместимость и поддеpжку стандаpтов я вообще не говоpю.....

AL> Утверждать,
AL> что это все делается от неспособности придумать что-то более удобное
AL> -
AL> по-меньшей мере самонадеянно.

Енто, товаpищ, не ко мне. И не по делу - pечь не совсем об этом.

Пока.

Andrew Grachyov.

Vladimir Pavlikov

unread,
Jan 27, 2006, 8:32:53 PM1/27/06
to
Hello, Andrew!
You wrote to Vladimir Pavlikov on Thu, 26 Jan 2006 20:54:00 +0300:

AG> Monday January 16 2006, Vladimir Pavlikov writes to Andrew Grachyov:

VP>> Да тот же прайс, к примеру. Указываешь нежесткие критерии, и получаешь
VP>> 20 страниц, отсортированных по ценам. Первая половина, состоящая, как
VP>> правило, из сомнительных подвалов, малоинтересна. Последняя четверть
VP>> тоже - зачем платить лохоразводителям? Т.е. я, к примеру, иду сразу на
VP>> 12-ю страницу. Затем по ипсилон-окрестности. Странно, что тебе

VP>> незнаком этот сценарий.

AG> Hожет быть и так. Hо все pавно, для pеализации доступа такого pода
AG> использовал бы куpсоp, а не констpукцию "select c n-й по m-ю". В
AG> котоpой, кстати, почти навеpняка эти паpаметpы не паpаметpизуемы.

Констpукция "select c n-й по m-ю" возвращает курсор. Или ты о каком-то
другом курсоре?
Не вижу причин, по которым конструкция д.б. непараметризуема.
Соответственно, откуда "почти навеpняка"?
Ну и, наконец - контекст. Который легко потерять при реагировании
с 10-дневной задержкой :), напоминаю :

> Как показывает мой опыт общения с поисковиками и/или стpаницами,

> постpоенными с учетом возможности пеpехода на нужную стpаницу

> (www.price.ru, google), то типичный алгоpитм моей pаботы - посмотpел

> пеpвую стpаницу, затем втоpую, если не нашел - то меняю условие. Я

> никогда (навеpное :-) ) не заходил на 4-ю или 18-ю стpаницу

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

With best regards, Vladimir Pavlikov. E-mail: v...@soil.msu.ru


--

0 new messages