音乐列表+播放列表Web应用程序的架构

 望尽天涯 发布于 2023-02-06 16:17

假设所有播放列表都是用户主音乐库的子集,那么如何在数据库中管理主库和播放列表呢?playlists即使是适量的用户,似乎桌子也会快速增长.对于nosql在每个User集合中都有播放列表列表的数据库来说,这是一个不错的用例,而不是将所有用户放在同一个地方的巨型播放列表表格吗?

1 个回答
  • 你没有提供很多细节,所以我尽我所能回答.我认为关系数据库解决方案对于这个问题是完美的,虽然你可能最终在表playlistsplaylists_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     | ******** | ... |
    | .. | ........ | ........ | ... |
    +----+----------+----------+-----+
    

    2023-02-06 16:21 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有