powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Сложная сортировка (проектирование) теория
25 сообщений из 28, страница 1 из 2
Сложная сортировка (проектирование) теория
    #37480657
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, неважно какая. Предствим что она содержит фотографии.
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE IF NOT EXISTS `img` (
  `id` int( 11 ) NOT NULL AUTO_INCREMENT,
  `name` varchar( 255 ) DEFAULT NULL,
  `order` varchar( 255 ) DEFAULT NULL,
)

Скажем там 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' и тут затык, причём большой.

В чем ошибка сортировки?
Можно по подробнее, может надо две таблицы, в одной фотография, в другой сортировка или же всё правильно в таблице, но надо составить хитрый запрос.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480662
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В табличке ошибка `order` должен быть int(10)
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480670
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы предложил ввести для сортировки поле типа FLOAT.
Если вам нужно будет вставить записей между двумя какими-то другими записями, то новое значение поля ORDER можно брать как среднее арифметическое между полями ORDER этих двух записей.
Таким образом вам не нужно будет апдейтить (что весьма дорогая операция) все записи между старым и новым положением записи.

А чтобы наглядность поля не сильно нарушалась - можно периодически (раз в сутки или в месяц) проводить перенумерацию записей с шагом, например, в единицу.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480673
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, а причем тут MySQL ?
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480697
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как то коротко вы ответили, можно поподробнее.
Мне кажется float это вовсе не выход, но и не выход update
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480727
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korasМне кажется float это вовсе не выход, но и не выход update Тут в принципе вариантов может быть только два:
1) перенумеровывать все записи между новым и старым положением перемещаемой записи.
2) найти способ вычислять промежуточное значение между новыми соседями перемещаемой записи.

1-й вариант весьма тяжел.
Для 2-ого вариант FLOAT, имхо - весьма неплохой способ. Хотя и не единственный.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480793
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя и не единственный. А какие способы ещё есть ?
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480853
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korasХотя и не единственный. А какие способы ещё есть ? Ну можно строками попробовать.
Например, строка "101" встанет между строками "10" и "20".
Но это менее компактно хранить и сложнее вычислять.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480856
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koras,

Например, BIGINT:
Изначально `order` = `id` << 32
Логика та же, что и с FLOAT. Резерв поля до необходимости проводить перенумерацию - минимум 32 перемещения (это если в одну позицию перемещать). Т.ч. под такую задачу я бы написал процедуру и модификацию проводил через нее.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37480858
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftИ, кстати, а причем тут MySQL ? поскольку ответа получено не было, топик переношу.

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37481314
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая же туту теория?
и почему же это не имеет отношения к конкретной БД?
например в MS SQL решается триггером, который для записей, находящихся между старой и новой позицией, уменьшает/увеличивает поле "порядок" на 1.
есть ли такая возможность в MySQL - я не знаю.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37481334
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneкакая же туту теория?
и почему же это не имеет отношения к конкретной БД?
например в MS SQL решается триггером, который для записей, находящихся между старой и новой позицией, уменьшает/увеличивает поле "порядок" на 1.
есть ли такая возможность в MySQL - я не знаю. Зачем тут триггер?
Для перенумерации вполне достаточно одного апдейта практически в любой РСУБД.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37481460
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
затем, что триггер, который, в ответ на изменение порядкового номера какой-то записи, перенумеровывает другие записи между старой и новой позицией - это совершенно независимое и самодостаточное решение, которое делает ровно то, что нужно сделать.

я понимаю, что можно иногда говорить об эффективности, выдумывать хитрые и нестандартные алгоритмы. но здесь КМК - не тот случай.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37481464
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneя понимаю, что можно иногда говорить об эффективности, выдумывать хитрые и нестандартные алгоритмы. но здесь КМК - не тот случай. korasСкажем там 100к позиций.Да нет, уже вполне тот.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37481478
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneтриггер, который, в ответ на изменение порядкового номера какой-то записи,
перенумеровывает другие записи между старой и новой позицией - это совершенно независимое
и самодостаточное решение, которое делает ровно то, что нужно сделать.
А в мускуле триггерам разрешено менять таблицу для которой они вызваны? И в рекурсию они
не уходят?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37481489
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftДа нет, уже вполне тот.
дааа, безумная нагрузка :)
А в мускуле триггерам разрешено менять таблицу для которой они вызваны? И в рекурсию они
не уходят?
Об этом наверное стоило именно там и стоит спрашивать. Пооэтому я и удивляюсь, а почему же тему сюда перенесли.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482096
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача поставлена вертуальная, то есть мне ненадо её реализовывать.
Но в задаче по мимо красисого решения должна быть и скорость. Как написано выше, перенумерацию каждыо строки делать не выход, то есть каждую ночь. Это трудоёмкий процесс.

