数据库设计的基本步骤
按照规范设计的方法,考虑数据库及其应用系统开发全过程,将数据库设计分为以下6个阶段
1.需求分析
2.概念结构设计
3.逻辑结构设计
4.物理结构设计
5.数据库实施
6.数据库的运行和维护
数据库设计通常分为6个阶段1(需求分析:分析用户的需求,包括数据、功能和性能需求;2概念结构设计:主要采用E-R模型进行设计,包括画E-R图;3逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换;4数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存取路径;5数据库的实施:包括编程、测试和试运行;6数据库运行与维护:系统的运行与数据库的日常维护。),主要讨论其中的第3个阶段,即逻辑设计。
在数据库设计过程中,需求分析和概念设计可以独立于任何数据库管理系统进行,逻辑设计和物理设计与选用的DAMS密切相关。
1.需求分析阶段(常用自顶向下)
进行数据库设计首先必须准确了解和分析用户需求(包括数据与处理)。需求分析是整个设计过程的基础,也是最困难,最耗时的一步。需求分析是否做得充分和准确,决定了在其上构建数据库大厦的速度与质量。需求分析做的不好,会导致整个数据库设计返工重做。
需求分析的任务,是通过详细调查现实世界要处理的对象,充分了解原系统工作概况,明确用户的各种需求,然后在此基础上确定新的系统功能,新系统还得充分考虑今后可能的扩充与改变,不仅仅能够按当前应用需求来设计。
调查的重点是,数据与处理。达到信息要求,处理要求,安全性和完整性要求。
分析方法常用SA(Structured Analysis) 结构化分析方法,SA方法从最上层的系统组织结构入手,采用自顶向下,逐层分解的方式分析系统。
数据流图表达了数据和处理过程的关系,在SA方法中,处理过程的处理逻辑常常借助判定表或判定树来描述。在处理功能逐步分解的同事,系统中的数据也逐级分解,形成若干层次的数据流图。系统中的数据则借助数据字典(data dictionary,DD)来描述。数据字典是系统中各类数据描述的集合,数据字典通常包括数据项,数据结构,数据流,数据存储,和处理过程5个阶段。
2.概念结构设计阶段(常用自底向上)
概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合,归纳与抽象,形成了一个独立于具体DBMS的概念模型。
设计概念结构通常有四类方法:
- 自顶向下。即首先定义全局概念结构的框架,再逐步细化。
- 自底向上。即首先定义各局部应用的概念结构,然后再将他们集成起来,得到全局概念结构。
- 逐步扩张。首先定义最重要的核心概念结构,然后向外扩张,以滚雪球的方式逐步生成其他的概念结构,直至总体概念结构。
- 混合策略。即自顶向下和自底向上相结合。
3.逻辑结构设计阶段(E-R图)
逻辑结构设计是将概念结构转换为某个DBMS所支持的数据模型,并将进行优化。
在这阶段,E-R图显得异常重要。大家要学会各个实体定义的属性来画出总体的E-R图。
各分E-R图之间的冲突主要有三类:属性冲突,命名冲突,和结构冲突。
E-R图向关系模型的转换,要解决的问题是如何将实体性和实体间的联系转换为关系模式,如何确定这些关系模式的属性和码。
4.物理设计阶段
物理设计是为逻辑数据结构模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。
首先要对运行的事务详细分析,获得选择物理数据库设计所需要的参数,其次,要充分了解所用的RDBMS的内部特征,特别是系统提供的存取方法和存储结构。
常用的存取方法有三类:1.索引方法,目前主要是B+树索引方法。2.聚簇方法(Clustering)方法。3.是HASH方法。
5.数据库实施阶段
数据库实施阶段,设计人员运营DBMS提供的数据库语言(如sql)及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制和调试应用程序,组织数据入库,并进行试运行。
6.数据库运行和维护阶段
数据库应用系统经过试运行后,即可投入正式运行,在数据库系统运行过程中必须不断地对其进行评价,调整,修改。
例:个人博客数据库设计
一、 概述及分析
1.1 项目背景
随着互联网的发展,越来越多的人拥有了自己的个人博客。但是大多数采用的是网上别人做好的博客模板,众所周知,网上的模板并不是单独为个人而定制,而是面向大多数人的,独立设计一个博客,满足自己的需求。
1.2 分析
- 系统主要完成以下几方面的功能:
- 用户管理:用户的注册和登录,发表博文和评论。
- 博文管理:用户可以在网站中发表和设置博文。
- 评论管理:用户可以评论博文和回复其他用户的评论。
- 分类管理:添加和删除分类,给文章设置分类。
- 标签管理:添加和删除标签,给文章设置标签。
1.3 系统功能
1.3.1 用户管理
用户的相关信息如下:用户ID、用户IP、用户名、用户昵称、用户密码、用户邮箱、用户头像、注册时间、用户生日、用户年龄、用户手机号。
用户注册时需提供用户名、用户密码、用户邮箱或用户手机号。
用户登录时可以采用用户名或邮箱或手机号进行登录。
用户可以发布博文、发表评论、回复,还可以添加其他用户为好友。
1.3.2 博文管理
博文的相关信息如下:博文ID、发布日期、发表用户、博文标题、博文内容、点赞数、回复数、游览量。
博文可以被普通用户发布、修改、删除和评论,但修改和删除仅限于自己发表的动态。
博文发布时需要设置分类、标签。
1.3.3 评论管理
评论的相关信息如下:评论ID、评论日期、点赞数、发表用户、评论文章ID、评论内容、父评论ID。
评论可以被用户发表和删除以及被其他用户回复。
1.3.4 分类管理
分类的相关信息如下:分类ID、分类名称、分类别名、分类描述、父分类ID。
只有管理员可以添加、删除、修改分类。
分类的作用不仅可以将文章分类,还可以作为博客的菜单。
1.3.5 标签管理
标签的相关信息如下:标签ID、标签名称、标签别名、标签描述。
用户发表文章时可以设置标签,标签不仅可以将文章分类,还可以作为博客的菜单。
二、数据库概念模型设计—基本ER图
三、数据库逻辑模型设计
四、数据库语句
4.1 建立数据表语句(部分)
CREATE TABLE `zj_users` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_ip` varchar(20) NOT NULL COMMENT '用户IP',
`user_name` varchar(20) NOT NULL COMMENT '用户名',
`user_password` varchar(15) NOT NULL COMMENT '用户密码',
`user_email` varchar(30) NOT NULL COMMENT '用户邮箱',
`user_profile_photo` varchar(255) NOT NULL COMMENT '用户头像',
`user_registration_time` datetime DEFAULT NULL COMMENT '注册时间',
`user_birthday` date DEFAULT NULL COMMENT '用户生日',
`user_age` tinyint(4) DEFAULT NULL COMMENT '用户年龄',
`user_telephone_number` int(11) NOT NULL COMMENT '用户手机号',
`user_nickname` varchar(20) NOT NULL COMMENT '用户昵称',
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=3 DEFAULT CHARSET=utf8;
CREATE TABLE `zj_articles` (
`article_id` bigint(255) NOT NULL AUTO_INCREMENT COMMENT '博文ID',
`user_id` bigint(20) NOT NULL COMMENT '发表用户ID',
`article_title` text NOT NULL COMMENT '博文标题',
`article_content` longtext NOT NULL COMMENT '博文内容',
`article_views` bigint(20) NOT NULL COMMENT '浏览量',
`article_comment_count` bigint(20) NOT NULL COMMENT '评论总数',
`article_date` datetime DEFAULT NULL COMMENT '发表时间',
`article_like_count` bigint(20) NOT NULL,
PRIMARY KEY (`article_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `zj_articles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `zj_users` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `zj_comments` (
`comment_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`user_id` bigint(20) NOT NULL COMMENT '发表用户ID',
`article_id` bigint(20) NOT NULL COMMENT '评论博文ID',
`comment_like_count` bigint(20) NOT NULL COMMENT '点赞数',
`comment_date` datetime DEFAULT NULL COMMENT '评论日期',
`comment_content` text NOT NULL COMMENT '评论内容',
`parent_comment_id` bigint(20) NOT NULL COMMENT '父评论ID',
PRIMARY KEY (`comment_id`),
KEY `article_id` (`article_id`),
KEY `comment_date` (`comment_date`),
KEY `parent_comment_id` (`parent_comment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `zj_labels` (
`label_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '标签ID',
`label_name` varchar(20) NOT NULL COMMENT '标签名称',
`label_alias` varchar(15) NOT NULL COMMENT '标签别名',
`label_description` text NOT NULL COMMENT '标签描述',
PRIMARY KEY (`label_id`),
KEY `label_name` (`label_name`),
KEY `label_alias` (`label_alias`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `zj_set_artitle_label` (
`article_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '文章ID',
`label_id` bigint(20) NOT NULL,
PRIMARY KEY (`article_id`),
KEY `label_id` (`label_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `zj_set_artitle_sort` (
`article_id` bigint(20) NOT NULL COMMENT '文章ID',
`sort_id` bigint(20) NOT NULL COMMENT '分类ID',
PRIMARY KEY (`article_id`,`sort_id`),
KEY `sort_id` (`sort_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `zj_sorts` (
`sort_id` bigint(20) NOT NULL COMMENT '分类ID',
`sort_name` varchar(50) NOT NULL COMMENT '分类名称',
`sort_alias` varchar(15) NOT NULL COMMENT '分类别名',
`sort_description` text NOT NULL COMMENT '分类描述',
`parent_sort_id` bigint(20) NOT NULL COMMENT '父分类ID',
PRIMARY KEY (`sort_id`),
KEY `sort_name` (`sort_name`),
KEY `sort_alias` (`sort_alias`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `zj_user_friends` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '标识ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`user_friends_id` bigint(20) NOT NULL COMMENT '好友ID',
`user_note` varchar(20) NOT NULL COMMENT '好友备注',
`user_status` varchar(20) NOT NULL COMMENT '好友状态',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
4.2 建立视图(部分)
某用户的所有好友视图:
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
) ;
五、 小结&参考资料
小结
数据库的设计不是很简单,一个产品除了满足用户需求,数据库的架构是非常重要的,之前做的一个志愿网站,虽然功能不是很好,基本需求能满足,但是数据库完全没有设计,没有处理,导致数据处理很糟糕。
现在这个数据爆炸的网络时代,数据的处理及数据库的设计显得尤其重要,数据库设计师工作量也不亚于前后端工程师。