数据库设计与数据库设计前的准备

 

数据库设计(database design):数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效的存储和管理要求,满足各种用户的需求,包括信息管理要求和数据操作要求.

信息管理要求:信息管理要求是指数据库中应该存储和管理哪些数据对象。

数据操作要求:数据操作要求是指对数据对象需要进行哪些操作,如:添加 删除 修改 统计 查询 等等

数据库设计的一般步骤:

 

  1. 需求分析
  2. 概念结构设计
  3. 逻辑结构设计
  4. 物理结构设计
  5. 数据库实施、运行和维护


现在简要的介绍一下这六个流程的大体作用:

需求分析:就是把各个用户的应用要求给综合起来 。

概念结构设计:把一些文字概念转为E——R图(常用) 。

逻辑结构设计:就是一般就是把E——R图转换成数据库产品支持的数据模型,如关系模型,形成逻辑模型,然后根据用户要求增加视图形成外模式。

物理结构设计:就是根据DBMS的特点和处理的需求,进行物理存储安排,建立索引,形成数据库的内模式。

数据库实施、运行和维护:就是数据库应用系统经过试运行后即可投入到正是运行,在数据库应用系统运行中不断地对其进行修改和维护完善。

 

下面会根据数据库的设计步骤分别说明设计一个数据库的大体流程是什么,然后最后会给出一个数据库设计的实例演示。

 

 

 

 

 

数据库设计---需求分析

1>需求分析的主要任务或者说主要的作用是:通过详细的调查现实世界要处理的对象,了解计算机系统的工作概况,明确用户的各种需求,然后在此基础上确定新系统的功能,

    还需要考虑到今后可能的对系统的扩充和改变.

2>在调查过程中重点是”数据”和”处理”.通过调查收集分析,以获得用户对数据库的要求.

  这些要求一般包涵   a.信息要求。用户需从数据库中获得信息的内容与性质。

                          b.处理要求。用户要完成一个什么样的处理功能,对处理的响应时间有什么要求,处理的方式是什么,一般包涵批处理和联机处理

                          c.安全性与完整性的要求

3>数据字典

            数据字典是系统中各类数据描述的集合,是进行详细的数据收集和数据分析所获得主要成果。在一个数据库设计中占有重要的地位。

      数据字典通常包括:数据项 数据结果、数据流、数据存储和处理过程。

数据项是最小的组成点位,多个数据项构成一个数据结构,数据字典对数据项和数据结构的定义来描述数据流、数据存储的逻辑内容。

(1)数据项:数据项是不可分割的数据单元。

(2)数据结构:数据结构它反映了个数据之间的组合形式,可有若干个数据项组成,也可由若干个数据结构组成,或者由若干个数据项、数据结构组成。

(3)数据流:数据流就是数据在结构在系统内传输的路径。

(4)数据存储:数据存储就是数据结构停留或者保存的地方,也是数据流的来源和去向之一。

(5)处理过程:具体的处理逻辑一般用判定数或判定表来描述。

数据字典是关于数据库中数据的描述元数据,而不是数据本身。

数据字典是在需求分析阶段建立的,在数据库设计过程中不断修改、充实和完善。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

数据库设计----概念结构设计

 

1>将需求分析得到的用户需求抽象为信息结构,这个信息结构就是概念设计。

概念设计的过程就是概念结构设计

它是整个数据库设计的关键。

 

2>概念设计的主要特点:

  >真实、充分的反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求(方式  响应时间),是对现实世界的一个真实模型。

  >易于理解

  >易于更改,能对其结构设计进行修改和扩充。

  >易于向所选数据模型转变(这里选着  关系)

 

3>概念结构设计向数据模型(关系)转变成E—R图

    在转变时的设计方法:自顶向下  自底向上  逐步扩展   混合策略

 

 

4>数据抽象:概念结构是对现实世界的一种抽象。

    数据抽象的分类或形式

                      >分类(classiffication):定义某一类概念作为现实世界中一组对象的类型,这些对象用某些共同的特征和行为。如学生有张三 李四等

                      >聚集(Aggregation):定义某一类的组成成分。它抽象了对象内部类型和成分之间“is part of”.如一个学生会有很多属性

                     >概括:它定义了类型之间的一种子集联系,它抽象了类型之间的“is subset of”的定义。如学生有本科生和研究生之分等

 

5>设计出E—R图:可以先选着一个局部的应用,作为设计E—R图的出发点;

                       逐步设计分E—R图,选着好局部E—R图之后,再要对每个局部进行E—R图设计;

                       合并分E—R图,形成初步的E—R图。在合并成一个E—R图时,可能会有属性的冲突、命名冲突、结构冲突。

                      消除不必要的沉余,形成基本的E—R图。沉余的数据是指可有基本数据导出的数据;沉余的联系是指可有其他联系导出的联系。

             再设计时,我们如何才能更好地区分实体和属性呢?>>>属性不能再有描述的信息,为不可分割的数据项,不能包含其他属性;属性页不能喝其他实体之间有联系。

 

 

 

 

 