Я решил немножко усложнить задачу.

Код: 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.
-- phpMyAdmin SQL Dump
-- version 3.3.10deb1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Окт 14 2011 г., 10:09
-- Версия сервера: 5.1.54
-- Версия PHP: 5.3.5-1ubuntu7.2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-- --------------------------------------------------------

--
-- Структура таблицы `img`
--

CREATE TABLE IF NOT EXISTS `img` (
  `id` int( 11 ) NOT NULL AUTO_INCREMENT,
  `name` varchar( 10 ) COLLATE utf8_bin NOT NULL COMMENT 'название фотографии',
  `user` int( 5 ) NOT NULL COMMENT 'Пользователь, которому пренадлежит фотография',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT= 5  ;

--
-- Дамп данных таблицы `img`
--

INSERT INTO `img` (`id`, `name`, `user`) VALUES
( 1 , 'img1',  1 ),
( 2 , 'img2',  2 ),
( 3 , 'img3',  1 ),
( 4 , 'img4',  2 );

-- --------------------------------------------------------

--
-- Структура таблицы `orderimg`
--

CREATE TABLE IF NOT EXISTS `orderimg` (
  `id` int( 11 ) NOT NULL AUTO_INCREMENT,
  `img` int( 6 ) NOT NULL,
  `user` int( 6 ) NOT NULL,
  `order` int( 6 ) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT= 3  ;

--
-- Дамп данных таблицы `orderimg`
--

INSERT INTO `orderimg` (`id`, `img`, `user`, `order`) VALUES
( 1 ,  1 ,  1 ,  1 ),
( 2 ,  2 ,  2 ,  1 );

-- --------------------------------------------------------

--
-- Структура таблицы `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int( 11 ) NOT NULL AUTO_INCREMENT,
  `name` varchar( 16 ) COLLATE utf8_bin NOT NULL COMMENT 'Имя пользователя',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT= 3  ;

--
-- Дамп данных таблицы `user`
--

INSERT INTO `user` (`id`, `name`) VALUES
( 1 , 'user1'),
( 2 , 'user2');

Представим некую соц сайт.
У нас есть много пользователей(табличка `user`), ну скажем 10к.
Каждый пользователь загружает фотографии, разное количество в табличку `img`
У каждого пользователя есть свой альбом, не стал создавать табличку. и соответственно каждый пользователь, не один как в прошлом примере, сортирует фотографии по своему усмотрению, сортировка в табличке `orderimg`.
Пользователи не ограничены в количестве загрузки фотографий, один пользователь может загрузить 1 фотку, а второй закинуть весь свой семейный альбом , 1к фоток.
Соответственно пользователи могут менять местами свои фотографии как на примере выше и фотографии могут иметь такой порядок.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
id= 44  ;user= 23 ; order`=' 44 '
id= 45  ;user= 23 ; order`=' 45 '
id= 46  ;user= 23 ; order`=' 46 '
id= 47  ;user= 23 ; order`=' 47 '
id= 48  ;user= 23 ; order`=' 48 '
id= 49  ;user= 23 ; order`=' 49 '
id= 50  ;user= 23 ; order`=' 50 '
id= 51  ;user= 23 ; order`=' 51 ' 
id= 52  ;user= 44 ; order`=' 44 ' 
id= 53  ;user= 44 ; order`=' 45 '
id= 54  ;user= 57 ; order`=' 2 '
id= 55  ;user= 57 ; order`=' 3 '
id= 56  ;user= 44 ; order`=' 46 '
id= 57  ;user= 44 ; order`=' 47 '
id= 58  ;user= 44 ; order`=' 48 '
............

То есть пронумерация строк отпадает сама собой, как вы понимаете о чём речь была выше.
По поводу float, даже незнаю.
Во первых какие у float ограничения или же их нет.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482131
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korasТо есть пронумерация строк отпадает сама собой, как вы понимаете о чём речь была выше.С чего бы? Она все так же возможна. И даже более реальна, т.к. апдейтить десятки записей значительно легче, чем апдейтить десятки тысяч записей.
korasПо поводу float, даже незнаю.
Во первых какие у float ограничения или же их нет. Ограничения есть. Самый (или почти самый) худший случай - когда последовательно происходит установка разных фотографий на одну и ту же не крайнюю позицию. Например, на вторую. Тогда разрядности float (или запасных разрядов в BIGINT) довольно быстро может просто не хватить. Нужно предусмотреть контроль этого и производить досрочную перенумерацию альбома.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482306
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял, что речь идет о демонической системе, где сотни тысяч юзеров только то и делают, что тасуют фотки.
Если вдруг я ошибаюсь, то будьте реалистами
Возможно, что суммарное время на UPDATE каждой строки за все время существования системы (если сложится) будет меньше того времени, которое вы потратите на написание сюда этих постов. Я уж не говорю про время, потраченное на разработку.

Как написано выше, перенумерацию каждыо строки делать не выход, то есть каждую ночь. Это трудоёмкий процесс.....про ночь я вообще не понял.
КМК UPDATE для 100к записей займет приблизительно столько же времени, сколько занимает произнесение слова "тьфу" - доли секунды. Хотя мера трудоемкости зависит от степени подготовленности.... есть такое слово - профессионализм.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482597
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторUPDATE для 100к записей займет приблизительно столько же времени, сколько занимает произнесение слова "тьфу" - доли секунды.

Тогда расскажите пожалуйста про алгоритм update, фот взял пользователь фотографию и перенёс её
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
id= 44  ;user= 23 ; order`=' 44 '
id= 45  ;user= 23 ; order`=' 45 '
id= 46  ;user= 23 ; order`=' 46 '
id= 47  ;user= 23 ; order`=' 47 '
id= 48  ;user= 23 ; order`=' 48 '
id= 49  ;user= 23 ; order`=' 49 '
id= 50  ;user= 23 ; order`=' 50 '
id= 51  ;user= 23 ; order`=' 51 ' 
id= 52  ;user= 44 ; order`=' 44 ' 
id= 53  ;user= 44 ; order`=' 45 '
id= 54  ;user= 57 ; order`=' 2 '
id= 55  ;user= 57 ; order`=' 3 '
id= 56  ;user= 44 ; order`=' 46 '
id= 57  ;user= 44 ; order`=' 47 '
id= 58  ;user= 44 ; order`=' 48 '

Скажем пользователь user=44; взял фотографию под id=57 и решил поставить между order`='44' и order`='45'. Что должно происходить в базе и какие запросы должны быть.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482602
koras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть сами запросы писать ненадо, но примерно, то есть берём order с такого по такой, выбирая только пользователя ну и так далее.
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482621
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда расскажите пожалуйста про алгоритм
11436448
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482672
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korasСкажем пользователь user=44; взял фотографию под id=57 и решил поставить между order`='44' и order`='45'. Что должно происходить в базе и какие запросы должны быть.
Код: plaintext
1.
UPDATE mytable SET order = CASE WHEN order <  47  THEN order +  1  ELSE  45  END
WHERE user =  44  AND order >=  45  AND order <= 47 
45 - новый ордер
47 - старый ордер
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482701
Ejhi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Это перемещение снизу вверх.

А сверху вниз?
...
Рейтинг: 0 / 0
Сложная сортировка (проектирование) теория
    #37482722
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ejhimiksoft,

Это перемещение снизу вверх.

А сверху вниз?
Код: plaintext
1.
UPDATE mytable SET order = CASE WHEN order >  45  THEN order -  1  ELSE  47  END
WHERE user =  44  AND order >=  45  AND order <= 47 
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Сложная сортировка (проектирование) теория
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]