在数据库中存储有序列表的最佳方法?

wan*_*ist 19 mysql database-design

在数据库中存储"有序列表"的最佳方法是什么,以便更新它们(添加,删除和更改条目的顺序)很容易?

考虑一个数据库,其中包含用户和电影的表格.每个用户都有一个喜欢的电影列表.

由于许多用户可以喜欢同一部电影,因此我将用户和电影分开,并使用第三张表连接它们,即用户电影.

usermovies包含用户和电影的ID以及"订单号".订单号用于为用户订购电影列表.

例如,用户Josh可能具有以下列表:

  1. 普罗米修斯
  2. 黑衣人3
  3. 独裁者

和用户杰克可能有一个列表,如:

  1. 独裁者
  2. 普罗米修斯
  3. 主力舰
  4. 白雪公主与猎人

因此,他们分享一些收藏,但不一定按照相同的顺序.

我可以使用查询获取每个用户的电影ID列表:

SELECT movie_id FROM usermovies WHERE user_id =? ORDER BY order_number
Run Code Online (Sandbox Code Playgroud)

然后,使用有序的movie_ids,我可以使用另一个查询获取电影列表

SELECT name FROM movies WHERE id in (?,?,?) ORDER BY FIELD (id, ?,?,?)
Run Code Online (Sandbox Code Playgroud)

所以查询工作,但更新列表现在看起来真的很复杂 - 是否有更好的方法来存储这些信息,以便很容易获得用户x的电影列表,添加电影,删除它们并更改列表的顺序?

Rya*_*des 6

具有用于电影和用户之间的关联的属性的附加列的联结/链接表是实现与关联类的许多关联的标准方式 - 因此您所做的似乎是正确的.

关于插入/更新/删除的简易性,每次执行插入/更新/删除时,您都必须管理整个关联(用户电影FK的所有行).可能没有一种神奇/简单的方法可以做到这一点.

说完这些之后,您还需要在事务中运行这些操作,如果您的应用程序具有多用户功能,则更重要的是在此联结表上有一个"版本"列.

  • @MikhailBatcer 需要在 44 次重新排序后重新分配整个表的解决方案显然不那么神奇。 (3认同)

Ker*_*cat 6

如果你不是在寻找一个"向上/向下移动"的解决方案,然后默认添加到列表的底部,这里有几个指针:

将新行插入特定位置可以这样做:(在第3位插入)

UPDATE usermovies SET order_number = ordernumber + 1 
   WHERE ordernumber > 3 and user_id = ?;
INSERT INTO usermovies VALUES (?, 3, ?);
Run Code Online (Sandbox Code Playgroud)

并且您可以以类似的方式删除:(删除位置6)

DELETE usermovies WHERE order_numer = 6 and user_id=?;
UPDATE usermovies SET order_number = ordernumber - 1 
   WHERE ordernumber > 6 and user_id = ?;
Run Code Online (Sandbox Code Playgroud)