Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Сложная сортировка (проектирование) теория / 25 сообщений из 28, страница 1 из 2
13.10.2011, 14:04
    #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
13.10.2011, 14:06
    #37480662
koras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
В табличке ошибка `order` должен быть int(10)
...
Рейтинг: 0 / 0
13.10.2011, 14:10
    #37480670
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
Я бы предложил ввести для сортировки поле типа FLOAT.
Если вам нужно будет вставить записей между двумя какими-то другими записями, то новое значение поля ORDER можно брать как среднее арифметическое между полями ORDER этих двух записей.
Таким образом вам не нужно будет апдейтить (что весьма дорогая операция) все записи между старым и новым положением записи.

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

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

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

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

я понимаю, что можно иногда говорить об эффективности, выдумывать хитрые и нестандартные алгоритмы. но здесь КМК - не тот случай.
...
Рейтинг: 0 / 0
13.10.2011, 19:11
    #37481464
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
U-geneя понимаю, что можно иногда говорить об эффективности, выдумывать хитрые и нестандартные алгоритмы. но здесь КМК - не тот случай. korasСкажем там 100к позиций.Да нет, уже вполне тот.
...
Рейтинг: 0 / 0
13.10.2011, 19:21
    #37481478
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
U-geneтриггер, который, в ответ на изменение порядкового номера какой-то записи,
перенумеровывает другие записи между старой и новой позицией - это совершенно независимое
и самодостаточное решение, которое делает ровно то, что нужно сделать.
А в мускуле триггерам разрешено менять таблицу для которой они вызваны? И в рекурсию они
не уходят?..
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
13.10.2011, 19:38
    #37481489
U-gene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
miksoftДа нет, уже вполне тот.
дааа, безумная нагрузка :)
А в мускуле триггерам разрешено менять таблицу для которой они вызваны? И в рекурсию они
не уходят?
Об этом наверное стоило именно там и стоит спрашивать. Пооэтому я и удивляюсь, а почему же тему сюда перенесли.
...
Рейтинг: 0 / 0
14.10.2011, 11:31
    #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
14.10.2011, 11:48
    #37482131
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
korasТо есть пронумерация строк отпадает сама собой, как вы понимаете о чём речь была выше.С чего бы? Она все так же возможна. И даже более реальна, т.к. апдейтить десятки записей значительно легче, чем апдейтить десятки тысяч записей.
korasПо поводу float, даже незнаю.
Во первых какие у float ограничения или же их нет. Ограничения есть. Самый (или почти самый) худший случай - когда последовательно происходит установка разных фотографий на одну и ту же не крайнюю позицию. Например, на вторую. Тогда разрядности float (или запасных разрядов в BIGINT) довольно быстро может просто не хватить. Нужно предусмотреть контроль этого и производить досрочную перенумерацию альбома.
...
Рейтинг: 0 / 0
14.10.2011, 13:02
    #37482306
U-gene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
Я так понял, что речь идет о демонической системе, где сотни тысяч юзеров только то и делают, что тасуют фотки.
Если вдруг я ошибаюсь, то будьте реалистами
Возможно, что суммарное время на UPDATE каждой строки за все время существования системы (если сложится) будет меньше того времени, которое вы потратите на написание сюда этих постов. Я уж не говорю про время, потраченное на разработку.

Как написано выше, перенумерацию каждыо строки делать не выход, то есть каждую ночь. Это трудоёмкий процесс.....про ночь я вообще не понял.
КМК UPDATE для 100к записей займет приблизительно столько же времени, сколько занимает произнесение слова "тьфу" - доли секунды. Хотя мера трудоемкости зависит от степени подготовленности.... есть такое слово - профессионализм.
...
Рейтинг: 0 / 0
14.10.2011, 14:54
    #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
14.10.2011, 14:56
    #37482602
koras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
То есть сами запросы писать ненадо, но примерно, то есть берём order с такого по такой, выбирая только пользователя ну и так далее.
...
Рейтинг: 0 / 0
14.10.2011, 15:03
    #37482621
U-gene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
Тогда расскажите пожалуйста про алгоритм
11436448
...
Рейтинг: 0 / 0
14.10.2011, 15:22
    #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
14.10.2011, 15:34
    #37482701
Ejhi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная сортировка (проектирование) теория
miksoft,

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

А сверху вниз?
...
Рейтинг: 0 / 0
14.10.2011, 15:45
    #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]