13

我有一个非常简单的问题。我需要创建模型,代表有序列表的元素。这个模型可以这样实现:

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

或像这样:

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

首选什么方式?每种解决方案有什么缺点?

4

3 回答 3

21

本质上,您提出的第二个解决方案是链表。在数据库级别实现的链表通常不是一个好主意。要检索n元素列表,您需要n访问数据库(或使用复杂的查询)。性能方面,在 O(n) 中检索列表效率极低。

在常规代码中,与数组相比,链表用于获得更好的插入性能(无需移动所有元素)。在您的数据库中,仅用 2 个查询更新所有元素并不复杂:

UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT INTO item (order, ...) VALUES (3, ...)

我记得看到一个实现所有这些的可重用应用程序和一个漂亮的管理界面,但我现在找不到它......

总而言之,除非您有非常非常好的理由不这样做,否则一定要使用解决方案#1并远离解决方案#2!

于 2009-01-09T14:17:26.753 回答
6

这取决于你想做什么。

第一个似乎更好地在数据库中进行单个查询并以正确的顺序获取所有数据

第二个似乎更好地在两个现有元素之间插入一个元素(因为在第一个中,如果数字是连续的,您必须更改很多项目)

我会使用第一个,因为它似乎更适合数据库表,这就是 django 在后台存储模型数据的方式。

于 2009-01-09T14:12:35.327 回答
-6

还有另一种解决方案。

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

您可以将 Python 列表腌制或编组到数据字段中并加载它。这适用于更新和阅读,但不适用于搜索,例如获取包含特定项目的所有列表。

于 2009-01-09T15:22:38.040 回答