如何为一对多SQL关系设置子表行的显式顺序?

问题描述 投票:0回答:1

想象一个具有两个表,一个列表(具有id和name的列表)和一个项目(具有id,list_id,这是一个链接到list.id和name的外键的数据库)以及具有ORM和相应模型的应用程序的数据库。

一项任务:在应用程序中有一种方法可以创建/编辑/查看列表及其中的项目(应该很简单),而且还可以将项目的顺序保存在一个列表中,并允许对其中的项目进行重新排序一个列表(因此,用户创建项目列表,然后交换两个项目,然后在显示列表时,应保留项目顺序)或删除项目。

在数据库方面实现它的最佳方法是什么?我应该使用哪种数据库结构?

我看到了解决这些问题的方法:

  • 不使用外部表来存储项目,而是将所有内容存储在列表文档中(例如,作为postgres jsonb列)-可以工作,但是我想这不是RDBMS的方式,并且如果用户想要更新单个项目,则整个列表对象都需要更新
  • 在items表中具有position字段,并添加了一种管理API中位置的方法-可以起作用,但是它相当复杂(例如,处理某些项目的位置相同的情况,处理交换项目,处理项目删除,并且必须减少所有已删除项目之后的所有项目的位置,等等。]

有没有简单的实现方法?像一些大公司在生产中使用的那种?我真的很好奇在现实生活中如何处理此类案件。

这是理论上的问题,因此这里没有代码示例(db结构除外)。>>

想象一个具有两个表,一个列表(具有ID和名称)和一个项目(具有ID,list_id,这是一个链接到list.id和名称的外键的数据库)以及具有ORM和相应应用程序的应用程序的数据库。 >

sql join one-to-many
1个回答
0
投票

这是一个很好的问题,据我所知,没有简单的答案。我曾经想出一个针对大容量照片共享站点的解决方案,使用了您所描述的item表,其中包含list_idposition列。性能的关键在于最大程度地减少了重新编号,因为该数据库拥有数百万张照片(超过2 ^ 32个赞)。

唯一的操作是将单个项目移动到列表中的另一个点(在列表中另一个项目之前或之后)。首先通过较大的步骤分配职位,例如1000、2000、3000。无论何时在其他两个项目之间移动项目,均会使用平均值,例如从pos = 3000移动到1500。最终,您可以尝试在具有连续位置编号的两个项目之间移动一个项目。然后,您可以根据需要较少更新的方式(例如,如果有连续的职位),选择在上方或下方重新编号项目。记得我在MySQL 5.7上使用RANK@vars完成。

© www.soinside.com 2019 - 2024. All rights reserved.