Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранение порядка строк в таблице / 21 сообщений из 21, страница 1 из 1
21.10.2015, 15:07
    #39082497
dymka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Приветствую!

Приложение клиент-сервер. Все на ХП. Delph/SQL Server 2008 R2, но не суть.

Подскажите "правильное" решение вот такой задачи:
Пользователь вводит операции (записи) в определенном порядке - ему этот порядок важен.
Нужно уметь вставлять новую операцию (читай запись) внутрь, тасовать (драг-н-дроп) операции, удалять.
Как правильно организовать структуру хранения?

Пока варианта 3 в башку пришло:

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

2. Связной список. Хранить поле, ссылающееся на предыдущий элемент.
+Вставка, удаление затрагивает только две записи.
-Чуть более сложный select (CTE). Если в БД ковыряться напрямую (такое бывает), то можно разорвать список.
Защититься можно триггером.

3. Сделать поле номера записи типа float. И при вставке находить среднее между вставляемыми записями и писать туда.
+Естественный порядок сортировки сохраняется. Запрос уж через row_number(order by float_index).
-Нельзя вставить очень много записей, т.к. разрешающая способность float ограничена. ну вставка 20 записей "расщепит" его до одной миллионной. Можно конечно, каждые 20 (или другое кол-во) вставок делать перенумерацию (как в старом добром бейсике).

Но это все "мои велосипеды". Может есть нормальные, проверенные временем, решения, лишенные недостатков?
...
Рейтинг: 0 / 0
21.10.2015, 16:09
    #39082599
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
>1. Хранить номер записи в отдельном поле.
Да, причем int

>как в старом добром бейсике
Да, только не через 10, а что нибудь со степенью двойки

>каждые 20 (или другое кол-во) вставок делать перенумерацию
Не каждые n, а когда вставить не получится: операция 6,7,8 - пользователь сдвинул операцию 8 в середину - пошла перенумерация только для этой сессии пользователя
...
Рейтинг: 0 / 0
21.10.2015, 16:18
    #39082620
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymka1. Хранить номер записи в отдельном поле.
проще всего. Нет даже смысла выдумывать что-то кроме этого типового решения.

p.s. это кстати (№1) не "твой велосипед", а типовое решение. Вот остальные варианты конечно твои велосипеды. Сделай проще...
...
Рейтинг: 0 / 0
21.10.2015, 16:41
    #39082647
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymka,

1) или 3), в зависимости от того, как часто производится перенумерация, и как велика таблица.

Есть и промежуточное решение (вполне очевидное) -- хранить порядковый номер в виде числа с фиксированной точкой (int, numeric) ,
но через , скажем, 10, и соотв. либо вставлять в центр, либо если нет уже места -- перенумеровывать.

НО может быть идея с float не так и плоха, просто надо вставлять изначально с нормальными интервалами между записями,
а то потом чисто теоретически при делении диапазонов возможа потеря значимости.
...
Рейтинг: 0 / 0
21.10.2015, 16:56
    #39082666
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
MasterZivможет быть идея с float не так и плоха, просто надо вставлять изначально с
нормальными интервалами между записями
С ней прикол в том, что количество итераций до потери точности не зависит от начальных
интервалов. Double надо использовать вместо Float.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
21.10.2015, 16:57
    #39082668
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Вы уверены, что этот момент вообще нужно оптимизировать? У Вас будут десятки тысяч пользователей, одновременно переставляющие что-то в своих тысячных наборах?
...
Рейтинг: 0 / 0
22.10.2015, 07:51
    #39083006
