Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 在数据库表中使用排序顺序列的替代方法_Sorting_Database Design_Django Models_Relational Database_Database Schema - Fatal编程技术网

Sorting 在数据库表中使用排序顺序列的替代方法

Sorting 在数据库表中使用排序顺序列的替代方法,sorting,database-design,django-models,relational-database,database-schema,Sorting,Database Design,Django Models,Relational Database,Database Schema,与之类似,但这些答案都不理想 考虑与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中(希望我的代码正确): 如何使属于特

与之类似,但这些答案都不理想

考虑与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中(希望我的代码正确):

如何使属于特定父对象的子对象重新排序?i、 e.使用拖放UI,用户可以拖动
子项
ren并保存更新的订单。创建、更新和删除
子项
只需要一次操作,即不需要更新父项上的内容

我有一些不完美的想法,以及每个想法不理想的原因:

  • 用用户提供的varchar按字母顺序排序
    Child
    ——这会迫使用户想到一个以某个字母或数字开头的名字,无正当理由需要大量的创造力

  • Parent
    中,存储与
    Child
    对象主键相对应的整数数组-需要执行多个创建和删除操作,每次都需要更新
    Parent
    中的数组。没有数据库强制的数据完整性

  • 按整数列对
    Child
    进行排序-创建
    Child
    时需要额外读取以查找下一个要使用的整数。另一个问题(不管在生产中发生的可能性有多大)是,当整数之间的间隔用完时,插入对象“后面”的对象必须推回。这种情况可以通过反复使用最后一个对象并将其放在第一位来人为强迫

  • 在每个
    子项
    中,存储引用下一个/上一个
    子项的整数id
    ——这解决了3中的一些黑客问题,但似乎效率低得离谱,而且是一项后勤挑战


  • 对于这一要求是否有任何有力的解决方案(不涉及添加联接或用
    jsonb
    替换第二个表)?

    使用浮点作为排序顺序列怎么样。在项目之间插入/移动时,将排序顺序设置为(previus-item.sortorter+next item.sortorder)/2。
    这不会无限期地运行,但取决于系统,您不应该遇到现实世界中的问题。此外,您还可以执行一项服务任务,在夜间重置您孩子的排序器中的间隔。

    使用3。您所描述的问题是真实的,但可能并不重要,除非您的每个家长都有大量的子女。如果我不想要一个通宵服务任务,最终浮动将失去精度,并且无法保持秩序。这和整数的问题是一样的,唯一的区别是浮点数更容易使用,但在什么时候它会“耗尽间隙”是不明确的。
    CREATE TABLE parent (
        id integer PRIMARY KEY
    );
    
    CREATE TABLE child (
        id integer PRIMARY KEY
        parent_id integer REFERENCES parent
    );