我只需要一个想法,而不是一些代码。
存在一个应用程序,允许用户构建多个充满歌曲的播放列表。
每个播放列表都使用sql table
将歌曲保存在数据库中。这使用户有机会异步更改每个播放列表(例如删除或添加新歌曲)。
但是当我想要搜索所有数据库表( - >播放列表)中的某些歌曲时,我必须加入所有这些表,而这很慢。
优点 - >允许用户异步对每个播放列表进行修改
缺点 - >搜索速度慢,大数据库文件
第二种方式
我正在考虑使用一个表来保留所有播放列表中的所有内容,但用户无法在每个播放列表上异步添加或删除歌曲(它必须等待 - > 表被锁定),但搜索只在一个表中。
优点 - >数据库较小,因为不存在重复的歌曲,搜索相当容易
缺点 - >用户无法在每个播放列表上异步添加或删除歌曲(我不想要的实际问题)
问题是:
有没有办法让速度和异步......?
答案 0 :(得分:2)
我建议你选择经典的多对多方法。
您可以拥有一个songs
表和一个playlists
表。歌曲可以是许多播放列表的一部分,播放列表可以包含多首歌曲。要对此进行建模,您需要创建一个将歌曲映射到播放列表的关系表 - 基本上您只需要歌曲ID和播放列表ID。您也可以为关系添加其他信息(例如播放列表中歌曲的位置等)
查询时,您需要在大多数情况下将3个表连接在一起(取决于您的搜索逻辑)。你可以通过输入正确的数据库索引来尝试并聪明一些,甚至可以准备一些视图以加快速度。
我不确定为什么你认为你实际上对数据库进行了异步更改。在内部,SQLite一个接一个地以串行方式执行所有命令。避免死锁的关键是保持交易尽可能短。由于从这些表中插入,更新和删除应该非常快,我不认为你应该担心对播放列表进行并发更改。
答案 1 :(得分:2)
您没有为用户构建的每个播放列表创建表格吗?
我说你需要三张桌子:
Songs
| id | Artist | Name |
| 1 | Michael Jackson | Billie Jean |
| 2 | Rick Astley | Never gonna give you up |
| 3 | Led Zeppelin | Stairway to heaven |
Playlist
| id | Name |
| 1 | My first playlist |
| 2 | My second playlist |
Playlist songs
| playlist | song |
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
| 2 | 3 |