21

在数据库中存储“有序列表”的最佳方式是什么,以便轻松完成更新(添加、删除和更改条目的顺序)?

考虑一个数据库,其中有一个用户和电影表。每个用户都有一个最喜欢的电影列表。

由于许多用户可以喜欢同一部电影,因此我将用户和电影制作为单独的表,并使用第三个表将它们连接起来,即 usermovies。

usermovies 包含用户的 id 和电影以及“订单号”。订单号用于为用户订购电影列表。

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

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

用户 Jack 可能有如下列表:

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

因此,他们分享了一些最爱,但不一定以相同的顺序。

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

SELECT movie_id FROM usermovies WHERE user_id =? ORDER BY order_number

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

SELECT name FROM movies WHERE id in (?,?,?) ORDER BY FIELD (id, ?,?,?)

所以查询工作,但现在更新列表似乎真的很复杂 - 有没有更好的方法来存储这些信息,以便轻松获取用户 x 的电影列表、添加电影、删除它们并更改列表的顺序?

4

4 回答 4

8

如果您不是在寻找“上移/下移”之类的解决方案,然后默认添加到列表底部,这里还有一些提示:

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

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

你可以用类似的方式删除:(删除位置6)

DELETE usermovies WHERE order_numer = 6 and user_id=?;
UPDATE usermovies SET order_number = ordernumber - 1 
   WHERE ordernumber > 6 and user_id = ?;
于 2012-06-13T21:17:40.350 回答
6

带有用于电影和用户之间关联属性的附加列的联结/链接表是实现与关联类的多对多关联的标准方法 - 所以你所做的似乎是正确的。

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

话虽如此,您还需要在事务中运行这些操作,更重要的是,如果您的应用程序支持多用户,则在此联结表上有一个“版本”列。

于 2012-06-13T07:02:36.130 回答
4

除了其他人所说的之外,重新排序现有收藏夹可以在单个 UPDATE 语句中完成,如此所述。

链接的答案解释了两个项目的重新排序,但可以很容易地推广到任意数量的项目。

于 2012-06-13T08:12:28.590 回答
4

要检索用户最喜欢的电影,您可以使用单个查询:

SELECT um.order_number, m.name FROM movies m
INNER JOIN usermovies um ON m.id = um.movie_id
WHERE um.user_id = ?
ORDER BY um.order_number

usermovies要添加/删除喜欢的电影,只需在表中添加/删除相关记录。
要更改电影顺序,只需更改与用户相关order_number的表中的所有字段。user_movies

于 2012-06-13T05:51:40.120 回答