Java SQL使用一个或多个SQL表?

Java SQL使用一个或多个SQL表?,java,database,sqlite,Java,Database,Sqlite,我只需要一个想法,而不是一些代码 存在一个应用程序,允许用户构建多个充满歌曲的播放列表。 每个播放列表都使用一个sql表将歌曲保存在数据库中。这使用户有机会异步更改每个播放列表(例如删除或添加新歌曲) 但当我想在所有数据库表(->播放列表)中搜索一些歌曲时,问题来了,我必须加入所有这些表,这很慢 Pros->允许用户异步编辑每个播放列表 缺点->搜索速度慢,数据库文件大 第二条路 另一种方法是使用一个表来保存所有播放列表中的所有内容,但用户不能在每个播放列表上异步添加或删除歌曲(必须等待->表被

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

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

但当我想在所有数据库表(->播放列表)中搜索一些歌曲时,问题来了,我必须加入所有这些表,这很慢

Pros->允许用户异步编辑每个播放列表

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

第二条路

另一种方法是使用一个表来保存所有播放列表中的所有内容,但用户不能在每个播放列表上异步添加或删除歌曲(必须等待->表被锁定),但搜索仅在一个表中

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

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

问题是:


有什么方法既能提高速度又能实现异步….?

我建议您使用经典的多对多方法

您可以有一个
歌曲
表和一个
播放列表
表。一首歌曲可以是许多播放列表的一部分,而一个播放列表可以包含多首歌曲。要对此进行建模,您需要创建一个关系表,将歌曲映射到播放列表-基本上您只需要歌曲id和播放列表id。您还可以向关系中添加其他信息(例如歌曲在播放列表中的位置等)

查询时,大多数情况下需要将3个表连接在一起(取决于搜索逻辑)。您可以尝试通过放置正确的数据库索引,甚至准备一些视图来加快速度,从而在这方面做到明智


我不太清楚为什么您认为您实际上对数据库进行了异步更改。在内部,SQLite以串行方式一个接一个地执行所有命令。避免死锁的关键是尽可能缩短事务。由于插入、更新和删除这些表应该非常快,所以我认为您根本不应该担心同时更改播放列表。

我建议您使用经典的多对多方法

您可以有一个
歌曲
表和一个
播放列表
表。一首歌曲可以是许多播放列表的一部分,而一个播放列表可以包含多首歌曲。要对此进行建模,您需要创建一个关系表,将歌曲映射到播放列表-基本上您只需要歌曲id和播放列表id。您还可以向关系中添加其他信息(例如歌曲在播放列表中的位置等)

查询时,大多数情况下需要将3个表连接在一起(取决于搜索逻辑)。您可以尝试通过放置正确的数据库索引,甚至准备一些视图来加快速度,从而在这方面做到明智


我不太清楚为什么您认为您实际上对数据库进行了异步更改。在内部,SQLite以串行方式一个接一个地执行所有命令。避免死锁的关键是尽可能缩短事务。由于插入、更新和删除这些表应该非常快,所以我认为您根本不应该担心对播放列表进行并发更改。

您并不是为用户创建的每个播放列表创建表,是吗

我想你需要三张桌子:

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    |

您没有为用户创建的每个播放列表创建表,是吗

我想你需要三张桌子:

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    |

加入预期数据集的速度有多慢?@OJKrylow如果每个播放列表包含200000首歌曲,并且存在20个播放列表+20个类似于播放列表的库,我想它会爆炸。加入预期数据集的速度有多慢?@OJKrylow如果每个播放列表包含200000首歌曲,并且存在20个播放列表+20个类似于播放列表我想它会爆炸。是的,我会为我创建的每个播放列表创建一个表。我为所有创建的播放列表创建了一个表,以便在加载时检索它们,并为每个播放列表创建了一个表。这意味着您必须更新用户创建的每个播放列表的所有查询。你不会想要的,真的。如果我从歌曲表中删除例如Michael Jackson,会发生什么?将通知“Playlist songs”表,或者我必须手动执行此操作?我的意思是我必须更改表“Playlist songs”中歌曲列的索引?您可以通过将
ON UPDATE
ON delete
语句添加到您的列表中来配置该行为关键定义。您从不更新表中的索引。id=1永远是Billie Jean。如果删除此歌曲,表格将从2开始。是的,我会为我创建的每个播放列表创建一个表格。我有一个表格用于创建的所有播放列表,以便在加载时检索它们,还有一个表格用于每个播放列表。这意味着您必须更新用户创建的每个播放列表的所有查询。你不会想要的,真的。如果我从歌曲表中删除例如Michael Jackson,会发生什么?将通知“Playlist songs”表,或者我必须手动执行此操作?我的意思是我必须更改表“Playlist songs”中歌曲列的索引?您可以通过将
ON UPDATE
ON delete
语句添加到您的列表中来配置该行为关键定义。您从不更新表中的索引。id=1永远是Billie Jean。如果删除这首歌,表格将从2开始。