Как поддерживать изменяемый пользователем порядок элементов в SQL

Мое приложение обрабатывает отношения «многие к одному» между пакетами и документами. Пакет содержит несколько документов. В настоящее время они хранятся в базе данных PostgreSQL с использованием таблиц package и document, где таблица document имеет столбец внешнего ключа package-id.

Новое требование требует, чтобы пользователь мог изменять порядок документов в пакете, поэтому мне нужно начать это отслеживать. Обратите внимание, что порядок сортировки не зависит от какого-либо свойства документа, например даты; он может произвольно назначаться и переназначаться пользователем. Мне нужно определиться с вариантами. Вот те, которые кажутся не ужасными:

  • Представьте связывающую таблицу со столбцами package-id, document-id, sequence.
  • Добавьте столбец в package, чтобы перечислить порядок (меньше изменений в структуре, но теперь у нас есть связи, указывающие в обоих направлениях)
  • Я пропустил лучшее решение?

Это должен быть общий сценарий – каков стандартный способ его структурирования?


Edit нашел хорошее решение для генерации строк, которые сортируются между другими строками, чтобы избежать коллизий. Мы будем использовать это вместе с новым столбцом последовательности в таблице документов. Возвращает новую строку, которая сортируется между двумя заданными строками

нет, это не обычное явление, так как таблица не имеет значения bx

nbk 06.05.2024 03:47

также было бы достаточно иметь таблицу с идентификатором пользователя, уникальным идентификатором документа и номером заказа в следующей таблице, остальная информация может быть объединена с другими таблицами.

nbk 06.05.2024 04:01

Если один пользователь сортирует его, будет ли он повторно сортироваться для всех остальных пользователей? Или у каждого пользователя своя уникальная сортировка? Если есть только один сорт, то самое простое решение — изменить таблицу documents, в которой уже есть ссылка на пакет. Вы также можете добавить туда порядковый номер или номер сортировки (фактически говоря, что этот документ находится в этом пакете в этой позиции). Если вам нужны разные сортировки для разных пользователей, вам понадобится отдельная таблица с идентификатором пакета, идентификатором пользователя, идентификатором документа и номером последовательности/сортировки. Однако это усложняется с новыми пользователями / теми, кто еще не разобрался.

seanb 06.05.2024 04:24

Спасибо за предложения. В моем случае порядок сортировки привязан к пакету и не зависит от пользователя.

Mike Kantor 06.05.2024 04:45

Тогда я изменю это на ответ.

seanb 06.05.2024 04:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как обсуждалось в комментариях, необходима только одна сортировка (например, одна и та же сортировка применяется ко всем пользователям).

Поэтому самое простое/простое решение — изменить таблицу документов.

  • Там уже есть ссылка на пакет
  • Вы также можете добавить туда порядковый номер или номер сортировки.
  • Это фактически говорит о том, что этот документ находится в этом пакете в этой позиции.

Однако предстоит решить еще множество вопросов.

  • Должен ли каждый документ в пакете иметь позицию? (например, столбец позиции NOT NULL)?
    • Если да, то вам нужно будет: а) вернуться и обновить все документы с указанием их позиций и б) изменить любые элементы для «новых документов», «старых документов» и т. д., также добавив номера позиций.
    • Если нет, то вам необходимо иметь четкое правило, как поступать с документами без позиций, например, они автоматически переходят в конец этого списка. Это может быть более простой подход, чем требование должности.
  • Как быть с позициями, которые больше не в порядке, например, если у вас есть 4 заказанных документа, а один удален (документ больше не нужен), нормально ли это работает с позициями (скажем) 1, 2, 4? Или нужно переписать их как 1, 2, 3?

Наконец, в некоторых реализованных мной реализациях сортировка была своего рода «надстройкой» для подмножества данных. В таких случаях я создавал отдельную таблицу (эквивалентную идентификатору пакета, идентификатору документа и порядковому номеру), чтобы сохранить исходные данные в первозданном виде. Но это скорее стилистическое/обслуживающее решение, чем простое. (Технически я сделал так, чтобы ее было проще всего игнорировать и удалить позже, поскольку ничто другое не будет использовать эту новую таблицу).

Другие вопросы по теме