优秀的数据库设计为用户和各种APP系统提供了信息基础设施和高效的运行环境,满足各种用户的需要,对APP应用的信息管理和数据操作有重要影响。 作为整个项目构建中最复杂的过程,设计良好的数据库结构并不容易。
在小规模的项目中,业务需求更容易理解。 因此,数据库设计者可以直接赋予所构建的关系、关系的属性及其上的约束。 对于复杂的大型APP,业务逻辑往往是分层嵌套的,通常没有一个人能够了解APP应用的所有数据要求,并直接提供最终的数据库设计。 这样,掌握数据库设计的方法对项目构建是非常必要的。 这次葡萄城公开课特别邀请了《精通SQL Server》的作者——yedhb先生,就数据库设计的入门概念、实体关系设计、SQL语句等基础知识进行说明,并结合实际案例,成为数据库设计之神。
一、数据库设计的特点基本概念
数据库是指根据数据结构组织、存储和管理数据的仓库。
数据库的基本结构
数据库按照数据模型、存储和访问方法以及用途进行分类。
按数据模型:
层次模型网格结构模型关系结构模型按照存储方法和访问方法进行分类。
关系桌面类型: SQLite,ms访问网络类型: Oracle,MySQL,MS SQL Server非关系键值数据库:亚马逊动态列数据库: Hbase文档数据库
OLTP数据库非常重视事务的完整性。 ACIDOLAP数据库的数据仓库基本上是只读的。 无论是什么类型的数据库结构,在设计数据库时都遵循三级技术、七级管理、十二级基础数据的基本规律。 这里,管理是指数据库设计的项目管理和企业(即应用部门)的业务管理; 基础数据是指对数据的收集、检入和更新采取的操作。
对于典型数据库,设计过程包括以下阶段:
完全描绘未来数据库用户的数据需求,选择数据模型,使用所选数据模型的概念将需求转换为数据库的概念模型,并将抽象数据模型转换为数据库实现。 逻辑设计:使用高级概念模型的数据库系统的实现映射到数据库模型的物理设计。 指出数据库的物理特征,包括文件的组织形式和索引结构。 然后,以关系数据库为例,说明数据库的实体关系设计和SQL语句的执行。 在本课程中,我们将很少介绍如何描绘用户的数据需求和物理设计。 由于数据需求来源于需求分析,这在软件工程中是一个很大的过程; 物理设计与所选的DBMS有很大关系。
二、关系型数据库中的基本概念
表(Table ) )表是数据的有序排列,强调该数据必须沿行和列排成长方形。行(行=记录)记录) ) )。
列(Column )=字段或属性
主键(主键,简称PK ) )选定的候选关键字,用于唯一标识表行。 一个表只有一个主关键字。 主键也称为主键。 主键由一个字段或多个字段组成,分别是单字段主键或多字段主键。 主键是为了保证实体的完整性而存在的。
外键(FK ) Foreign Key :外键是指另一表中一列或多列的数据,所引用的列必须具有主键约束或唯一约束。 外键用于建立和加强两个表数据之间的连接以保证参照完整性/参照完整性。
三、实体关系模型
实体关系模型(Entity-relationship model,简称ER模型) )由美籍华裔计算机科学家tmdnp发明,是概念数据模型高层描述中使用的数据模型或示意图。 ER模型是信息系统设计中常用的概念结构设计阶段,用于描述数据库中存储的信息和/或信息类型。在基于数据库的信息系统设计中,在逻辑设计阶段,概念模型被映射到逻辑模型,如关系模型。 在物理设计中映射到物理模型。
在实体关系中有一个非常普遍的错误概念,认为关系是指表之间的关系。 其实,关系和表这个术语差不多是同义词。
/p>实体关系可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体,如:
1、一对一:一个yydyl只属于一个班级,一个班级也只能有一个yydyl
应用场景:适用于属性过多的实体,但不希望单个表有过多字段,如人员基本信息、人员档案信息不够全面,特殊条件如班级中途更换yydyl等无法满足2、一对多:一个顾客对应多个订单,而一个订单只能对应一个客户
3、多对多:一个学生有多个课程的成绩,一个课程也有多个学生来上
四、业务系统数据库表设计步骤
实现从编码数据表(Master Table)到业务数据表(Transaction Table)的转变。
1、编码数据表(Master Table)
数据库设计之初设计目的是捕捉系统中的实体对象设计Master表就是描述系统中的实体。如:用户、会计科目、客户等2、业务数据表(Transaction Table)
一笔业务(或称一笔交易)是指Master表中的实体在系统中的一个活动这些活动会被捕捉(记录)到业务数据表中一般地,业务数据表都有指向(引用)Master表的外键五、典型数据库表设计
了解了数据库的基本概念,我们来看几张典型的数据库表。
成绩单:
1、Master表
年级:年级编码、名称班级:班级编码、名称、年级编码学生:学号、姓名、性别考试科目:编码、名称达线情况:不需要考试:不易识别的实体编码、考试名、日期2、Transaction表:成绩表
考试编码、学号、科目编码、分数不要【语文】【数学】字段不要【总分】字段销售订单:
1、Master表
客户,用户(制单人),业务员不易识别:部门商品2、Transaction表
订单头表
订单编号(主键) 、日期客户ID,制单人(用户),业务员ID不易识别:订单状态(订购,发货,完成)不宜判断:合计金额订单行表
订单编号、行号(多字段组合主键)商品ID,数量,单价金额:不要工资表:
1、Master表
员工,部门数据类型,工资项目工资表模板,工资表模板项目2、Transaction表
工资表
工资表ID(主键) 、年月模板ID状态(已发放=不能修改)工资表数据
记录ID(主键)工资表ID,员工ID,工资项目ID(唯一索引)年月(可选)工资项目数据数值工资项目数据文本工资项目数据日期六、范式标准
范式(Normal Form,缩写为NF),数据库设计一般分为六种范式类型,越高的范式代表数据库冗余越小,且高级范式包含了低级范式的要求。
数据库设计之所以要遵循范式,是为了确保数据库简洁、结构明晰,且不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之,不遵循范式要求的数据库设计,不仅会给编程人员制造麻烦,还可能存储大量不需要的冗余信息。
在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
一般来说,数据库只需满足第三范式(3NF)就行了。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。
举例,对一张存放商品的基本表来说。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。
七、SQL语句相关知识
结构化查询语言(Structured Query Language,简称SQL)是一种用于数据库查询和程序设计的编程语言,可以存取数据以及管理关系数据库系统。
SQL语句分类:
1、数据定义语言
DDL(Data Definition Language)用于操作对象和对象的属性,这种对象包括数据库本身,以及数据库对象,如:表、视图等等DDL对这些对象和属性的管理和定义具体表现在Create、Drop和Alter上。2、数据操控语言
DML(Data Manipulation Language)用于操作数据库对象中包含的数据,也就是说操作的单位是记录。增删改查=CRUD:增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)C=Insert, R=Select, U=Update, D=Delete3、数据控制语言
DCL(Data Control Language)用于控制数据库对象的权限,这些操作使数据更加的安全。Grant:给某用户或某组或所有用户授予某些特定的权限。Revoke:废除某用户或某组或所有用户的特定权限SQL语句元素(CRUD):
1、INSERT(添加新记录)
添加单条记录:Insert into tablename(column1,column2…) Values(1,'string’…)批量添加记录:Insert into tablename(column1,column2…) Select…2、Select(获取数据行)
Top n (指定最多返回多少行记录)WITH TIES(指定是否将末尾并列排序的额外记录也一并返回)INTO(创建一个新表,并把查询结果的记录插入表中)FROM(指定从哪里查询数据)3、JOIN
WHEREBETWEENLIKEIN4、聚合函数
AVG=取平均值MAX=取最大值MIN=取最小值COUNT=取记录条数SUM=取合计值表之外的数据库对象:
视图:保存下来以便反复使用的SELECT查询存储过程:保存下来以便反复使用的CRUD查询触发器:一种特殊的存储过程,对表进行增删改时自动执行自定义函数:函数类似存储过程,但是必须有返回值,且可直接用于FROM子句八、提高数据库运行效率的办法
在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。以上就是本期公开课《数据库设计入门》的精选内容,欢迎访问葡萄城官网免费预约在线课程学习,ngdss会亲自为你扫平一切数据库设计过程中的“坑”。