SQL 数据库 layout/design

SQL Database layout/design

我正在创建一个由 SQLite 数据库支持的音乐播放器。有一首歌曲 table 具有 ID、标题、艺术家、专辑等。我目前正在尝试制作播放列表,我想知道我的设计是否有效。最初我想制作一个 table 播放列表,每个播放列表条目都有一个歌曲 ID 列表。然后我会查询歌曲 table 以获取歌曲 ID 列表。类似于 SELECT * FROM songs where id=this OR id=that OR id=.... 的内容。但是,我刚刚阅读了有关加入的内容,所以现在我认为每个播放列表都应该是它自己的 table 并且播放列表 table 的条目只是歌曲 table 中的 ID我可以在特定播放列表 table 和歌曲 table 之间的歌曲 ID 列上进行内部连接。哪种方法效率更高?它们是等价的吗?

当您发现自己正在考虑创建多个相同的 table 来保存相似的数据时,您可能应该退后一步并重新考虑您的设计,因为这与关系模型的基本思想背道而驰。存储 "lists of ids" 的想法也是如此,我将其解释为某种数据数组,这对于一个好的模型来说也是不合适的,因为一行(或元组)中的每个项目都应该只存储一个值。

您的域的一种可能设计可能是这样的:

Songs (SongID PK, SongAttributes (name, length etc) ...)
Playlists (PlaylistID PK, PlaylistAttributes (like name, owner etc) ...)
PlaylistSongs (PlaylistID FK, SongID FK)

PK = Primary Key, FK = Foreign Key

至select 特定播放列表的所有歌曲歌曲:

select songs.name 
from songs 
join playlistsongs on songs.songid = playlistsongs.songid 
join playlist on playlist.playlistid = playlistsongs.playlistid 
where playlist.name = '???'

关于您的问题:
哪种方法效率更高?它们等价吗?

两者都不好,而且它们也不等同。在第一个示例中,您可能会遇到检索和更新数据的问题,而在另一个示例中,table 的数量将与播放列表的数量成线性关系,并且您必须注入使用 sui 进行的每个查询table table 运行 时的名字 - 这真的是你不想要的东西。

OR 语句很快变得低效,因此带有播放列表和播放列表 ID 的模型是一种选择。

示例: 歌曲 ----> 带有 SONGID 列表的播放列表

伪代码:

CREATE TABLE SONG (
song_id INT,
name VARCHAR,
other attributes);

CREATE TABLE playlists (
playlist_id INT,
song_id INT REFERENCES FOREIGN KEY song(song_id),
other playlist attributes);

那么您可以加入列表:

SELECT a.*, b.*
FROM playlists a 
INNER JOIN song b ON a.song_id=b.song_id AND a.playlist_id=?;

这将为您提供拥有 playlist_id X 的某个人的播放列表。