我有一个非常简单的问题。我需要创建模型,表示有序列表的元素。这个模型可以像这样实现:
class Item(models.Model):
data = models.TextField()
order = models.IntegerField()或者像这样:
class Item(models.Model):
data = models.TextField()
next = models.ForeignKey('self')哪种方式是首选的?每种解决方案都有什么缺点?
发布于 2009-01-09 14:17:27
本质上,您提出的第二个解决方案是链表。在数据库级别实现链表通常不是一个好主意。要检索n元素列表,您将需要n数据库访问权限(或使用复杂的查询)。在性能方面,检索O(n)中的列表是非常低效的。
在常规代码中,链表用于获得比数组更好的插入性能(不需要移动所有元素)。在您的数据库中,更新所有元素并不是那么复杂,只需两个查询:
UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT INTO item (order, ...) VALUES (3, ...)我记得我看到过一个实现了所有这些的可重用的应用程序和一个很好的管理界面,但我现在找不到它了……
总而言之,一定要使用解决方案#1,并远离解决方案#2,除非你有非常非常好的理由不这样做!
发布于 2009-01-09 14:12:35
这取决于你想做什么。
第一种方法似乎更适合在数据库中进行一次查询,并以正确的顺序获取所有数据
第二种方法似乎更好地在两个现有元素之间插入一个元素(因为在第一种方法中,如果数字是连续的,则必须更改许多项)
我使用第一个,因为它似乎更适合数据库表,这是django在幕后存储模型数据的方式。
发布于 2009-01-09 15:22:38
还有另一种解决方案。
class Item(models.Model):
data = models.TextField()您只需将Python列表打包或编组到数据字段并加载它即可。这是一个很好的更新和阅读,但不是搜索,例如获取包含特定项目的所有列表。
https://stackoverflow.com/questions/428149
复制相似问题