表和表之间的关系,有可能
一对一
一对多(一个员工在一个部门里,一个部门有多个员工)
多对多(学员信息,学员报名多个课程,课程会有多个学员学习)
emp员工表,department 部门表
利用外键把一对多的关系表现出来了
主键是确保每个表里记录都是唯一的,主键和外键结合起来 就形成了一对多的关系
所以员工表里不能写个10,因为部门id没有10.只有1,2,3,4,叫外键约束
学员信息,课程信息,如果两边都写课程,就有可能学生在填信息的录入错误
所以可以这么设计,保证这两个表是多对多的关系
学员信息表,不写课程名字
这样的结果就是不会重复存放,极大的节约存储空间
带来的缺点就是,逻辑性比较复杂
因为你要查a同学报的课程名字是什么,就涉及到多表关联
数据的结构,数据的操作,数据的约束,统称三要素
完整性,一部分也可以依靠主键,唯一键uk,unique
但是在一张表中,主键只有一个,主键是唯一的,而外键可以有好几个
唯一键和主键还有点区别,就是允许为空
主键不允许为空
域的完整性,就是限制字段的完整性,比如字段的值范围
就是外键,两个表两个字段之间的关联
规划一个数据库
规范数据库就是尽量让你的数据库在保存的时候,不要存重复的数据,比较节约我们的磁盘空间
规范的模式叫范式,数据库里要让你的数据更加规范通过一些范式来实现,所谓范式就是一些规则,只要符合范式,那你的数据库存放数据就更加规范,而且数据库的冗余数据就更加少,而且这些范式是递归规范的
范式越高越严格,数据库冗余度越小,目前主流的有很多范式
如果规范的多,那就使用起来也就不怎么灵活,逻辑性就比较复杂
主流的范式,只要遵守三大范式就可以了
1NF
2NF
3NF
如果设计表,把考试成绩分列,就违反了第1范式,因为第1范式,不能有重复的列,
或者这个字段存里好几个值也是违反了第一范式
那么如何满足第一范式
一般第一范式必须要遵守,不然就不叫关系型数据库了
面试很少让你实际操作,面试只要自信,能说出来,会表达很重要
如果属性不完全依赖于主键,就违反了第二范式了,
假设有个字段存放员工姓名,性别,城市,城市区号
城市和城市区号并不完全依赖于姓名,就违反了第二范式
解决办法,城市的区号是依赖于城市的,就需要单独设计一张表
发现问题,姓名在一个比较大的公司的话是可能重复的,在上面设置主键是不好的
在各个市区的员工没有重名的,全放在一起就有重名的了,
就可以用复合主键,把姓名和城市拿出来作为一个主键
设置成复合主键,下图的表就违反了第三范式
设置成一个员工id,就违反了第三范式
城市名称和城市编号,产生了依赖关系,就违反了第三范式,解决放啊就是把城市另外建一张表,这样用编号代替文字就节省了很多空间
但是你这样就增加了查询难度,所以有时候就需要违反第三范式,不跨表查询,在逻辑上简单,速度上也变快了,有时候追求高性能就是违反范式的
带来查询上的困难,甚至影响性能
sql国际上用来管理数据库的标准语言
oracle首先用于商业
sql结构化查询语言只关注,我要得到的数据是什么,而不关心数据是怎么在磁盘上存放的,这一点大大减少了,数据库使用用户的难度
走网络,就是tcp/ip协议,就需要用到增加的独立端口号
ip加地址组合成了一个套接字,套接字里里面就用到了每个数据库用到的各自独立的端口号,mysql tcp的3306端口。
sqlserver1433 oracle1521,是标准端口,生产中可以根据企业的需求修改
客户端安装后,可以直接去操作数据库了,有字符界面,有图形界面
mysql主流是命令行
普通用户一般用应用程序方案,安装客户端也不会使用
就需要程序链接数据库,就需要开发接口
JDBC,java开发,ODBC微软,各种语言区编程序都需要按照编程接口
按开发接口去编写程序就可以 了
索引很关键,等于把数据库的数据建立一个目录,类似于书的目录,如果没有目录,需要从头开始翻,全表扫描
如果有目录就快很多
所以也是一个数据,只不过记录的是一个特定记录的数据,把它放在专门的空间中,按照一定次序排序,显而易见说的目录是按照章节的次序排序
利用书的目录可以提高速度,但是也有代价,表的索引也是占空间的,但是下载往往追求性能,因为现在硬盘便宜了,既然方便查询,那么会不会对表产生修改
如果你的数据库读的多,写的少,那么索引对于性能还是提升不少,(但是有些数据库就是读的少,写的多)
如果平凡的改,索引加不加就需要考虑了,因为会带来额外的一些负担
选择是挑选行
投影就是选择列(100列中选择显示几列)
连接,表和表之间的关联,外链RDBMS是关系型数据库在磁盘上保存数据,每个格式都不一样,mysql就和oracle都不一样,即使是mysql,不同的存储引擎存储在磁盘上的文件也不同,即使是同一种存储引擎,存放在磁盘上的也有可能不一样,比如拆开成多个文件和一个文件,这和你的配置有关,这就叫物理层
物理层对于运维来讲,需要关心,我们关心这些数据放在了哪里,比如我们要把不同类型的文件在磁盘上分门别类,而且需要考虑到哪些文件负载比较大,性能要求高,就可以把这个文件放在一个告诉硬盘上,来提高性能
数据库和数据库日志是分开放的,系统默认往往是放一块的
逻辑层,数据在存储的时候,是存储哪些类型的数据,和数据存在的关联。逻辑性的数据存储,主键外键之类的
用户看到的,是别人希望你看到的,比希望你看到的就看不到,比如买东西的买家,进货价格
XML扩展的标记语言,有些数据就是存放再xml里的,比如yum仓库的元数据
tomcat中间件配置文件格式就是xml
禁止用户列表。false,等于不禁止用户列表s’s
修改一项,登录默认登录,无须输入用户名密码
转成init5 图形界面,出现的这个列表就是用户列表
把这项变成true,就可以不让人看到用户列表,从而不知道你这台电脑又多少用户,提高安全性
切换一下,就不显示列表了
JSONE数据格式,也是很多人用来存放配置的一种格式,用起来更方便
阿里提出了去IOE,ibm,oracle,emc存储,商业公司的产品好是好就是太贵了
阿里的公司都不用oracle,学学mysql更有前途
2000几年,mysql还没开始流行起来,很多人公司就用sqlserver,java
大众点评是.net开发,也是后面迁移到的Linux
oracle被mysql收购以后,升级更新不是那么勤快了
所以centos7为什么默认现在就是用mariadb(marira是monty小女儿名字)而不是MySQL了
企业版,需要花钱的
普通社区版本,GPL约定开源的,公共许可证
bundle集成版,好多软件集成在里面,功能比较丰富
tar打包的就是源码,可以编译安装
都在支持mariadb