Подтвердить что ты не робот

Упорядоченные списки в джанго

У меня очень простая проблема. Мне нужно создать модель, представляющую элемент упорядоченного списка. Эта модель может быть реализована следующим образом:

class Item(models.Model):
    data = models.TextField()
    order = models.IntegerField()

или вот так:

class Item(models.Model):
    data = models.TextField()
    next = models.ForeignKey('self')

Какой способ является предпочтительным? Какие недостатки имеют каждое решение?

4b9b3361

Ответ 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 в поле данных и загружать его. Это полезно для обновления и чтения, но не для поиска, например. выбор всех списков, содержащих определенный элемент.