我有一个非常简单的问题.我需要创建表示有序列表元素的模型.这个模型可以像这样实现:
class Item(models.Model): data = models.TextField() order = models.IntegerField()
或者像这样:
class Item(models.Model): data = models.TextField() next = models.ForeignKey('self')
什么方式首选?每个解决方案有哪些缺点?
基本上,您提出的第二个解决方案是链接列表.在数据库级实现的链表通常不是一个好主意.要检索n
元素列表,您将需要n
数据库访问(或使用复杂的查询).性能方面,在O(n)中检索列表非常有效.
在常规代码中,与数组相比,链表用于获得更好的插入性能(无需移动所有元素).在您的数据库中,仅在2个查询中更新所有元素并不复杂:
UPDATE item.order = item.order + 1 FROM item WHERE order > 3 INSERT INTO item (order, ...) VALUES (3, ...)
我记得看到一个可重复使用的应用程序实现了所有这一切和一个很好的管理界面,但我现在无法找到它...
总而言之,明确使用解决方案#1并远离解决方案#2,除非你有一个非常好的理由不去!
这取决于你想做什么.
第一个似乎更好的是在数据库中进行单个查询并以正确的顺序获取所有数据
第二个似乎更好的是在两个现有元素之间插入一个元素(因为在第一个元素中,如果数字是连续的,你必须更改很多项目)
我会使用第一个,因为它似乎更适合数据库表,这就是django如何存储模型数据.