一. 前言
临近期末,为了完成数据库的课程设计,花了几天的时间独自设计并实现了《个人博客数据库管理系统》这个小项目。
下面是整个课程设计的完整文件,可能一开始的步骤有些繁琐,但每一步都是严格遵循数据库的课程设计规范,希望能帮助到有同样需求的你。
注:本网站并非采用下面的数据库
二. 项目概述
1. 编写目的
本文档是充分建立在对个人博客基本功能充分调研上,通过在博客使用过程中的各种问题进行分析得出的用户需求分析。
本文档为充分明确需求分析、安排项目规划与进度、组织软件开发与测试,特撰写此文档。本文档提供开发人员、测试人员进行参考。
2. 项目背景
随着互联网的发展,越来越多的人拥有了自己的个人博客。但是大多数采用的是网上别人做好的博客模板,众所周知,网上的模板并不是单独为个人而定制,而是面向大多数人的,所以只能满足我们的一部分需求,于是便想自己独立设计一个博客,来满足自己的所有需要。
三. 需求分析
1. 系统概述
系统主要完成以下几方面的功能:
- 网站管理:网站的基础设置和主题以及插件相关信息。
- 用户管理:用户的注册和登录,发表博文和评论,添加好友。
- 博文管理:用户可以在网站中发表和设置博文。
- 评论管理:用户可以评论博文和回复其他用户的评论。
- 分类管理:添加和删除分类,给文章设置分类。
- 标签管理:添加和删除标签,给文章设置标签。
- 论坛管理:发布和设置论坛信息,管理帖子。
- 友情链接:设置和发布友情链接。
2. 系统功能结构图
根据需求概述,得到系统功能结构图1如下所示:
系统功能结构图
2.1 网站管理
- 网站拥有以下信息:网站标题、网站副标题、网站描述、网站ico图标、网站Logo、网站关键词、网站网址。
- 网站主要有以下设置:站点语言、日期格式、时间格式、是否允许用户注册等等。
- 只有管理员可以添加、删除、修改网站信息。
2.2 用户管理
- 用户的相关信息如下:用户ID、用户IP、用户名、用户昵称、用户密码、用户邮箱、用户头像、用户等级、用户权限、注册时间、用户生日、用户年龄、用户手机号。
- 用户注册时需提供用户名、用户密码、用户邮箱或用户手机号。
- 用户登录时可以采用用户名或邮箱或手机号进行登录。
- 用户可以发布博文、发表评论、发布帖子、回复帖子,还可以添加其他用户为好友。
- 用户级别分为管理员和普通用户,管理员普通用户都可以担当论坛版主。
- 管理员可以添加、删除、修改普通用户的任何信息,还添加、删除、修改任何论坛的信息。
2.3 博文管理
- 博文的相关信息如下:博文ID、发布日期、发表用户、博文标题、博文内容、点赞数、回复数、游览量。
- 博文可以被普通用户发布、修改、删除和评论,但修改和删除仅限于自己发表的动态。
- 博文发布时需要设置分类、标签。
2.4 评论管理
- 评论的相关信息如下:评论ID、评论日期、点赞数、发表用户、评论文章ID、评论内容、父评论ID。
- 评论可以被用户发表和删除以及被其他用户回复。
2.5 分类管理
- 分类的相关信息如下:分类ID、分类名称、分类别名、分类描述、父分类ID。
- 只有管理员可以添加、删除、修改分类。
- 分类的作用不仅可以将文章分类,还可以作为博客的菜单。
2.6 标签管理
- 标签的相关信息如下:标签ID、标签名称、标签别名、标签描述。
- 用户发表文章时可以设置标签,标签不仅可以将文章分类,还可以作为博客的菜单。
2.7 论坛管理
- 论坛相关信息如下:论坛ID、论坛名称、论坛描述、论坛Logo、论坛背景、论坛帖子个数、父论坛ID。
- 帖子相关信息如下:帖子ID、帖子标题、帖子内容、发帖时间、回帖个数、发表用户、帖子浏览量、帖子状态。
- 帖子回复相关信息如下。回贴ID、回帖用户、回帖内容、回帖时间、所属主贴ID、父回贴ID。
- 管理员可以设置论坛版主,版主可以设置该论坛下的子论坛版主,版主可以加精、置顶帖子、设置论坛信息。
2.8 菜单管理
- 总菜单的相关信息如下:菜单ID、菜单名称。
- 总菜单由子菜单组成,子菜单有以下信息: 链接ID、链接名称、链接目标、打开方式、父链ID。
- 只有管理员可以添加、删除、修改总菜单和子菜单。
2.9 友链管理
- 友链的相关信息如下:友链ID、友链链接、友链名称、友链描述、友链Logo。
- 只有管理员可以添加、删除、修改友链。
四. 数据库概念模型设计
1. 网站管理
网站管理E-R图
2. 用户管理
用户管理E-R图
3. 博文管理
博文管理E-R图
4. 评论管理
评论管理E-R图
5. 分类管理
分类管理E-R图
6. 标签管理
标签管理E-R图
7. 论坛管理
论坛管理E-R图
8. 菜单管理
菜单管理E-R图
9. 友链管理
友链管理E-R图
10. 基本E-R图
基本E-R图
五. 数据库逻辑模型设计
1. 关系模式集合
- 网站管理(选项ID,选项名称,选项值)
- 用户(用户ID,用户IP,用户名,用户密码,用户邮箱,用户昵称,用户头像,用户等级,用户权限,注册时间,用户生日,用户年龄,用户手机号)
- 用户好友(标识ID,用户ID,好友ID,好友备注,好友状态)
- 博文(博文ID,发表用户ID,博文标题,博文内容,浏览量,评论总数,发表日期,点赞数)
- 评论(评论ID,发表用户ID,评论文章ID,点赞数,评论日期,评论内容,父评论ID)
- 分类(分类ID,分类名称,分类别名,分类描述,父分类ID)
- 博文设置分类(博文ID,分类ID)
- 标签(标签ID,标签名称,标签别名,标签描述)
- 博文设置标签(博文ID,标签ID)
- 总菜单(总菜单ID,总菜单名称)
- 子菜单(子菜单ID,菜单ID,子菜单名称,子菜单链接,子菜单打开方式,父菜单ID)
- 论坛(论坛ID,论坛名称,论坛描述,论坛Logo,论坛帖子个数,父论坛ID)
- 主贴(主题ID,论坛ID,发帖用户ID,帖子标题,帖子浏览量,帖子内容,发帖时间,帖子状态,回帖个数)
- 回复帖子(回帖ID,回帖用户ID,所属主贴ID,回帖内容,回帖时间,父回帖ID)
- 版主(版主ID,论坛ID,版主级别)
- 友情链接(友链ID,友链链接,友链名称,友链描述,友链Logo)
2. 数据库表结构设计
2.1 网站管理
2.2 用户管理
2.3 博文管理
2.4 评论管理
2.5 分类管理
2.6 标签管理
2.7 论坛管理
2.8 菜单管理
2.9 友链管理
六. 数据库实现
1. 创建数据库
CREATE DATABASE BLOG;
2. 创建表
2.1网站管理表
CREATE TABLE zj_options ( option_id int(11) NOT NULL AUTO_INCREMENT, option_name varchar(255) NOT NULL, option_values longtext NOT NULL, PRIMARY KEY ( option_id ), KEY option_name ( option_name ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2用户表
CREATE TABLE zj_users ( user_id bigint(20) NOT NULL AUTO_INCREMENT, user_ip varchar(20) NOT NULL, user_name varchar(20) NOT NULL, user_password varchar(15) NOT NULL, user_email varchar(30) NOT NULL, user_profile_photo varchar(255) NOT NULL, user_level varchar(20) NOT NULL, user_rights varchar(20) NOT NULL, user_registration_time datetime NOT NULL, user_birthday date DEFAULT NULL, user_age tinyint(4) DEFAULT NULL, user_telephone_number int(11) NOT NULL, user_nickname varchar(20) NOT NULL, PRIMARY KEY ( user_id ), KEY user_name ( user_name ), KEY user_nickname ( user_nickname ), KEY user_email ( user_email ), KEY user_telephone_number ( user_telephone_number ) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
2.3 用户好友表
CREATE TABLE zj_user_friends ( Id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, user_friends_id bigint(20) NOT NULL, user_note varchar(20) NOT NULL, user_status varchar(20) NOT NULL, PRIMARY KEY ( id ), KEY user_id ( user_id ) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.4 博文表
CREATE TABLE zj_articles ( article_id bigint(255) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, article_title text NOT NULL, article_content longtext NOT NULL, article_views bigint(20) NOT NULL, article_comment_count bigint(20) NOT NULL, article_date datetime NOT NULL, article_like_count bigint(20) NOT NULL, PRIMARY KEY ( article_id ), KEY user_id ( user_id ) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.5文章评论表
CREATE TABLE zj_comments ( comment_id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, article_id bigint(20) NOT NULL, comment_like_count bigint(20) NOT NULL, comment_date datetime NOT NULL, comment_content text NOT NULL, parent_comment_id bigint(20) NOT NULL, PRIMARY KEY ( comment_id ), KEY article_id ( article_id ), KEY comment_date ( comment_date ), KEY parent_comment_id ( parent_comment_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.6 分类表
CREATE TABLE zj_sorts ( sort_id bigint(20) NOT NULL, sort_name varchar(50) NOT NULL, sort_alias varchar(15) NOT NULL, sort_description text NOT NULL, parent_sort_id bigint(20) NOT NULL, PRIMARY KEY ( sort_id ), KEY sort_name ( sort_name ), KEY sort_alias ( sort_alias ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.7 文章设置分类表
CREATE TABLE zj_set_artitle_sort ( article_id bigint(20) NOT NULL, sort_id bigint(20) NOT NULL, PRIMARY KEY ( article_id , sort_id ), KEY sort_id ( sort_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.8 标签表
CREATE TABLE zj_labels ( label_id bigint(20) NOT NULL AUTO_INCREMENT, label_name varchar(20) NOT NULL, label_alias varchar(15) NOT NULL, label_description text NOT NULL, PRIMARY KEY ( label_id ), KEY label_name ( label_name ), KEY label_alias ( label_alias ) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.9 文章设置标签表
CREATE TABLE zj_set_artitle_label ( article_id bigint(20) NOT NULL AUTO_INCREMENT, label_id bigint(20) NOT NULL, PRIMARY KEY ( article_id ), KEY label_id ( label_id ) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.10论坛表
CREATE TABLE zj_forums ( forum_id bigint(20) NOT NULL AUTO_INCREMENT, forum_name varchar(20) NOT NULL, forum_description text NOT NULL, forum_logo varchar(255) NOT NULL, forum_post_count bigint(20) NOT NULL, parent_forum_id bigint(20) NOT NULL, PRIMARY KEY ( forum_id ), KEY forum_name ( forum_name ), KEY parent_forum_id ( parent_forum_id ) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.11主贴表
CREATE TABLE zj_posts ( post_id bigint(20) NOT NULL AUTO_INCREMENT, forum_id bigint(20) NOT NULL, user_id bigint(20) NOT NULL, post_title text NOT NULL, post_views bigint(20) NOT NULL, post_content longtext NOT NULL, post_date datetime NOT NULL, post_status varchar(20) NOT NULL, post_comment_count bigint(20) NOT NULL, PRIMARY KEY ( post_id ) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
2.12 回贴表
CREATE TABLE zj_floors ( floor_id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, post_id bigint(20) NOT NULL, floor_content longtext NOT NULL, floor_date datetime NOT NULL, parent_floor_id bigint(20) NOT NULL, PRIMARY KEY ( floor_id ), KEY parent_floor_id ( parent_floor_id ), KEY user_id ( user_id , post_id ), KEY floor_date ( floor_date ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.13 版主表
CREATE TABLE zj_moderator ( moderator_id bigint(20) NOT NULL AUTO_INCREMENT, forum_id bigint(20) NOT NULL, moderator_level varchar(20) NOT NULL, PRIMARY KEY ( moderator_id , forum_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.14 总菜单表
CREATE TABLE zj_menus ( menu_id bigint(20) NOT NULL AUTO_INCREMENT, menu_name varchar(20) NOT NULL, PRIMARY KEY ( menu_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.15 子菜单表
CREATE TABLE zj_submenus ( link_id bigint(20) NOT NULL AUTO_INCREMENT, menu_id bigint(20) NOT NULL, link_name varchar(255) NOT NULL, link_target varchar(255) NOT NULL, link_open_way varchar(20) NOT NULL, parent_link_id bigint(20) NOT NULL, PRIMARY KEY ( link_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.16 友链表
CREATE TABLE zj_friend_links ( friend_link_id bigint(20) NOT NULL AUTO_INCREMENT, friend_links varchar(255) NOT NULL, friend_link_name varchar(20) NOT NULL, friend_link_description text NOT NULL, friend_link_logo varchar(255) NOT NULL, PRIMARY KEY ( friend_link_id ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3. 创建视图
3.1 某用户发表过的所有博文视图
CREATE VIEW Articles AS SELECT zj_articles.user_id AS user_id, zj_users.user_name AS user_name, zj_articles.article_id AS article_id, zj_articles.article_title AS article_title, zj_articles.article_content AS article_content FROM ( zj_articles JOIN zj_users ) WHERE ( zj_articles.user_id = zj_users.user_id ) ;
3.2 某用户发表过的所有帖子视图
CREATE VIEW Posts AS SELECT zj_posts.user_id AS user_id, zj_users.user_name AS user_name, zj_posts.post_id AS post_id, zj_posts.post_title AS post_title, zj_posts.post_content AS post_content, zj_posts.forum_id AS forum_id, zj_forums.forum_name AS forum_name FROM ( (zj_posts JOIN zj_users) JOIN zj_forums ) WHERE ( ( zj_posts.user_id = zj_users.user_id ) AND ( zj_posts.forum_id = zj_forums.forum_id ) ) ;
3.3 某用户的所有好友视图
CREATE VIEW Friends AS SELECT zj_user_friends.user_id AS user_id, zj_users.user_name AS user_name, zj_user_friends.user_friends_id AS user_friends_id, zj_user_friends.user_note AS user_note FROM ( zj_users JOIN zj_user_friends ) WHERE ( zj_users.user_id = zj_user_friends.user_id ) ;
3.4 某标签下的所有博文视图
CREATE VIEW Label AS SELECT zj_set_artitle_label.label_id AS label_id, zj_labels.label_name AS label_name, zj_set_artitle_label.article_id AS article_id, zj_articles.article_title AS article_title FROM ( ( zj_labels JOIN zj_articles ) JOIN zj_set_artitle_label ) WHERE ( ( zj_set_artitle_label.article_id = zj_articles.article_id ) AND ( zj_set_artitle_label.label_id = zj_labels.label_id ) ) ;
3.5 某分类下的所有博文视图
CREATE VIEW Sort AS SELECT zj_set_artitle_sort.sort_id AS sort_id, zj_sorts.sort_name AS sort_name, zj_set_artitle_sort.article_id AS article_id, zj_articles.article_title AS article_title FROM ( ( zj_articles JOIN zj_set_artitle_sort ) JOIN zj_sorts ) WHERE ( ( zj_articles.article_id = zj_set_artitle_sort.article_id ) AND ( zj_sorts.sort_id = zj_set_artitle_sort.sort_id ) ) ;
3.6 某论坛下的所有帖子视图
CREATE VIEW Forums AS SELECT zj_forums.forum_id AS forum_id, zj_forums.forum_name AS forum_name, zj_posts.post_id AS post_id, zj_posts.post_title AS post_title FROM (zj_forums JOIN zj_posts) WHERE ( zj_forums.forum_id = zj_posts.forum_id ) ;
七. sql文件
八. 结束语
从我第一次接触数据库起,就对这门课程产生了浓厚的兴趣,毕竟现在网络这么发达,而每个网络产品和应用都离不开数据库,可见数据库的重要性。
从第一节课的懵懵懂懂,到今天可以自己一个人独立完成数据库的课程设计,在这期间我学到了非常多的知识,也遇到了很多的困难。在这次数据库设计中,光是博客系统的需求就耗费了我将近1/3的时间。在画ER图的时候,有时候会把实体和属性搞混,也有时候因为决定使用二元联系还是三元联系考虑好久……
虽然遇到了很多困难,但是在老师和网络的帮助下这些问题都得到了解决。在这里再次感谢老师和那些帮助过我的人。
这次课程设计我最大的收获就是,人无论做什么事,一定要不怕困难,努力坚持。很多时候我们离成功就差最后的那一点点,如果此时放弃了那么前功尽弃,而坚持下去,结果一定不会让我们失望!希望在以后的学习中,自己能够再接再厉,更加深入的学习数据库的其他知识,早日实现自己的梦想,加油吧!
还有