假设所有播放列表都是用户主音乐库的子集,那么如何在数据库中管理主库和播放列表呢?playlists
即使是适量的用户,似乎桌子也会快速增长.对于nosql
在每个User
集合中都有播放列表列表的数据库来说,这是一个不错的用例,而不是将所有用户放在同一个地方的巨型播放列表表格吗?
你没有提供很多细节,所以我尽我所能回答.我认为关系数据库解决方案对于这个问题是完美的,虽然你可能最终在表playlists
和playlists_songs
表中有数百万条记录,但现代RDBMS应该能够毫无问题地处理它.
你可能需要也可能不需要/想要一张桌子albums
,为了完整起见我把它包括在这里......
albums id unsigned int(P) artist_id unsigned int(F artists.id) name varchar(50) ... +----+-----------+-----------------------------------+-----+ | id | artist_id | name | ... | +----+-----------+-----------------------------------+-----+ | 1 | 1 | The Last in Line | ... | | 2 | 3 | American IV: The Man Comes Around | ... | | 3 | 2 | Animal House Soundtrack | ... | | 4 | 4 | None or Unknown | ... | | .. | ......... | ................................. | ... | +----+-----------+-----------------------------------+-----+
像专辑一样,你可能会或可能不想要一张桌子,artists
但我已经把它包括在内,以防你想要显示那种数据.
artists id unsigned int(P) name varchar(50) ... +----+-------------+ | id | name | +----+-------------+ | 1 | Dio | | 2 | Various | | 3 | Johnny Cash | | 4 | Unknown | | 5 | Sam Cooke | | .. | ........... | +----+-------------+
我认为playlists
非常基本:用户可以拥有无限数量的用户,并且他们有一个名字.在我的示例数据中,我们看到bob有两个播放列表"Mix"和"Speeches",而mary只有一个"Oldies".
playlists id unsigned int(P) user_id unsigned int(F users.id) name varchar(50) +----+---------+----------+ | id | user_id | name | +----+---------+----------+ | 1 | 1 | Mix | | 2 | 1 | Speeches | | 3 | 2 | Oldies | | .. | ....... | ........ | +----+---------+----------+
我们必须跟踪每个播放列表中的歌曲.在我的示例数据中,您可以看到"埃及(The Chains Are On)"和"Hurt"在"Mix"播放列表中,而"Town Hall演讲"在"Speeches"播放列表和"Egypt(The Chains Are On)上)","伤害"和"Twistin'The Night Away"都在"Oldies"播放列表中.
playlists_songs id unsigned int(P) playlist_id unsigned int(F playlists.id) song_id unsigned int(F songs.id) +----+-------------+---------+ | id | playlist_id | song_id | +----+-------------+---------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 4 | | 4 | 3 | 1 | | 5 | 3 | 2 | | 6 | 3 | 3 | | .. | ........... | ....... | +----+-------------+---------+
即使数百万用户可能在他们的收藏中都有歌曲"伤害",我们只需要存储一次关于每首歌曲的信息.因此,在songs
表格中我们存储有关每首歌曲的信息,包括实际音频文件所在的位置.我的文件位置示例只是我的头脑,你如何实际组织文件系统中的文件可能会非常不同.
songs id unsigned int(P) album_id unsigned int(F albums.id) // Default NULL artist_id unsigned int(F artists.id) name varchar(50) filename varchar(255) ... +----+----------+-----------+---------------------------+---------------------------+-----+ | id | album_id | artist_id | name | filename | ... | +----+----------+-----------+---------------------------+---------------------------+-----+ | 1 | 1 | 1 | Egypt (The Chains Are On) | /media/audio/1/1/9.mp3 | ... | | 2 | 2 | 3 | Hurt | /media/audio/3/2/2.mp3 | ... | | 3 | 3 | 5 | Twistin' the Night Away | /media/audio/5/2/3.mp3 | ... | | 4 | NULL | 4 | Town Hall speech | /media/audio/4/4/<id>.mp3 | ... | | .. | ........ | ......... | ......................... | ......................... | ... | +----+----------+-----------+---------------------------+---------------------------+-----+
当然还有你的users
餐桌.
users id unsigned int(P) username varchar(32) password varbinary(255) ... +----+----------+----------+-----+ | id | username | password | ... | +----+----------+----------+-----+ | 1 | bob | ******** | ... | | 2 | mary | ******** | ... | | .. | ........ | ........ | ... | +----+----------+----------+-----+