SQL使用一个或多个sql表?

时间:2016-06-27 07:58:16

标签: java database sqlite

我只需要一个想法,而不是一些代码。

存在一个应用程序,允许用户构建多个充满歌曲的播放列表。 每个播放列表都使用sql table将歌曲保存在数据库中。这使用户有机会异步更改每个播放列表(例如删除或添加新歌曲)。

但是当我想要搜索所有数据库表( - >播放列表)中的某些歌曲时,我必须加入所有这些表,而这很慢。

优点 - >允许用户异步对每个播放列表进行修改

缺点 - >搜索速度慢,大数据库文件

  

第二种方式

我正在考虑使用一个表来保留所有播放列表中的所有内容,但用户无法在每个播放列表上异步添加或删除歌曲(它必须等待 - > 表被锁定),但搜索只在一个表中。

优点 - >数据库较小,因为不存在重复的歌曲,搜索相当容易

缺点 - >用户无法在每个播放列表上异步添加或删除歌曲(我不想要的实际问题)

  

问题是:

有没有办法让速度和异步......?

2 个答案:

答案 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    |