dymka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Сама-то таблица может и большая, но пользователь работает со срезом не более 100 записей.
Проблема не в оптимизации - там реально один срез редактирует один человек, просто интересно, как такая задача решается в РБД "академически" что-ли.
Ну и как-то неправильно, на мой взгляд, после правки каждой записи заново запрашивать весь набор, пусть и всего 100 записей.
Или при вставке одной записи внутрь выполнять апдейт этих 100 записей (ну ладно, в среднем меньше в два раза, так как апдейтить нужно только записи с большим номером). Отсюда и размышления мои...
...
Рейтинг: 0 / 0
22.10.2015, 12:12
    #39083302
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymkaСама-то таблица может и большая, но пользователь работает со срезом не более 100 записей.
Проблема не в оптимизации - там реально один срез редактирует один человек, просто интересно, как такая задача решается в РБД "академически" что-ли.
Ну и как-то неправильно, на мой взгляд, после правки каждой записи заново запрашивать весь набор, пусть и всего 100 записей.
Или при вставке одной записи внутрь выполнять апдейт этих 100 записей (ну ладно, в среднем меньше в два раза, так как апдейтить нужно только записи с большим номером). Отсюда и размышления мои...
Ну если разделить целое на части (диалектика типа) и смотреть только на часть БД (без клиента), то как бы Вы ставите вопрос о хранении информации о манипуляциях объектами.
Ну тада как обычно в таких случаях можно начать с концепции: добавить сущность манипулирования объектами: имя типа "Операции манипулирования операции" (при первом придумывании можно самые дурацкие имена, мне кажется). Потом свой-ства: типа ИД обоекта, ИД Пред, ИД Некст, Порядок операции по времени. Типа то которое позже по времени то и актуально. Тут явно меняется толко одна сущности при одном перемещении, но вычисление нужной инфы в РМД может быть посложнее.
Потом все это уже пытаться встоить в таблы логическое проектирование. Там рассмотреть и Ваши 1 и 2 варианты , и варианты с новыми таблицами для этой информации. по сложности запросов и по апдейтам. Искать оптимальное для Вашей ситуации. Так, мне кажется, и больше шансов не пропустить варианты. И как бы более укладывается в схемы методологий проектирования рекомендованные в книжках.
...
Рейтинг: 0 / 0
22.10.2015, 12:36
    #39083361
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Dimitry SibiryakovMasterZivможет быть идея с float не так и плоха, просто надо вставлять изначально с
нормальными интервалами между записями
С ней прикол в том, что количество итераций до потери точности не зависит от начальных
интервалов. Double надо использовать вместо Float.


Да, вообще да. Прикольно, что интуитивно это неясно...
...
Рейтинг: 0 / 0
22.10.2015, 12:37
    #39083363
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
для трехзвенной архитектуры конечно немного "дикостью" выглядит обсуждение настолько уже банального вопроса, что его и вопросом назвать нельзя. Уже и сущности в ход пошли и диалектика. Это не в сторону авторов высказываний, а просто сама постановка вопроса, которая и не всплыла бы даже. Речь идет о банальной милисекундной нумерации строк и отправке серверу в итоге примитивного SQL на update
...
Рейтинг: 0 / 0
22.10.2015, 12:40
    #39083372
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymkaСама-то таблица может и большая, но пользователь работает со срезом не более 100 записей.
Проблема не в оптимизации - там реально один срез редактирует один человек, просто интересно, как такая задача решается в РБД "академически" что-ли.


Это не какая-то супермега математическая задача. Нужен порядок -- храни. Нужно менять порядок -- перенумеруй.

dymkaНу и как-то неправильно, на мой взгляд, после правки каждой записи заново запрашивать весь набор, пусть и всего 100 записей.


Что неправильного ? 100 записей -- немного. Операция сортировки затрагивает все записи, почему бы их и не перечитать ?
Миллион записей человек бы руками не стал сотрировать -- просто не сможет.
...
Рейтинг: 0 / 0
22.10.2015, 13:34
    #39083481
Cane Cat Fisher
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymka,

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

Например, добавлены три записи:

000123.
000124.
000125.

А теперь впихиваем между ними еще две:

000123.
000123.1
000123.2

000124.
000125.

Это и охота, и зверей убивать всю таблицу перенумеровывать не надо.


А вообще, конечно, бери вариант 1. На 2 и 3 смотреть, только если предвидятся реальный проблемы с массовой перенумерацией.

Еще можно добавить отдельное поле - номер раздела. Тогда позиция строки = номер раздела + номер строки в разделе. При вставке строки перенумеровывать придется только один раздел.
...
Рейтинг: 0 / 0
22.10.2015, 14:03
    #39083543
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymkaНо это все "мои велосипеды". Может есть нормальные, проверенные временем, решения, лишенные недостатков?

Нормального решения нет, т.к. вы пытаетесь решить задачу которая в рамках РМД решается плохо (точнее никак).
Поэтому так или иначе будет сделан костыль.

Какой костыль выбрать зависит от задачи.

