Хранение порядка лиц
Если у меня есть лица с атрибутом :fruit
:
apple
banana
grapes
tomato
и функция, позволяющая пользователю заказать свои фрукты:
1 grapes
2 apple
3 tomato
4 banana
Есть ли хороший способ сохранить заказ фруктов в базе данных, ожидая, что фрукты могут быть удалены, добавлены фрукты, а фрукты переупорядочены?
Наивным решением является добавление столбца заказа. Проблема в том, что это дорогие обновления. Скажем, у меня есть сущность: 1000000 durian
, Я вдруг решаю, что это мой любимый фрукт, и перевожу его наверх. Это заставляет 999999 фруктов требовать обновления заказа.
2 ответа
Не существует встроенного способа для достижения вашей цели в любой базе данных, будь то PostgreSQL, Datomic или что-то еще. Тем не менее, есть простой ответ.
Просто преобразуйте предложенный столбец "приоритет" из целого числа в значение с плавающей точкой. Затем вы всегда можете вставить новую запись между любыми двумя существующими элементами без необходимости что-либо менять. Предположим, вы начали с
1.0 grape
2.0 apple
3.0 tomato
4.0 banana
и тогда вы решите, что добавить pear
между grape
а также apple
, Просто вставьте как:
1.0 grape
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
Затем вы решаете вставить cherry
между grape
а также pear
Итак, вы получите:
1.0 grape
1.25 cherry
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
Затем, когда вы захотите просмотреть свой список, вы просто извлекаете и столбец приоритета, и столбец имени, сортируете по приоритету, и все готово.
Короткий ответ - нет, Datomic не имеет этого встроенного, и, честно говоря, не имеет и многих других баз данных.
У вас есть подход "столбец", который вы упомянули, который также имеет проблему, которую вы упомянули. Пробелы на самом деле не самая плохая часть, так как вы все равно можете получить правильную сортировку с некоторыми пробелами, становится еще хуже, если вы хотите вставить элемент посередине, то вам нужно обновить следующие объекты. И вам, вероятно, следует делать все это в функции транзакции, если вы не уверены, что ваш одноранговый узел является однопоточным.
Есть также подход со связанным списком, где каждая сущность указывает на следующую, а последняя ни на что не указывает. Присоединение, добавление и нарезка посередине становятся постоянными операциями.