2012-04-20 37 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值設置爲上一個和下一個視頻之間的一半(可能是小數)。這讓您可以在很長時間內移動視頻,而無需擔心重新排序整個播放列表。

重新排序的觸發條件是您的新計算結果等於您的一個結束點(即與上一個或下一個視頻相同的值)。出於實用目的,除非用戶花費更多時間重新排序視頻,否則這種情況將非常少見。