Я бы вообще посмотрел в сторону не РМД-ных расширений БД.
Например массивы или JSON-типы.
Но опять же это зависит от задачи и насколько нужны "отношения" в "порядках".
...
Рейтинг: 0 / 0
22.10.2015, 17:35
    #39083971
Serguei
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Cane Cat FisherПри вставке строки перенумеровывать придется только один раздел.

Какая разница в каком поле перенумеровывать - все равно ведь это придется делать. Так что смысла в номере раздела нет никакого.
...
Рейтинг: 0 / 0
22.10.2015, 18:43
    #39084035
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Народ вы что?
Какое символьное поле, какой float, зачем для воробьев использовать даже не пушку, а межконтинентальную баллистическую ракету.
Порядковый номер этапа должен быть уникальным только для операции.
Сколько может быть этапов в операции для сортировки человеком: десятки, максимум сотни, да хоть бы и тысячи. В int32 хранится два миллиарда значений, делай шаг в миллион и перенумерация превратится в чистую теорию.
...
Рейтинг: 0 / 0
22.10.2015, 19:02
    #39084055
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
SERG1257В int32 хранится два миллиарда значений, делай шаг в миллион и перенумерация превратится в чистую теорию..... если не изменять порядок
...
Рейтинг: 0 / 0
22.10.2015, 19:12
    #39084065
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
на самом деле много существует различных документов, где нумерация имеет важное значение. И конечно требуется функция для ее изменения, и всегда встречаются ситуации когда требуется изменить порядок, вставлять строки в середину и т.п.
...
Рейтинг: 0 / 0
22.10.2015, 19:44
    #39084084
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
iscrafm если не изменять порядок Не понял

Первая запись - 1
Вторая запись - миллион
Третья запись - два миллиона

Третья запись пошла в середину между первой и второй - получила номер пол-миллиона
Бывшая вторая с номером миллион пошла в середину - получила номер четверть миллиона и так далее.

Пусть пользователь развлекается с этим 20 раз - следующая запись получила номер два
Теперь передвинуть в середину уже нельзя - вот только тогда и перенумеруем все записи -
первой номер 1
второй миллион
третьей два миллиона

Надо передвинуть вперед списка - назначаем номер минус миллион.
...
Рейтинг: 0 / 0
22.10.2015, 20:53
    #39084114
Cane Cat Fisher
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
SergueiCane Cat FisherПри вставке строки перенумеровывать придется только один раздел.

Какая разница в каком поле перенумеровывать - все равно ведь это придется делать. Так что смысла в номере раздела нет никакого.

Разница в том, перенумеровывать ли все миллионы записей, или только десяток - в пределах одного раздела.
...
Рейтинг: 0 / 0
23.10.2015, 11:55
    #39084489
dymka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
Если кому интересно.
Сделал по чуть-чуть модифицированному варианту №1 - нумерация идет через 2:
+ Проще вставить новую запись (вставка нечетного номера между записями).
+ Проще переместить запись (драг-н-дроп) - просто присваивается новый нечетный номер между двух других записей.
После этих операций - один апдейт на "renum" опять через 2. На клиенте делаю полный перезапрос, хотя потом и это можно будет избежать, осуществляя перенумерация локально параллельно с серверной.

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

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

SERG1257, если делать шаг миллион, то этого хватить, чтобы вставить, к примеру, перед какой-то определенной записью всего 20 новых. Но к слову, у нас это редкий случай. Хотя кто их пользователей знает... Иногда такое вытворяют.
...
Рейтинг: 0 / 0
23.10.2015, 16:21
    #39085059
Inkelyad
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение порядка строк в таблице
dymka3. Сделать поле номера записи типа float. И при вставке находить среднее между вставляемыми записями и писать туда.
+Естественный порядок сортировки сохраняется. Запрос уж через row_number(order by float_index).
-Нельзя вставить очень много записей, т.к. разрешающая способность float ограничена. ну вставка 20 записей "расщепит" его до одной миллионной. Можно конечно, каждые 20 (или другое кол-во) вставок делать перенумерацию (как в старом добром бейсике).

Есть еще вариант этого пункта - под позицию отводится два целых поля. И потом рассматриваются как натуральная дробь.

Если же хочется совсем оптимально делать, то нужно начинать по ключевым словам Self-balancing binary search tree.
Упорядоченный список - это листья такого дерева. Но встанет вопрос 'А оно точно надо?'
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Хранение порядка строк в таблице / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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