数据库的规范化之三大范式

1

左边不符合第一范式

国家地址可拆分

 

 

 

 

 

 

 

 

 

 

 

2.

 

 

 

左边:设计到两个对象 一个订单一个产品

对应的每个列应该都有一个主键

第二范式:每个列应该都依赖于一个主键

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.

 

 

第三范式: 一个表中不能包含其他表中已经定义的非主键信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

绘制E-R图

ENTITY-RELATIONSHIP实体关系图

 

Powerdesigner

设计

 

箭头指向的是父表

含有外键的是子表

 

 

 

 

 

 

 

  1. 将实体转换为对应的表
  2. 将各属性转换为表中的对应列
  3. 表示每个列的主键列
  4. 在表之间建立主键列,体现实体之间的映射关系

 

 

 

列子:

一个学生只属于一个班级

一个班级可以有N个学生

一个学生可以修N个课程

 

学生

tb_students  class_id

 

班级

Tb_class

 

create table tb_class(

         id int primary key auto_increment,

         class_name varchar(10)

);

 

#一对多 用主外键关联

create table tb_student(

         id int PRIMARY KEY AUTO_INCRMENT,

  stu_name varchar(10),

         sex varchar(2),

  age int,

  class_id int,

  constraint tb_student_class_fk foreign key (class_id) references tb_class(id)

);

 

#多对多 学生与课程  用第三张表

#多对多关系不能用主外键关联

create table tb_course(

         id int primary key auto_increment,

  course_name varchar(10),

         xuefen int

);

 

 

 

 

#多对多关系,一般用中间表处理关联关系

 

create table tb_student_course(

         id int primary key AUTO_INCREMENT,

  student_id int,

  course_id int,

  gride int,

  constraint tb_student_fk FOREIGN key (student_id) REFERENCES tb_student(id),

  constraint tb_course_fk foreign key (course_id) references tb_course(id)

);

 

 

另一种方式

create table tb_student_course(

         id int primary key AUTO_INCREMENT,

  student_id int,

  course_id int,

  gride int,

  primary key(student_id,course_id) -- 主键 保持 唯一的关系

  constraint tb_student_fk FOREIGN key (student_id) REFERENCES tb_student(id),

  constraint tb_course_fk foreign key (course_id) references tb_course(id)

);

 

 

create table tb_student_course(

         id int primary key AUTO_INCREMENT,

  student_id int,

  course_id int,

  gride int,

  (student_id,course_id) -- 主键 保持 唯一的关系

  constraint tb_student_fk FOREIGN key (student_id) REFERENCES tb_student(id),

  constraint tb_course_fk foreign key (course_id) references tb_course(id)

);

 

 

create table tb_student_course(

         id int primary key AUTO_INCREMENT,

  student_id int,

  course_id int,

  gride int,

  UNIQUE(student_id,course_id) -- 主键 保持 唯一的关系

  constraint tb_student_fk FOREIGN key (student_id) REFERENCES tb_student(id),

  constraint tb_course_fk foreign key (course_id) references tb_course(id)

);

 

 

Visio 设计工具

数据库的设计的一些思想和方法

关于商品的品牌,分类,属性是如何来表示?

是用一个字段,还是另外设计一个表

品牌和商品是一种信息,还是两种信息?

一张表只保存一种信息

品牌和商品是否独立分开,或者二者的生命周期是否一致?

 

 

 

实体与实体的关系(表与表之间的关系)

一对一

一对多 或 多对一

多对多

 

所谓一对一,是指A表中的一条记录,在B表中与之对应的最多只有一条,

反之,B表中一条记录,在A表中与之对应最多也只有一条 1:1

 

所谓一对多,是指A表中的一条记录,在B表中与之对应的最多N条,

反之,B表中一条记录,在A表中与之对应只有一条  1:N 或 N:1

 

所谓多对多,是指A表中的一条记录,在B表中与之对应的最多N条,

反之,B表中一条记录,在A表中与之对应M条 N:M 或 M:N

 

 

 

 

                                         

 

 

 

CDM转PDM

 

 

 

 

 

 对与分类表,如何表示分类的层级关系

一种方式 使用path路径字段,用-分隔表示各个层级

另一种方式 是使用pid, 自己用自己

 

 

 

 

商品的属性如何保存?

商品和属性是两个独立的信息所以应该分开来存储,

设计一张表专门用来保存属性

 

商品和属性之间的关系

多对多

 

 

对于属性来说,记录太多,需要分类管理

 

 

 

 

 

 

订单的设计

订单和用户  谁下的订单

订单和商品有某种关联关系

一个订单,可以包含多种商品,

一个商品,可以有多个订单

再添加一张表表示关联关系

 

 

 

posted on 2016-02-24 21:21  Sharpest  阅读(936)  评论(0编辑  收藏  举报