假设所有播放列表都是用户主音乐库的子集,那么如何在数据库中管理主库和播放列表呢?即使是适量的用户,似乎playlists
表也会非常快速地增长。对于nosql
数据库来说,这是一个不错的用例,在每个User
集合中都有一个播放列表列表,而不是将所有用户放在同一个地方的巨型播放列表表格?
答案 0 :(得分:14)
你没有提供很多细节,所以我尽我所能回答。我认为关系数据库解决方案对于这个问题是完美的,尽管在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 | ******** | ... |
| .. | ........ | ........ | ... |
+----+----------+----------+-----+
答案 1 :(得分:2)
我认为像下面这样的概念设计会有所帮助。 这里的关键是将媒体文件存储在应用程序的数据库之外,并通过媒体路径在它们之间建立链接。 一些RDBMS提供了访问文件系统的API,如Oracle BFILE或SqlServer FILESTREAM 。
使用关系或No-Sql解决方案与应用程序业务有关 他们中的任何一个都有自己的优点和缺点,比较可能是found here。