Упорядоченные списки в джанго
У меня очень простая проблема. Мне нужно создать модель, представляющую элемент упорядоченного списка. Эта модель может быть реализована следующим образом:
class Item(models.Model):
data = models.TextField()
order = models.IntegerField()
или вот так:
class Item(models.Model):
data = models.TextField()
next = models.ForeignKey('self')
Какой способ является предпочтительным? Какие недостатки имеют каждое решение?
Ответы
Ответ 1
По сути, второе предлагаемое вами решение является связанным списком. Связанный список, реализованный на уровне базы данных, обычно не является хорошей идеей. Чтобы получить список элементов n
, вам понадобится доступ к базе данных n
(или использовать сложные запросы). Производительность, извлечение списка в O (n) ужасно неэффективна.
В регулярном коде связанный список используется для улучшения производительности вставки по сравнению с массивами (нет необходимости перемещать все элементы вокруг). В вашей базе данных обновление всех элементов не так сложно только в двух запросах:
UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT INTO item (order, ...) VALUES (3, ...)
Я помню, как можно было использовать повторно используемое приложение, которое реализовало все это и хороший интерфейс администратора, но я не могу найти его прямо сейчас...
Подводя итог, определенно используйте решение № 1 и избегайте решения № 2, если у вас нет очень веской причины не делать этого!
Ответ 2
Это зависит от того, что вы хотите сделать.
Первое, кажется, лучше сделать один запрос в базе данных и получить все данные в правильном порядке
Второй, кажется, лучше вставить элемент между двумя существующими элементами (потому что в первом вы должны были бы изменить много элементов, если числа последовательны)
Я бы использовал первый, потому что он лучше подходит для таблицы базы данных, а именно, как django хранит данные модели за капотом.
Ответ 3
Существует другое решение.
class Item(models.Model):
data = models.TextField()
Вы можете просто рассортировать или маршалировать список Python в поле данных и загружать его. Это полезно для обновления и чтения, но не для поиска, например. выбор всех списков, содержащих определенный элемент.