|
|
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
Часто так бывает что записи из таблицы нужно выводить в определенном порядке, и порядок этот надо задавать в GUI. То есть при добавлении новой записи она попадает в конец таблицы, но пользователь должен иметь возможность передвинуть ее на произвольную позицию вверх или вниз. Что-то я ни разу не видел красивого решения данной задачи. Первое что приходит в голову - ставить какой-то триггер, который при обновлении поля row_position заделывал бы дырку нумерации в старом месте, а потом проделывал бы дырку в нумерации для нового места. Так же я видел решение основанное на числах с плавающей запятой, где если нужно поместить строку между строк A и Б, берется среднее арифметическое от row_position A и Б. Что-то оба подхода мне не нравятся и создается впечатление что у меня есть какой-то большой пробел то ли в теории, то ли в практике, и вообще я хочу странного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2011, 20:48 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
gehreleth, 1. О какой дырке в нумерации идёт речь? Пользователю нужно кроме корректно отсортированных записей ещё и номер по порядку видеть? 2. Числа с плавающей запятой - нормальное решение, если в нём учтён вариант, когда среднее арифметическое будет равно row_position А или Б из-за точности числа. 3. Возьмёшь вместо чисел с плавающей запятой для row_position строку - будешь возиться с максимальной длиной и правилами формирования row_position. 4. Возьмёшь вместо чисел с плавающей запятой целые - всё равно уткнёшься в вариант, когда среднее арифметическое будет равно row_position А и Б. 5. Не брать какое нибудь среднее значение - значит перенумеровывать ВСЕ строки - "неприкольно"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2011, 22:23 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
АнатоЛой, Нашел грамотный запрос для гугла под эту проблему, выглядит так "sql priority queues". Походу кроме плавающей запятой действительно ничего нет такого что не потребовало бы обновлять всю таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2011, 23:05 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
АнатоЛой... 5. Не брать какое нибудь среднее значение - значит перенумеровывать ВСЕ строки - "неприкольно"... 1 ну не ВСЕ, а только те, что "ниже" (с большим row_position)... и делать же, это нужно - не курсором, - 2-х запросов - хватит при вставке - 1-ин UPDATE + 1-ин INSERT при удвлении - 1-ин DELETE + 1-ин UPDATE даа, в транзакцию это завернуть... имхо - вполне вариант 2 если от "теории" к "практике", то всё это "счастье" нужно как-то представить в клиентском приложении т.е. - будет какой-то список упорядоченный + пара кнопочек "вверх"/"вниз" (собственно, так обычно всё и выглядит в тех же микрософтовских продуктах) вставка - в конец списка. нужно переместить - вперёд давить кнопки "со стрелками" в этом случае - вообще всё просто, - выполняется только "обмен" между 2-мя соседями, одним запросом, без всяких транзакций Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 09:23 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
qwerty112АнатоЛой... 5. Не брать какое нибудь среднее значение - значит перенумеровывать ВСЕ строки - "неприкольно"... 1 ну не ВСЕ, а только те, что "ниже" (с большим row_position)... Согласен ударился в крайности. Но есть случаи - когда таки все . В реальности - зависит от прикладной задачи. qwerty112и делать же, это нужно - не курсором, - 2-х запросов - хватит при вставке - 1-ин UPDATE + 1-ин INSERT при удвлении - 1-ин DELETE + 1-ин UPDATE даа, в транзакцию это завернуть... имхо - вполне вариант При плавающей точке - один простой UPDATE/DELETE/INSERT над одной записью + достаточна редкая обработка граничных случаев (не сложнее, чем в случае без средних значений). На небольших объёмах и однопользовательской работе - всё равно. Большие объёмы для подобной задачи придумать сложно - пропускаем. А вот при многопользовательской работе - вариант со средним значением более эффективен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 12:02 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
gehrelethЧасто так бывает что записи из таблицы нужно выводить в определенном порядке, и порядок этот надо задавать в GUI. У меня вопрос: причем тут, вообще, БД? gehrelethТо есть при добавлении новой записи она попадает в конец таблицы, В общем случае, это - заблуждение. gehrelethно пользователь должен иметь возможность передвинуть ее на произвольную позицию вверх или вниз. Что-то я ни разу не видел красивого решения данной задачи. В GUI или в таблице БД? Если в таблице БД, то красивого решения этой задачи не может быть, ибо сама задача бредовая: на кой ляд пользователю менять физическое расположение строк таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 12:30 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
On 03.07.2011 21:48, gehreleth wrote: > Часто так бывает что записи из таблицы нужно выводить в определенном порядке, select * from thetable ORDER BY order_field и > порядок этот надо задавать в GUI. update thetable set order_field = ... where pk = :pk То есть при добавлении новой записи она > попадает в конец таблицы, Никакого конца, как и начала, у таблиц нет. Это -- твои фантазии. Таблица -- это set (или bag), несортированный. > Что-то оба подхода мне не нравятся и создается впечатление что у меня есть > какой-то большой пробел то ли в теории, то ли в практике, и вообще я хочу странного. update thetable set order_field = ... where pk = :pk update thetable set order_field = order_field + 1 where pk > :pk Всё, что надо для счастья. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 12:42 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
baracsgehrelethЧасто так бывает что записи из таблицы нужно выводить в определенном порядке, и порядок этот надо задавать в GUI. У меня вопрос: причем тут, вообще, БД? Потому что нужно спроектировать такую схему данных для БД baracsgehrelethТо есть при добавлении новой записи она попадает в конец таблицы, В общем случае, это - заблуждение. Я что, написал "в физический конец таблицы"? Нет, я написал про ту таблицу которая отображается на экране у пользователя. baracsgehrelethно пользователь должен иметь возможность передвинуть ее на произвольную позицию вверх или вниз. Что-то я ни разу не видел красивого решения данной задачи. В GUI или в таблице БД? Если в таблице БД, то красивого решения этой задачи не может быть, ибо сама задача бредовая: на кой ляд пользователю менять физическое расположение строк таблицы? Ну менять логическое расположение строк ляд есть, и вполне конкретный. Потому что программа генерирует отчеты, данные в которых должны отображаться в последовательности определяемой пользователем, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 13:45 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
gehrelethbaracsпропущено... У меня вопрос: причем тут, вообще, БД? Потому что нужно спроектировать такую схему данных для БД Какую "такую"? Какое отношение сортировка данных в гриде (таблице на экране) вашего GUI имеет к схеме БД? gehrelethНу менять логическое расположение строк ляд есть, и вполне конкретный. Потому что программа генерирует отчеты, данные в которых должны отображаться в последовательности определяемой пользователем, например. Ну вот, пусть и определяет ее в приложении, генерирующем отчеты, сколько душе угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 15:05 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
MasterZiv update thetable set order_field = ... where pk = :pk update thetable set order_field = order_field + 1 where pk > :pk Всё, что надо для счастья. второй update - для геморроя :). По задаче подразумевается, что order_field и pk не имеют зависимости. А этот апдейт пытается сказать, что зависимость есть. Нехорошо. Наверное так: update thetable set order_field = order_field + 1 where order_field >= :order_field_for_new_record; update thetable set order_field = :order_field_for_new_record where pk = :pk; ? П.С.: Мы не апдейты обсуждаем - а подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 15:33 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
baracsКакое отношение сортировка данных в гриде (таблице на экране) вашего GUI имеет к схеме БД? пример с отчётом от ТС, действительно выглядит натянуто и мало имеет отношения к схеме БД... со схемой :) есть сущ.Объект идОбъектнаименование1Объект1 есть сущ.Операция идОперациянаименование1Операция12Операция23Операция3 и есть ОперацииНадОбъектом ПорядокВыполнения идОбъектидОперация113212313411 1 над одним объектом может выполнятся множество операций, в том числе, одна и та же операция может применятся несколько раз 2 порядок применения операций над объектом - определяет результат (т.е. теже самые операции, выполненные над одним и тем же объектом, НО в разной последовательности - дадут разный результат ) нуу и как бы, вопрос как дать пользователю/клиентскому приложению, простой и надёжный механизм редактирования таб.ОперацииНадОбъектом ? т.е. возможные правки: - удаление Операции из списка(в произвольном месте, разумеется) - вставка новой Операции (в произвольное место списка) - перестановка местами 2-х Операций ...и т.д. об этом, имхо, и был вопрос ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 17:09 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
On 04.07.2011 16:33, АнатоЛой wrote: > второй update - для геморроя :). По задаче подразумевается, что order_field и pk > не имеют зависимости. > А этот апдейт пытается сказать, что зависимость есть. Нехорошо. > Наверное так: Я там неправильно порядок указал, второй UPDATE должен быть первым, а первый -- всторым. И если рассуждать о геморое -- оно тут для гемороя всё. И на счёт WHERE update-ов -- я их естественно для иллюстрации только написал, я не знаю, какие у автора топика условия. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 17:35 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
qwerty112со схемой :) есть сущ.Объект идОбъектнаименование1Объект1 есть сущ.Операция идОперациянаименование1Операция12Операция23Операция3 и есть ОперацииНадОбъектом ПорядокВыполнения идОбъектидОперация113212313411 1 над одним объектом может выполнятся множество операций, в том числе, одна и та же операция может применятся несколько раз 2 порядок применения операций над объектом - определяет результат (т.е. теже самые операции, выполненные над одним и тем же объектом, НО в разной последовательности - дадут разный результат ) нуу и как бы, вопрос как дать пользователю/клиентскому приложению, простой и надёжный механизм редактирования таб.ОперацииНадОбъектом ? т.е. возможные правки: - удаление Операции из списка(в произвольном месте, разумеется) - вставка новой Операции (в произвольное место списка) - перестановка местами 2-х Операций ...и т.д. об этом, имхо, и был вопрос ... Ну, если вопрос в том, как хранить в БД связь многие-ко-многим, то вы на него уже ответили: таблицу-связку сделать. У меня же, возникло ощущение, что ТС смутно различает функционал клиентского приложения и СУБД. Отсюда и вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 17:50 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
baracs Ну, если вопрос в том, как хранить в БД связь многие-ко-многим, то вы на него уже ответили: таблицу-связку сделать. У меня же, возникло ощущение, что ТС смутно различает функционал клиентского приложения и СУБД. Отсюда и вопросы. нуу, если "расписание" - это многие-ко-многим, то даа - тут многие-ко-многим :) а вопрос, я вообщем-то выделил, хотя - согласен, - вопрос несколько не для форума "Проектирование БД" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2011, 18:58 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
baracsУ меня же, возникло ощущение, что ТС смутно различает функционал клиентского приложения и СУБД. Отсюда и вопросы. Я в шоке... То есть на клиенте себе сортируй сколько хочешь. А если завтра придёшь - то сортируй заново? Логично, что пользовательский порядок отображения данных из БД нужно сохранить в той же БД - чтобы завтра и послезавтра второй и третий раз не сортировать... В чём вопрос?... Привожу пример - товары на полке нужно расположить сегодня в определённом порядке... И порядок задаёт сам мерчандайзер... А завтра захотелось парочку товаров переставить - и так они будут стоять недельку, пока опять не переставим... Это всё на клиенте хранить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2011, 00:54 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
АнатоЛойbaracsУ меня же, возникло ощущение, что ТС смутно различает функционал клиентского приложения и СУБД. Отсюда и вопросы. Я в шоке... То есть на клиенте себе сортируй сколько хочешь. А если завтра придёшь - то сортируй заново? Логично, что пользовательский порядок отображения данных из БД нужно сохранить в той же БД - чтобы завтра и послезавтра второй и третий раз не сортировать... В чём вопрос?... Привожу пример - товары на полке нужно расположить сегодня в определённом порядке... И порядок задаёт сам мерчандайзер... А завтра захотелось парочку товаров переставить - и так они будут стоять недельку, пока опять не переставим... Это всё на клиенте хранить? Спасибо, что объяснили, чего хотел автор топика. А то, он начал писать про последовательность данных в отчетах... P.S. С товарами на полках пример не вполне удачный: в таких задачах полки делятся на конечные интервалы, которые может занимать тот или иной товар. Соответственно, полки и интервалы нумеруются раз и на всегда, а меняется привязка товаров к ним. Или просто указывается количество интервалов (юнитов), которые может (должен) занимать данный товар на полках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2011, 10:57 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
baracsС товарами на полках пример не вполне удачный: в таких задачах полки делятся на конечные интервалы, которые может занимать тот или иной товар. Соответственно, полки и интервалы нумеруются раз и на всегда, а меняется привязка товаров к ним. Если речь о том чтобы печатать путевые листы для расклейщиков афиш, то есть такоое требование что данные должны быть отсортированы в том порядке в котором их обходит расклейщик, а во вторых они меняются со временем т.к в них добавляются новые щиты на новых адресах и изымаются старые. Кроме того, там есть такой функционал что нужно создать новый маршрут и перекинуть часть щитов на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2011, 10:57 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
gehrelethЕсли речь о том чтобы печатать путевые листы для расклейщиков афиш, то есть такоое требование что данные должны быть отсортированы в том порядке в котором их обходит расклейщик, а во вторых они меняются со временем т.к в них добавляются новые щиты на новых адресах и изымаются старые. Кроме того, там есть такой функционал что нужно создать новый маршрут и перекинуть часть щитов на него. Структура описна здесь . Считываете в датасет своего GUI строки, относящиеся к данному маршруту. Пользователь сортирует их в гриде. Когда пользователь нажимает кнопку "сохранить", обновляете в датасете значения колонки [порядок выполнения], в соответствии с новым порядком сортировки, сохраняете изменения в БД. Полагаю, за рабочий день расклейшик не сможет обойти такое количество рекламных щитов, чтобы напрячь сервер апдейтом соответствующего количества строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2011, 12:22 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
А если пользователей будет несколько, и каждый будет считать правильным свой порядок? Тогда придется отдельную таблицу заводить со столбцами ид_пользователя, ид_строки, порядок. Минусы - при выборке придется LEFT JOIN'ить отдельную таблицу и сортировать по ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2011, 17:08 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
gehrelethи создается впечатление что у меня есть какой-то большой пробел то ли в теории, то ли в практике, и вообще я хочу странного. В общем да, хочешь странного. Задача сомнительная, хотя легко решаемая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Может, ошибся в какой мелочи, но идея имхо понятна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2011, 20:59 |
|
||
|
Некоторый пробел по практике.
|
|||
|---|---|---|---|
|
#18+
gehrelethЧасто так бывает что записи из таблицы нужно выводить в определенном порядке, и порядок этот надо задавать в GUI. То есть при добавлении новой записи она попадает в конец таблицы, но пользователь должен иметь возможность передвинуть ее на произвольную позицию вверх или вниз. Что-то я ни разу не видел красивого решения данной задачи. Первое что приходит в голову - ставить какой-то триггер, который при обновлении поля row_position заделывал бы дырку нумерации в старом месте, а потом проделывал бы дырку в нумерации для нового места. Так же я видел решение основанное на числах с плавающей запятой, где если нужно поместить строку между строк A и Б, берется среднее арифметическое от row_position A и Б. Что-то оба подхода мне не нравятся и создается впечатление что у меня есть какой-то большой пробел то ли в теории, то ли в практике, и вообще я хочу странного. смотря какие данные, 1) сортируй в гриде, 2) во вьюхе 3) в крайнем случае в самой таблице придусмотреть поле ORD (и снова гоу п1. или п.2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2011, 09:40 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37334547&tid=1542084]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
254ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 534ms |

| 0 / 0 |
