Задать вопрос
@TheDigitalMadness
Программист

Как правильно реализовать обновление порядка (поле order) в бд?

У меня есть 2 таблички (условно. На самом деле гораздо больше и логика уже есть - но я думаю, она неправильная):
course, module
И связь course —> OneToMany —> module

У сущности модуля есть поле порядка order (то, каким оно отображается на экране), которое начинается с 1, при создании нового объекта назначается МАКС+1, а при удалении кого-то, все порядки выше должны сместиться на единицу вниз.

Задача:
Пусть есть курс с айди 1, в котором хранятся модули (1, 2, 3, 4) с такими же порядками.
я получаю запрос из серии
{
moduleId: 2,
newOrder: 3
}


И тогда у модуля 2 порядок станет 3 - а у модуля 3 он соответственно станет на единичку ниже, то есть 2.

Или, если такой запрос:
{
moduleId: 2,
newOrder: 4
}


То у модуля 2 порядок станет 4, а у 3 и 4 модулей соответственно 2 и 3.

Вопрос в логическое реализации: как это сделать, чтобы
а) это было экономично по запросам
б) оптимизировано
в) избегать ошибок гонки запросов (если одновременно, например, был создан новый модуль) (например селект фор апдейт в транзакции)

г) и как следует поступить, если в курсе могут храниться не только модули, но и тесты, например? Текущая наша реализации имеет 2 отношения один ко многим к табличкам модуля и теста - но тогда происходит смешения порядков, и это немножко неудобно обрабатывать. Плюс порядки с текущей реализацией уже слетали, появлялись объекты с одинаковыми порядками. Есть вариант создать единый объект внутренности курса - и у него сделать поле type означающее тип объекта.

Если есть какой-то паттерн или маст хэв для этого - то я буду супер благодарен, если еще его скажете. Если удобно будет кодом - пишите кодом, я пойму; если удобно словами - словами.
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой 6 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Инженер по тестированию
    5 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Яндекс Практикум
    Java-разработчик
    10 месяцев
    Далее
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Это нетривиальная задача. На сколько мне известно, самый распространённый на сегодняшний день подход - это LexoRanks.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Вам просто нужно отделить порядковый номер модуля от его идентификатора.
Ниже ссылка на пример SQL-кода:
https://sqlize.online/s/9a
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы