2015-07-11 66 views
-1

我是一个初学者mysql学习者,并且想要使用规范化规则设计音乐数据库。音乐数据库设计

我们有一个track table谁存储有关trackstrack_id, track_name, artist_name等也是我想创建一个playlist表,其中一个轨道会属于多个播放列表中,那么,如何设计这样类型的数据库的详细信息。

track_table(track_id, track_title, album_id) album_table(album_id, album_name, total_track) playlist(plyalist_id, playlist_name, track_ids)

我应该用上面的方法,把track_ids将是这样的:101, 102, 103, 104, 105,但我认为这不是一个好主意,因为与php作为服务器端它会有点慢。因为我们必须使用implodelooping来获取所有track_title的列表。

如果有人想帮忙。我真的很感激。

`

+0

听起来没问题。设计应该独立于DBMS。如果它被严重优化,那不是你的错。你的工作是设计一个一致的逻辑模式。 – runDOSrun

+0

同一曲目有时可能会出现在多个专辑中。所以,我会使用联结表(曲目,专辑)。 – Strawberry

+0

除了作为一个启动mysql用户,你是一个启动数据库设计师?如果是这样,我建议你先学习基础知识。基本面并不明显,但可以学习。在回答上一个问题时有很多参考文献。如果我能找到那个问题,我会通过它。 –

回答

0

这样的想法是不是在关系数据库设计感很“关系”。我认为你应该在自己的表中拥有播放列表项目

playlist_item(playlist_id, album_id, track_id) 

也就是说,如果track_id不是唯一的!

然后不需要按照您的建议将track_id存储在一个集合中。不需要在您的php代码中爆炸或这样。再多一个JOIN

一般建议:在每个表格中始终使用一个简单的主键。根据需要添加自然键作为索引和/或创建约束。

+0

希望track_id是轨道表上的主键,因此可以从playlist_item表中删除album_id。你可能也需要一个play_order列。 –

+0

我会给每个表一个名为“ID”的通用主键列,但它似乎已经失去了兴趣。 – luksch

0

播放列表跟踪是一个“多对一对多”的关系,所以你需要之间的表:

playlist(plyalist_id, playlist_name) 
playlist_tracks (playlist_id, track_id, sequence) 

sequence是1,2,...(假设你想要播放列表播放按照一定的顺序)。

CREATE TABLE playlist_tracks (
    playlist_id ..., 
    track_id ..., 
    sequence TINYINT UNSIGNED NOT NULL, 
    PRIMARY KEY(playlist_id, sequence), -- for playing them 
    INDEX(track_id) -- in case you want to see which playlists contain a particular track 
) ENGINE=InnoDB;