代码之家  ›  专栏  ›  技术社区  ›  Evgeny Lazin

Django中的有序列表

  •  12
  • Evgeny Lazin  · 技术社区  · 15 年前

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

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

    或者像这样:

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

    首选哪种方式?每个解决方案都有哪些缺点?

    3 回复  |  直到 15 年前
        1
  •  20
  •   Guillaume    15 年前

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

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

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

    我记得看到过一个可重用的应用程序实现了所有这些,并且有一个很好的管理界面,但是我现在找不到它……

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

        2
  •  6
  •   nosklo    15 年前

    这取决于你想做什么。

    第一种方法似乎更适合在数据库中进行单个查询,并以正确的顺序获取所有数据。

    第二种方法似乎更适合在两个现有元素之间插入一个元素(因为在第一种方法中,如果数字是连续的,则必须更改很多项)

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

        3
  •  -6
  •   Imran    15 年前

    还有另一个解决方案。

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

    您只需将python列表pickle或marshal放入数据字段并加载它。这一个对更新和阅读很好,但不适用于搜索,例如获取包含特定项目的所有列表。