Postgresql 查询和修改任意位置的子项列表

Postgresql 查询和修改任意位置的子项列表,postgresql,database-design,Postgresql,Database Design,记住以下模式: parent ( parent_id child_id ) 我试图设计一个模式,允许我检索一个孩子列表,孩子可以任意排序。将子项添加到父项与将其追加到列表末尾相同,其位置等于给定父项的所有位置的最大位置+1。在这里,通过更改多个子条目的位置列,还应该能够相对于其同级重新定位子条目。一个人也应该能够删除一个孩子,他们各自的位置保持不变 根据给定父对象的位置查询其子对象将遵循以下查询类型: select child.* from child where chil

记住以下模式:

parent (
  parent_id
  child_id
)
我试图设计一个模式,允许我检索一个孩子列表,孩子可以任意排序。将子项添加到父项与将其追加到列表末尾相同,其位置等于给定父项的所有位置的最大位置+1。在这里,通过更改多个子条目的位置列,还应该能够相对于其同级重新定位子条目。一个人也应该能够删除一个孩子,他们各自的位置保持不变

根据给定父对象的位置查询其子对象将遵循以下查询类型:

select child.* 
  from child 
  where child.parent_id = $1 
  order by child.position asc;

我想知道这种模式是否足够,因为任何操作,无论是插入子项还是更改子项的位置,都变得相当复杂,因为它首先涉及查询/修改现有记录。我们是否应该将位置数据作为某种数组放在父表上?

在关系数据库中建模层次数据有两种常见方法-Joe Celko有一本专门介绍这一点的书

您建议的模型基于邻接列表。这很直观,但通常很难使用-检索层次结构需要递归查询,更新/插入可能会很复杂

另一种选择是嵌套集,它在查询时效率更高,插入/更新更简单(尽管需要修改更多记录)

select child.* 
  from child 
  where child.parent_id = $1 
  order by child.position asc;