|
|
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Есть таблица, неважно какая. Предствим что она содержит фотографии. Код: plaintext 1. 2. 3. 4. 5. Скажем там 100к позиций. Поле order отвечает за сортировку при выводе пользователю, то есть пользователь сам может поменять позицию любой фотографии, скажем на jquery. То есть скаватить мышкой в интерфейсе любую позицию и передвинуть её в середину. Соответственно примерно действия должны быть такими. Пользователь берёт позицию `id`='123' and `order`='123' и ставит её на позицию под `order`= '50' соответственно там лежит фотография которая относится к id='50' and `order`='50' то есть все фотографии должны сдвинуться по колонке `order`на одну позицию вверх, то есть и позиция которая была на id=50,`order`='50' становится id=44 ; order`='44' id=45 ; order`='45' id=46 ; order`='46' id=47 ; order`='47' id=48 ; order`='48' id=49 ; order`='49' id=50 ;order`='51' id=51 ; order`='52' ... id=121 ; order`='122' id=122 ; order`='123' id=123 ; order`='50' id=124 ; order`='124' id=125 ; order`='125' id=126 ; order`='126' то есть если пользователь хочет вывести фотографии в своей сортировке он пишет запрос SELECT * FROM `img` ORDER BY `order` asc; Всё конечно хорошо, в чём я очень сильно сомневаюсь, есть одно но.. Пользователь берёт фотографию под `id`=122 ; order`='123' и ставит на место id=45 ; order`='45' и тут затык, причём большой. В чем ошибка сортировки? Можно по подробнее, может надо две таблицы, в одной фотография, в другой сортировка или же всё правильно в таблице, но надо составить хитрый запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:04 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
В табличке ошибка `order` должен быть int(10) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:06 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Я бы предложил ввести для сортировки поле типа FLOAT. Если вам нужно будет вставить записей между двумя какими-то другими записями, то новое значение поля ORDER можно брать как среднее арифметическое между полями ORDER этих двух записей. Таким образом вам не нужно будет апдейтить (что весьма дорогая операция) все записи между старым и новым положением записи. А чтобы наглядность поля не сильно нарушалась - можно периодически (раз в сутки или в месяц) проводить перенумерацию записей с шагом, например, в единицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:10 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
И, кстати, а причем тут MySQL ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:11 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Как то коротко вы ответили, можно поподробнее. Мне кажется float это вовсе не выход, но и не выход update ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:19 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
korasМне кажется float это вовсе не выход, но и не выход update Тут в принципе вариантов может быть только два: 1) перенумеровывать все записи между новым и старым положением перемещаемой записи. 2) найти способ вычислять промежуточное значение между новыми соседями перемещаемой записи. 1-й вариант весьма тяжел. Для 2-ого вариант FLOAT, имхо - весьма неплохой способ. Хотя и не единственный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:29 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Хотя и не единственный. А какие способы ещё есть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 14:47 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
korasХотя и не единственный. А какие способы ещё есть ? Ну можно строками попробовать. Например, строка "101" встанет между строками "10" и "20". Но это менее компактно хранить и сложнее вычислять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 15:03 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
koras, Например, BIGINT: Изначально `order` = `id` << 32 Логика та же, что и с FLOAT. Резерв поля до необходимости проводить перенумерацию - минимум 32 перемещения (это если в одну позицию перемещать). Т.ч. под такую задачу я бы написал процедуру и модификацию проводил через нее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 15:04 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
miksoftИ, кстати, а причем тут MySQL ? поскольку ответа получено не было, топик переношу. Модератор: Тема перенесена из форума "MySQL". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 15:05 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
какая же туту теория? и почему же это не имеет отношения к конкретной БД? например в MS SQL решается триггером, который для записей, находящихся между старой и новой позицией, уменьшает/увеличивает поле "порядок" на 1. есть ли такая возможность в MySQL - я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 17:38 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
U-geneкакая же туту теория? и почему же это не имеет отношения к конкретной БД? например в MS SQL решается триггером, который для записей, находящихся между старой и новой позицией, уменьшает/увеличивает поле "порядок" на 1. есть ли такая возможность в MySQL - я не знаю. Зачем тут триггер? Для перенумерации вполне достаточно одного апдейта практически в любой РСУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 17:47 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
затем, что триггер, который, в ответ на изменение порядкового номера какой-то записи, перенумеровывает другие записи между старой и новой позицией - это совершенно независимое и самодостаточное решение, которое делает ровно то, что нужно сделать. я понимаю, что можно иногда говорить об эффективности, выдумывать хитрые и нестандартные алгоритмы. но здесь КМК - не тот случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 19:09 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
U-geneя понимаю, что можно иногда говорить об эффективности, выдумывать хитрые и нестандартные алгоритмы. но здесь КМК - не тот случай. korasСкажем там 100к позиций.Да нет, уже вполне тот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 19:11 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
U-geneтриггер, который, в ответ на изменение порядкового номера какой-то записи, перенумеровывает другие записи между старой и новой позицией - это совершенно независимое и самодостаточное решение, которое делает ровно то, что нужно сделать. А в мускуле триггерам разрешено менять таблицу для которой они вызваны? И в рекурсию они не уходят?.. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 19:21 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
miksoftДа нет, уже вполне тот. дааа, безумная нагрузка :) А в мускуле триггерам разрешено менять таблицу для которой они вызваны? И в рекурсию они не уходят? Об этом наверное стоило именно там и стоит спрашивать. Пооэтому я и удивляюсь, а почему же тему сюда перенесли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2011, 19:38 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Задача поставлена вертуальная, то есть мне ненадо её реализовывать. Но в задаче по мимо красисого решения должна быть и скорость. Как написано выше, перенумерацию каждыо строки делать не выход, то есть каждую ночь. Это трудоёмкий процесс. Я решил немножко усложнить задачу. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. Представим некую соц сайт. У нас есть много пользователей(табличка `user`), ну скажем 10к. Каждый пользователь загружает фотографии, разное количество в табличку `img` У каждого пользователя есть свой альбом, не стал создавать табличку. и соответственно каждый пользователь, не один как в прошлом примере, сортирует фотографии по своему усмотрению, сортировка в табличке `orderimg`. Пользователи не ограничены в количестве загрузки фотографий, один пользователь может загрузить 1 фотку, а второй закинуть весь свой семейный альбом , 1к фоток. Соответственно пользователи могут менять местами свои фотографии как на примере выше и фотографии могут иметь такой порядок. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. То есть пронумерация строк отпадает сама собой, как вы понимаете о чём речь была выше. По поводу float, даже незнаю. Во первых какие у float ограничения или же их нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 11:31 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
korasТо есть пронумерация строк отпадает сама собой, как вы понимаете о чём речь была выше.С чего бы? Она все так же возможна. И даже более реальна, т.к. апдейтить десятки записей значительно легче, чем апдейтить десятки тысяч записей. korasПо поводу float, даже незнаю. Во первых какие у float ограничения или же их нет. Ограничения есть. Самый (или почти самый) худший случай - когда последовательно происходит установка разных фотографий на одну и ту же не крайнюю позицию. Например, на вторую. Тогда разрядности float (или запасных разрядов в BIGINT) довольно быстро может просто не хватить. Нужно предусмотреть контроль этого и производить досрочную перенумерацию альбома. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 11:48 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Я так понял, что речь идет о демонической системе, где сотни тысяч юзеров только то и делают, что тасуют фотки. Если вдруг я ошибаюсь, то будьте реалистами Возможно, что суммарное время на UPDATE каждой строки за все время существования системы (если сложится) будет меньше того времени, которое вы потратите на написание сюда этих постов. Я уж не говорю про время, потраченное на разработку. Как написано выше, перенумерацию каждыо строки делать не выход, то есть каждую ночь. Это трудоёмкий процесс.....про ночь я вообще не понял. КМК UPDATE для 100к записей займет приблизительно столько же времени, сколько занимает произнесение слова "тьфу" - доли секунды. Хотя мера трудоемкости зависит от степени подготовленности.... есть такое слово - профессионализм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 13:02 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
авторUPDATE для 100к записей займет приблизительно столько же времени, сколько занимает произнесение слова "тьфу" - доли секунды. Тогда расскажите пожалуйста про алгоритм update, фот взял пользователь фотографию и перенёс её Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Скажем пользователь user=44; взял фотографию под id=57 и решил поставить между order`='44' и order`='45'. Что должно происходить в базе и какие запросы должны быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 14:54 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
То есть сами запросы писать ненадо, но примерно, то есть берём order с такого по такой, выбирая только пользователя ну и так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 14:56 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Тогда расскажите пожалуйста про алгоритм 11436448 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 15:03 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
korasСкажем пользователь user=44; взял фотографию под id=57 и решил поставить между order`='44' и order`='45'. Что должно происходить в базе и какие запросы должны быть. Код: plaintext 1. 47 - старый ордер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 15:22 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
miksoft, Это перемещение снизу вверх. А сверху вниз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 15:34 |
|
||
|
Сложная сортировка (проектирование) теория
|
|||
|---|---|---|---|
|
#18+
Ejhimiksoft, Это перемещение снизу вверх. А сверху вниз? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2011, 15:45 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37480856&tid=1541984]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
161ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 519ms |

| 0 / 0 |
