文章目录
-
- 前言
- 关系数据库
-
- NoSQL出没,学习MySQL还有钱途吗?
- 数据模型
-
- 常用的数据模型
-
- 层次模型
-
- 优点
- 缺点
- 网状模型
-
- 优点:
- 缺点
- 关系模型
-
- 一些概念
- 数据模型建模
- 关系数据结构形式化定义
-
- 关系
- 关系操作
-
- 关系的基本操作
- 关系的完整性
-
- 实体完整性
- 参照完整性
- 用户自定义完整性
- 关系代数
-
- 并
- 差
- 交
- 敲黑板:连接
-
- 交叉联接(笛卡尔积)
- 内联接
-
- 自然联接
- 左外联接
- 右外联接
- 自联接
- UNIOn
-
- UNIOn的使用限制
- 示例
- 视图
- 长尾流量优化
前言
前面已经带大家入门了MySQL,还没看的可以先看一下那一篇:MySQL见闻录-入门之旅由作者倾心打造,你值得拥有。
入门之后嘛,我带队正在做一个小项目,1.0版本需要涉及一个数据库,但是我发现我居然设计不出来,我发现,快速入门始终是基础不牢,还是得回炉重造。
本文略长,先收后看,不然划着划着就丢嘛了。
最后,再提一句:本系列属于关系型数据库-MySQL的文章,系列中所有“数据库”字眼默认为MySQL数据库,如果想看非关系型(nosql)的文,我也有几篇redis,最近老师也在教,过段时间会陆陆续续出redis、HBase、MongoDB等方面的文。
关系数据库
NoSQL出没,学习MySQL还有钱途吗?
首先,我们看一下大佬的介绍:
1、 MySQL数据库最为流行的开源数据库
2、 全球前20大互联网网站有18家使用了MySQL。
3、 前10大独立软件开发商,有8家采用了MySQL数据库
4、 在云的平台架构下,市场占有率第一的云数据库。
5、 大数据平台下,80%与大数据平台所集成,因为MySQL是互联网应用,互联网负责产生内容,Hadoop负责内容消费,形成开源的趋势,OLTP在线事务使用MySQL数据库,OLAP离线分析,使用Hadoop发展趋势。
再来几张招聘需求,一图胜千言:
所以,我的建议是你先想清楚自己的岗位需不需要这个东西,或者自己以后需不需要这个东西。
当然,如果你是想博百家之长而自成一派,那MySQL会有很多不错的思想给到你启发。
数据模型
这一块是我这一部分重点要写的,不为什么,因为我不会。
做项目之前需要进行项目立项,需求分析,而数据库的设计亦是如此,我苦恼于难以设计出一套适用于我们这个项目的数据库模型,我知道我菜,后面我会把我的问题提出来,大家可以帮我一起想想。(虽然我已经有了想法,老师教我的)
数据模型是一种对现实世界数据特征的抽象,是数据库系统的核心和基础。
数据模型应满足三方面的要求:
1.比较真实的模拟现实世界
2.容易为人所理解
3.便于在计算机上实现
概念模型:是从普通用户的视角来描述数据的,使用简单的符号来描述信息,没有严格的规定,只要能清晰反映现实世界的信息就行。常用的就是E-R图。
常用的数据模型
数据库领域中主要的逻辑数据模型有:
层次模型
网状模型
关系模型
面向对象数据模型
对象关系数据模型
半结构化数据模型
数据结构、数据操作和数据完整性约束这三个方面的内容完整的描述了一个数据模型。
层次模型
将数据组织成一对多关系的结构,用树形结构表示实体及实体间的联系。
来个例子啊:
那其中一条数据是长什么样呢?
优点
层次模型的数据结构比较简单清晰
查询效率高,性能优于关系模型,不低于网状模型
层次数据模型提供了良好的完整性支持
缺点
结点之间的多对多联系表示不自然
对插入和删除操作的限制多,应用程序的编写比较复杂
查询子女结点必须通过双亲结点
层次命令趋于程序化
可见,用层次模型对具有一对多的层序联系的部门描述非常自然、直观、容易理解。
网状模型
然而事事尽如人意?显然不会的,在现实世中事物之间的联系更多的是非层次关系的。
定义:用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
差不多,我们的项目就是这么个一团乱麻。。。
优点:
网状数据模型可以很方便的表示现实世界中的很多复杂的关系;
缺点
抽象啊,实在是抽象啊,你别看这图话这容易,你改成表试试。会抓狂的!!
关系模型
关系模型是最重要的一种数据模型。
关系模型与前面的模型不同,它是建立在严格的数学概念基础上的。严格的定义会在后面的部分给出,这里先讲一些基本概念。
关系模型的数据结构是一个“二维表框架”组成的集合。每个二维表又可称为关系。在关系模型中,操作的对象和结果都是二维表。关系模型是目前最流行的数据库模型。支持关系模型的数据库管理系统称为关系数据库管理系统。
一些概念
关系(Relation):一个关系对应通常说的一张表
元组(Tuple):表中的一行即为一个元组
属性(Attribute):表中的一列即为一个属性,给每一个属性起一个名称即属性名
主码(Key):也称码键。表中的某个属性组,它可以唯一确定一个元组
域(Domain):是一组具有相同数据类型的值的集合。属性的取值范围来自某个域。
分量:元组中的一个属性值。
关系模式:对关系的描述,关系名(属性1,属性2,…,属性n),如:学生(学号,姓名,年龄,性别,系名,年级)
数据模型建模
建模过程嘛,肯定是要由简到难,再由难到简。对我们来说,最简单的莫过于层次模型和网状模型了,关系模型没那么简单。
但是对计算机来说,恰恰就反过来了,而且它那个死脑子,怕是看不懂层次模型和网状模型。
我的建模步骤是:先将抽象的现实问题转化为网状模型(如果能直接写层次模型,那干嘛不直接写关系模型),然后再从网状模型分离出数个层次模型(属性可重用),最后再根据层次模型和约束条件建造关系模型库。
我们是准备做一个自动排课系统,目前分析出的冲突有三:
同一教师,同一时间,不同教室
同一教室,同一时间,不同教师
同一班级,同一时间,不同教室
各位可集思广益啊
关系数据结构形式化定义
关系
什么是关系?在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。
关系可以有三种类型:
基本关系(通常又称基本表或基表)
查询表
视图表
基本表是实际存在的表,它是实际存储数据的逻辑表示
查询表是查询结果对应的表
视图表是由基本表或其他视图表导出的表,是虚表
关系的描述称为关系模式
关系操作
关系的基本操作
想了想,此处应该用思维导图
别急啊,后面会专门挑几个重要的关系演算来示例
关系的完整性
关系模型的完整性规则是对关系的某种约束条件。
关系模型中有三种完整性约束:
实体完整性
参照完整性
用户自定义完整性
实体完整性
关系数据库中每个元组应该是可区分的,是唯一的。
实体完整性规则:若属性A是基本关系B的主属性,那么A不能取空值。
若主键由若干属性组成,则所有这些主属性都不能取空值。
参照完整性
如果说实体完整性约束了主键,那么自然而然可猜想参照完整性是约束了外键,没错啊。
用户自定义完整性
怎么说呢,始终还是跳不出上一篇的画地为牢啊,毕竟上一篇几乎把我的基础知识面锁死了:MySQL见闻录 – 入门之旅
关系代数
太好了,终于找到上面漏写的了。
下图分别是具有三个属性列的关系 R、S :
并
关系 R 与关系 S 的并由属于 R 且属于 S 的元组组成。其结果关系仍为 n 目关系。记作:
差
关系R与关系S的差由属于R而不属于S的所有元组组成。其结果关系仍为n目关系。记作:
交
关系R与关系S的交由既属于R又属于S的元组组成。其结果关系仍为n目关系。记作:
敲黑板:连接
我记得我写过连接,不过我有删博客的好习惯,所以就没找着了。
交叉联接(笛卡尔积)
假设你有一个存储男孩姓名的表以及一个记录男孩们都有哪些玩具的表,现在我们要试着找出每个男孩拥有的玩具。
SELECt t.toy,b.boy
From toys t
CROSS JOIN
boys AS b
;
CROSS JOIN返回两张表的每一行相乘的结果。
内联接
INNER JOIN利用条件判断中的比较运算符结合两张表的记录。只有联接记录符合记录条件时才会返回列。
SELECt somecolumns
FROM table1
INNER JOIN
table2
ON somecondition; --条件式里课采用任何一个比较运算符,也可以改用WHERe
示例:
SELECt mc.last_name,mc.first_name,p.profession
FROM my_contacts AS mc
INNER JOIN
profession AS p
ON mc.prof_id = p.prof_id;
自然联接
属于内联接的一种。
自然联接只有在联接的列在两张表中的名称相同时才会用。
SELECt boys.boy,toys.toy
FROM boys
NATURAL JOIN
toys;
左外联接
LEFT OUTER JOIN 会匹配左表中的每一行及右表中符合条件的行。
当左表与右表具有一对多关系时,左外联接特别有用。
理解外联接的最大秘密在于知道表在左边还是右边,在LEFT OUTER JOIN中,出现在FROM后,联接前的表称为左表,而出现在联接后的表称为右表。
SELECt g.girl,t.toy
FROM girls g --g是左表
LEFT OUTER JOIN toys t --t是右表
ON g.toy_id = t.toy_id;
内外联接有什么差别?外联接一定会提供数据行,无论该行能否在另一个表中找出相匹配的行。
左外联接的结果为NULL表示右表没有找到与左表相符的记录。
具体流程概览(图有点小瑕疵):
右外联接
有外联接与左外联接一样,除了它是用右表与左表比对。
自联接
同一个表可以同时作为外联接的左右表。虽然听起来很奇怪,不过却很好用。
来一题看看;
SELECt c1.name,c2.name AS boss
FROM clown_info1 c1
INNER JOIN clown_info2 c2
ON c1.bossid = c2.id
;
自联接能够把一张表当成两张完全相同的表来进行查询。
UNIOn
还有一种取得多张表的查询结果的方式:UNIOn联合。
UNIOn根据我们在SELECt中指定的列,把两张表或更多张表的查询结果合并至一个表中。
SELECT title FROM job_current
UNIOn
SELECt title FROM job_desired
UNIOn
SELECt title FROM job_listings;
UNIOn的使用限制
示例
SELECt title FROM job_current
UNIOn
SELECt title FROM job_desired
UNIOn
SELECt title FROM job_listings
ORDER BY title;
结果集:
SELECt title FROM job_current
UNIOn ALL
SELECt title FROM job_desired
UNIOn ALL
SELECt title FROM job_listings
ORDER BY title;
结果集:
联合规则说:选取的列必须可以互相转换。
我就知道我有写,只不过那篇的目录过于吓人,大家不喜欢罢了。
视图
视图是从一个或多个基表(或视图)中导出的表,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍然放在原来的基本表中,所以一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。
视图一经定义,就可以和基本表一样被增删查改,不过对视图的(增删改)有一定的限制。
关于视图我只想说一点:它没有主键约束!!!
长尾流量优化
写到这里有点累了,这篇战线拉的过长,导致后面就比较快。
这里用几篇来补上漏洞:
MySQL见闻录 - 入门之旅
《深入浅出MySQL》问答录
MySQL题集
最后,希望大家点个关注哦