与this question类似,但这些答案都不太理想。替代使用数据库表中的排序顺序列
考虑在PostgreSQL使用该Django的模型:
class Parent(models.Model):
id = models.AutoField(primary_key=True)
class Child(models.Model):
id = models.AutoField(primary_key=True)
parent = models.ForeignKey(Parent)
在SQL(希望我得到这个代码右):
CREATE TABLE parent (
id integer PRIMARY KEY
);
CREATE TABLE child (
id integer PRIMARY KEY
parent_id integer REFERENCES parent
);
怎么能够做出让Child
对象属于特定Parent
可以重新排序吗?即使用拖放UI,用户可以拖动Child
ren并保存更新的排序。创建,更新和删除Child
应只需要一次操作,即不应要求更新Parent
上的内容。
我有原因的一些不完善的想法,为什么每个想法并不理想:
排序
Child
字母顺序由用户提供的VARCHAR - 这会强制用户想开始具有一定的字母名称或数字,因为没有正当理由而需要大量的创造力。在
Parent
,存储对应于Child
对象的主键的整数数组 - 需要一个以上的操作创建和删除,在Parent
阵列将需要每次都被更新。没有数据库强制数据完整性。按整数列排序
Child
- 创建Child
以查找要使用的下一个整数时需要额外读取。另一个问题(无论在生产中发生的可能性不大),当整数之间的差距用完时,插入对象“落后”的对象必须被推回。这种情况可以通过反复考虑最后一个对象并把它放在第一位来人为地强制。在每个
Child
中,存储引用下一个/前一个的整数IDChild
- 这解决了一些来自3.的hacky问题,但它看起来荒谬的是效率低下,并且是后勤方面的挑战。
是否有此规定(即不涉及另外加入或与jsonb
替换第二表)任何雄辩的解决方案?
使用3.您描述的问题是真实的,但可能并不重要,除非您每个父母的孩子数量非常多。 –