Я сталкивался с этой проблемой снова и снова, и я не нашел решения, которое, на мой взгляд, было оптимальным.
Скажем, в приложении у вас есть упорядоченный список, и вы позволяете пользователю изменять этот порядок путем перетаскивания или чего-то еще. Вы хотите, чтобы изменения в заказе сохранялись. Как вы моделируете это?
Как мне спроектировать спокойный сервис ресурса упорядоченного списка?
В частности, как я должен спроектировать list
и item
модель спокойного ресурса? Самым распространенным дизайном, который я видел, является item
объект, имеющий свойство order
или position
. Другой подход, который я услышал, - это двусвязный список предметов.
Какой подход не слишком много пишет в базу данных и, как правило, быстро обновляется и читается для клиентов? Как должны быть выставлены конечные точки как?
источник
Ответы:
Представление упорядоченного списка является одной из трудных проблем с реляционными базами данных. Добавление свойства position в отношение членства в списке является наиболее распространенным способом сделать это, так как вы можете легко получить упорядоченный список, добавив его
ORDER BY position
в запрос SQL, и потому что вы можете легко вставлять элементы в середину списка, усредняя значения предыдущего и последующего члена списка, при условии, что позиция является числом с плавающей точкой, а не целым числом.Следует избегать использования двусвязных списков, так как легко случайно сделать ссылки несовместимыми, и вместо этого получится циклический граф или дерево.
Однако API-интерфейсы RESTful не страдают от ограничений реляционных баз данных. Вы можете просто сделать что-то, что кажется естественным, вместо того, чтобы использовать хак, как свойство позиции.
Если у вас есть только несколько сотен элементов в списке, просто передайте весь список в запросе. Предполагая, что мы хотим изменить порядок,
[1, 2, 3, 4]
где члены списка являются идентификаторами, мы могли быЗатем серверная часть может перевести это на любую используемую вами технологию базы данных, но пользователь API не должен учитывать эти детали.
Если список большой и элементы обычно запрашиваются индивидуально, вы можете разрешить индекс в URL:
Если вы работаете в HATEOAS, ответ может включать ссылки «предыдущий / следующий», чтобы упростить навигацию, если ресурс обычно используется таким образом. Однако это не обязательно означает, что ваша база данных также содержит этот двусвязный список.
Если список очень большой, вы можете захотеть выставить
ArrayList
подобные операции, такие какinsert
илиpush
/append
. Я мог бы представить такой звонок, какЕсли переупорядочение является распространенным случаем, и переупорядочение должно быть совершено немедленно, тогда вы можете предложить подходящую конечную точку в своем API:
Если переупорядоченный список должен быть зафиксирован явно, будет проще перенести новый заказ в виде документа JSON, см. Выше.
Теперь не совсем верно, что вы можете рассматривать свой API как совершенно отдельный от технологии баз данных, которую вы используете. Тем не менее, лучше сохранить внешний API как можно более свободным от деталей реализации. Если какое-либо изменение порядка затрагивает около 30 строк только для обновления столбца с целочисленным порядком, это не страшно. Просто сделайте самую простую вещь и всегда обновляйте весь список. Если для вашей шкалы требуется более сложное использование базы данных, предпочтите использовать эту сложность в бэкэнде, где проще поддерживать согласованность.
источник
Я думаю, что жизнеспособность различных подходов сильно зависит от используемой базы данных.
Этот подход предложил переместить элемент в порядке:
Это может зависеть от условий гонки, если у вас нет Сериализуемой транзакции. Уровень READ_COMMITTED по умолчанию в большинстве БД не устраняет условия гонки!
Я на самом деле думаю, что в большинстве случаев - если список относительно невелик - подход с заменой полного списка имеет меньше проблем с условиями гонки и не может испортить данные. Если набор элементов изменился после того, как клиент сделал запрос, вы можете вернуть 409 (Конфликт).
Он страдает от последних побед, но это верно буквально для ЛЮБОГО API. Независимо от того, какой API вы реализуете, другой клиент, возможно, обновил объект, пока вы просматриваете страницу.
источник