包含了设计报告与相关数据库sql,各位可自取
链接:连接
提取码:2333
音乐管理系统是一个为用户提供方便、快捷、高效的音乐平台,可以让用户可以随时随地享受音乐,发现新的音乐,分享自己的音乐喜好,增强音乐的社交属性。
用户管理:用户可以注册、登录、修改个人信息、注销账号等;
歌单管理:用户可以创建、编辑、删除自己的歌单,可以将音乐添加到歌单中,可以查看、收藏其他用户的歌单,可以分享自己的歌单到社交媒体等;
收藏管理:用户可以收藏自己喜欢的音乐、歌单、歌手等,可以查看、取消收藏、管理自己的收藏夹;
音乐管理:系统可以存储音乐的各种信息,包括歌曲、专辑、歌手、流派,歌词等。可以查询音乐的歌词,播放地址等;
评论管理:用户可以评论别人的歌曲,歌单,可以查看自己的评论,删除自己的评论。
处理流程:
用户相关流程:
歌单相关流程:
收藏相关流程:
音乐相关流程:
User:
Playlist:
Collect:
Music:
Comment:
总E-R图:
经过以上E-R图设计,再对相关表结构优化后得到如下设计:
此数据库是满足第二范式(2NF)的:
这个数据库满足第一范式(1NF),因为每个表中的所有属性都是不可再分的原子值。
这个数据库满足第二范式(2NF),因为每个表中的非主属性都完全函数依赖于主键,没有部分函数依赖的情况。例如,Music表中的所有非主属性都完全函数依赖于主键music_id,而不是部分依赖于music_name或art_name等。
这个数据库不满足第三范式(3NF):
因为type_name和tag_name字段并不能由music_id和playlist_id得出,
因此得出存在相关传递依赖:
type_id→type_name
tag_id→tag_name
art_id→art_name
另外因为另外CollectDetailsMusic表和CollectDetailsPlaylist表中的数据有着很多重合,外加上表数量很多后期难以维护,所以我将这两个合并成一张CollectDetails表,再加上一个字段item_type用以区分item_id是Music_id还是Playlist_id
经过修改后得到以下数据表:
这个数据库满足第三范式(3NF),因为每个表中的非主属性都不传递函数依赖于主键,也就是说,不存在非主属性之间的依赖关系。例如,Music表中的type_id属性不依赖于music_name属性,而只依赖于主键user_id。
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
user_id | char | 10 | √ | √ | 用户唯一标识 |
user_name | varchar | 50 | √ | 用户的用户名 | |
user_password | varchar | 20 | √ | 用户的密码 | |
varchar | 50 | √ | 用户的邮箱 | ||
phone | char | 11 | √ | 用户的手机号 | |
nickname | varchar | 50 | √ | 用户的昵称 | |
gender | enum | 用户的性别 | |||
age | int | 50 | 用户的年龄 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
music_id | char | 10 | √ | √ | 音乐的唯一标识 |
music_name | varchar | 50 | √ | 音乐的名称 | |
art_id | char | 10 | √ | 音乐的歌手的id | |
album | varchar | 50 | 音乐的专辑名称 | ||
cover_url | varchar | 100 | √ | 音乐的封面 | |
lyric_url | varchar | 100 | 音乐的歌词 | ||
type_id | char | 5 | √ | 音乐风格的唯一标识 | |
play_count | bigint | 音乐的播放量 | |||
collect_count | bigint | 音乐的收藏量 | |||
play_url | varchar | 100 | √ | 音乐的播放地址 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
playlist_id | char | 10 | √ | √ | 歌单的唯一标识 |
playlist_name | varchar | 50 | √ | 歌单的名称 | |
user_id | char | 10 | √ | 歌单的创建者 | |
create_time | date | √ | 歌单的创建时间 | ||
description | text | 歌单的描述 | |||
cover_url | varchar | 100 | √ | 歌单的封面 | |
tag_id | char | 5 | √ | 歌单标签的唯一标识 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
tag_id | char | 5 | √ | √ | 歌单标签的唯一标识 |
tag_name | varchar | 10 | √ | 歌单标签 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
playlist_id | char | 10 | √ | √ | 歌单的唯一标识 |
music_id | char | 10 | √ | √ | 音乐的唯一标识 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
collect_id | char | 10 | √ | √ | 收藏的唯一标识 |
user_id | char | 10 | √ | 收藏的用户 | |
collect_time | date | √ | 收藏的创建时间 | ||
collect_name | varchar | 20 | 收藏的名字 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
collect_id | char | 10 | √ | √ | 收藏的唯一标识 |
list_id | char | 10 | √ | √ | 收藏项目的唯一标识 |
item_type | enum | √ | √ | 收藏项目的类型 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
type_id | char | 5 | √ | √ | 音乐风格的唯一标识 |
type_name | varchar | 50 | √ | 音乐风格 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
con_id | char | 10 | √ | √ | 评论的唯一标识 |
user_id | char | 10 | √ | 评论用户的唯一标识 | |
content | text | √ | 评论的内容 | ||
item_id | char | 10 | √ | 被评论对象的id | |
item_type | enum | √ | 被评论对象的类型 |
字段名 | 数据类型 | 长度 | 主键 | 非空 | 描述 |
---|---|---|---|---|---|
art_id | char | 10 | √ | √ | 歌手的唯一标识 |
art_name | varchar | 50 | √ | 歌手姓名 |
表名 | 索引名 | 索引列 | 索引类型 |
---|---|---|---|
User | User_PrimaryKey | user_id | 主键索引 |
User | User_Unique_email | 唯一性索引 | |
User | User_Unique_phone | phone | 唯一性索引 |
Music | Music_PrimaryKey | music_id | 主键索引 |
Playlist | Playlist_PrimaryKey | playlist_id | 主键索引 |
PlaylistDetails | PlaylistDetails_PrimaryKey | playlist_id music_id | 主键索引 |
Collect | Collect_PrimaryKey | collect_id | 主键索引 |
CollectDetails | CollectDetails_PrimaryKey | collect_id item_id item_type | 主键索引 |
Comment | Comment_PrimaryKey | con_id | 主键索引 |
MusicType | MusicType_PrimaryKey | type_id | 主键索引 |
PlaylistType | PlaylistType_PrimaryKey | tag_id | 主键索引 |
Artist | Artist_PrimaryKey | art_id | 主键索引 |
综上所述:
本数据库一共设计了10张表,User表用来存储用户数据、Music表用来存储音乐数据、Artist表用来存储作者数据、Playlist表用来存储歌单的定义数据、PlaylistDetails表用来存储歌单中具体歌曲列表数据、Collect表用来存储收藏的定义数据、CollectDetails表用来存储收藏的具体项目数据、Comment表用来存储评论数据、MusicType表用来存储音乐的风格数据、PlaylistType表用来存储歌单的类型数据;
本数据库一共定义了12个索引,其中10个索引均为主键索引,在定义主键时会自动生成,2个唯一索引,分别是User表中的phone和email字段。
CREATE DATABASE MusicManager;
USE MusicManager;
CREATE TABLE User (
user_id CHAR ( 10 ) PRIMARY KEY,
user_name VARCHAR ( 50 ) NOT NULL,
user_password VARCHAR ( 20 ) NOT NULL,
email VARCHAR ( 50 ) NOT NULL UNIQUE,
phone CHAR ( 11 ) NOT NULL UNIQUE,
nickname VARCHAR ( 50 ) NOT NULL,
gender ENUM ( '男', '女' ,'未知') DEFAULT '未知' ,
age INT DEFAULT 18
);
CREATE TABLE Music (
music_id CHAR ( 10 ) PRIMARY KEY,
music_name VARCHAR ( 50 ) NOT NULL,
art_id CHAR ( 10 ) NOT NULL,
album VARCHAR ( 50 ),
cover_url VARCHAR ( 100 ) NOT NULL,
lyric_url VARCHAR ( 100 ),
type_id CHAR ( 5 ) NOT NULL,
play_count BIGINT DEFAULT 0,
collect_count BIGINT DEFAULT 0,
play_url VARCHAR ( 100 ) NOT NULL
);
CREATE TABLE Playlist (
playlist_id CHAR ( 10 ) PRIMARY KEY,
playlist_name VARCHAR ( 50 ) NOT NULL,
user_id CHAR ( 10 ) NOT NULL,
create_time DATE NOT NULL,
description TEXT,
cover_url VARCHAR ( 100 ) NOT NULL,
tag_id CHAR ( 5 ) NOT NULL
);
CREATE TABLE PlaylistType (
tag_id CHAR ( 5 ) PRIMARY KEY,
tag_name VARCHAR ( 10 ) NOT NULL
);
CREATE TABLE PlaylistDetails (
playlist_id CHAR ( 10 ) NOT NULL,
music_id CHAR ( 10 ) NOT NULL,
PRIMARY KEY ( playlist_id, music_id )
);
CREATE TABLE Collect (
collect_id CHAR ( 10 ) PRIMARY KEY,
user_id CHAR ( 10 ) NOT NULL,
collect_time DATE NOT NULL,
collect_name VARCHAR ( 20 )
);
CREATE TABLE CollectDetails (
collect_id CHAR ( 10 ) NOT NULL,
list_id CHAR ( 10 ) NOT NULL,
item_type ENUM ( '歌单', '歌曲' ) NOT NULL,
PRIMARY KEY ( collect_id, list_id, item_type )
);
CREATE TABLE MusicType (
type_id CHAR ( 5 ) PRIMARY KEY,
type_name VARCHAR ( 50 ) NOT NULL
);
CREATE TABLE Comment (
con_id CHAR ( 10 ) PRIMARY KEY,
user_id CHAR ( 10 ) NOT NULL,
content TEXT NOT NULL,
item_id CHAR ( 10 ) NOT NULL,
item_type ENUM ( '歌曲', '歌单' ) NOT NULL
);
CREATE TABLE Artist (
art_id CHAR ( 10 ) PRIMARY KEY,
art_name VARCHAR ( 50 ) NOT NULL
);
ALTER TABLE Music
ADD FOREIGN KEY ( type_id )
REFERENCES MusicType ( type_id ),
ADD FOREIGN KEY ( art_id )
REFERENCES Artist ( art_id );
ALTER TABLE Playlist
ADD FOREIGN KEY ( user_id )
REFERENCES User ( user_id ),
ADD FOREIGN KEY ( tag_id )
REFERENCES PlaylistType ( tag_id );
ALTER TABLE PlaylistDetails
ADD FOREIGN KEY ( playlist_id )
REFERENCES Playlist ( playlist_id ),
ADD FOREIGN KEY ( music_id )
REFERENCES Music ( music_id );
ALTER TABLE Collect
ADD FOREIGN KEY ( user_id )
REFERENCES USER ( user_id );
ALTER TABLE CollectDetails
ADD FOREIGN KEY ( collect_id )
REFERENCES Collect ( collect_id );
ALTER TABLE Comment
ADD FOREIGN KEY ( user_id )
REFERENCES User ( User_id );
用户想要修改相关数据表必须拥有相关数据表权限
音乐管理系统是一个完善的数据库系统。系统的业务需求包括用户管理、歌单管理、收藏管理、音乐管理和评论管理。系统的功能需求及数据需求分析包括用户模块、歌单模块、收藏模块、音乐模块和评论模块。系统的业务规则分析包括用户规则、歌单规则、收藏规则、音乐规则和评论规则。系统中一共包含了10个表,以及对应的主键与相应的外键。创建的数个存储过程、函数与触发器保障了数据库的完整性与安全性;在撰写这次大作业的过程中,我学到很多,如如何分析业务需求和数据需求,如何设计数据库表,如何确保数据库的完整性和安全性;明白了如何分析业务需求,如何更好的理解业务,如将业务转化成文字与图表与代码,最终实现业务的流程,我也明白了团队合作的重要性,很多事光凭一个人的力量很难进行下去,唯有进行团队合作,合理分工才能顺利推进;在完成这次作业过程中我也遇到了很多问题与困难,如对于业务的不理解,导致走了很多弯路,前期方案一直改了删删了改,浪费了很多时间。如对于数据库的一些理论知识也遗忘了很多,如关系转换,er图,第几范式等。解决方案也很简单,第一就是不断熟悉业务,多想想具体的应用场景,其次对于数据库的基础知识,也需要对其进行专门的复习与记忆,并不断在项目中实践,这将是一个长期的过程,需要不断进行。综上所述,在完成这次作业的过程中我学到了很多,虽然也遇到了很多困难,但有这些困难得到的经验与教训是十分宝贵的。我在以后的学习和工作中,也将不断总结经验,不断提高自己的能力,取得更好的成果。