【发布时间】:2010-12-11 01:43:14
【问题描述】:
我正在使用 Django 和 PostgreSQL,但如果有更好的方法来使用原始 SQL 或特定于数据库的操作,我并不完全依赖 Django ORM。
我有一个需要顺序排序的模型。查找操作通常会按顺序检索整个列表。对此数据最常见的操作是将一行移动到列表的底部,中间项目的子集冒泡以替换前一个项目,如下所示:
(对 A 的操作,带有子集 B、C、E) A -> B B -> C C -> E D -> D E -> A 注意 D 是如何不动的。一般来说,项目的子集不会超过大约 50 个项目,但基本列表可能会增长到数万个条目。
最明显的实现方式是使用简单的整数顺序字段。这似乎不是最理想的。它需要使位置排序列不唯一的折衷方案,其中仅在修改操作期间才需要非唯一性。要看到这一点,想象一下使用 A 和子集 B 的最小操作:
oldpos = B.pos
B.pos = A.pos
A.pos = oldpos
即使您已经存储了位置,在第二行您还是违反了唯一性约束。此外,这种方法会导致原子性问题 - 您的读取操作必须在写入之前发生,在此期间您的记录可能会更改。 Django 的默认事务处理文档没有解决这个问题,尽管我知道在 SQL 中使用“REPEATABLE READ”级别的事务锁定应该是可能的。
我正在寻找更适合这种使用模式的替代数据结构。我查看了this question 的想法。
一个建议是杜威十进制样式的解决方案,它使插入操作在现有值之间以数字方式发生,因此在 B 和 C 之间插入 A 导致:
A=1 -> B=2 B=2 -> A=2.5 C=3 -> C=3这解决了列唯一性问题,但引入了列必须是指定小数位数的浮点数的问题。要么我高估了,存储的数据比我需要的多,要么系统受到我施加的任意十进制长度的限制。此外,我不希望使用甚至超过数据库 - 一些键将比其他键更频繁地移动,从而使该解决方案更快地达到极限。我可以通过定期重新编号数据库来解决这个问题,但似乎一个好的数据结构应该避免需要这个。
我考虑过的另一种结构是链表(和变体)。这具有使修改简单的优点,但我不确定它相对于 SQL 的属性 - 在 SQL 查询中排序这样的列表似乎很痛苦,并且提取列表的非顺序子集很糟糕检索属性。
除此之外,还有B-Tree、各种二叉树等等。你对这个数据结构有什么建议? SQL 中是否有此解决方案的标准数据结构?使用顺序整数的最初想法真的会有缩放问题,还是我看到没有问题?
【问题讨论】:
-
由于答案数量少,在这里悬赏......
-
嗨,保罗 - 我看到你接受了我的回答 - 谢谢:D。您决定采用哪种建议的解决方案,为什么?
标签: python database django sorting data-structures