2012-04-20 36 views
0

我正在研究一个简单的视频数据库,其播放列表功能。在这样的播放列表中,可以按照用户指定的顺序放置视频。存储播放列表中的视频的顺序

所以我想我给每个video_id分配一个number_in_playlist。与此相关的问题是,如果将视频19稍后移动到视频2和3之间的位置,则还需要更新其中所有视频的number_in_playlist

现在,这强烈地让我想起阵列与链接列表。所以我认为链表可以解决这个问题,即为每个视频记录存储类似previous_video_id_in_playlistnext_video_id_in_playlist的内容。但是,在这种情况下,我不确定如何获取(按顺序)播放列表中的所有视频?

这肯定是别人之前遇到的问题,所以我想知道是否有标准的推荐解决方案?

PS:我使用MySQL和我非常喜欢短,速度快的查询

+0

您可能已经有了这个,但由于“视频”与“播放列表”有多对多的关系,因此您已经创建了交叉表,对吧?首先创建它,它可能提供一些关于如何解决这个问题的想法。 – MarioDS 2012-04-20 20:36:34

+0

我有一个表将'video_id'映射到'playlist_id',如果这就是你的意思?我自己的解决方案是将另一个字段“number_in_playlist”添加到该映射表。我只是希望可能有更好的解决方案(用于更新)。 – Ben 2012-04-20 20:48:34

回答

0

你能不能这样做(我认为说对链接列表的解决方案?):

SELECT * 
FROM videos 
WHERE playlist_id = 1 
ORDER BY next_video_id_in_playlist ASC 
+0

我不这么认为。 – Ben 2012-04-20 20:51:58

0

是该列表通常不会太长?写入性能不是问题?在这种情况下,我只是使用number_in_playlist解决方案。在每次写入时,所有数字都需要基本更新。

关系数据库中的链接列表闻起来会引起不可预料的问题。就像由bug引起的循环一样。

+0

这不是一个真正的问题,我只是在想,可能会有更好的解决方案。显然不是。 – Ben 2012-04-24 05:17:36

1

如果您将您的playlist.number_in_playlist列设置为,那么您可以先用整数对您的视频排序。当播放列表中的项目移动到新的位置时,将新的number_in_playlist值设置为上一个和下一个视频之间的一半(可能是小数)。这让您可以在很长时间内移动视频,而无需担心重新排序整个播放列表。

重新排序的触发条件是您的新计算结果等于您的一个结束点(即与上一个或下一个视频相同的值)。出于实用目的,除非用户花费更多时间重新排序视频,否则这种情况将非常少见。