MySQL学习----主键和外键以及索引

关系模型的概念
  关系数据库是建立在关系模型上,而关系模型的本质上是很多存储数据的二维表。关系数据库的表与表之间是“一对多”、“多对一”和“一对一”的关系,通过主键和外键来维护关系。
  记录:表的每一行,是一个逻辑意义上的数据。
  字段:表的每一列,同一个表的每一行记录都有相同的若干字段。字段定义了数据的类型,以及是否允许为Null,Null表示字段数据不存在,而不是为0或者空串。通常为简化查询条件,应避免字段允许为Null。

主键和联合主键
  关系表的任意两条记录不能重复,这是根据某个字段来区分的,这个字段称为主键。主键选取的基本原则是:不使用任何业务相关的的字段作为主键。因为如果需要修改主键的时候,会对业务数据产生巨大影响。主键也不应该允许Null。常作主键(ID字段)的类型有:

  • 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键。这类型能满足大部分应用的需求,如BIGINT NOT NULL AUTO_INCREMENT
  • 全局唯一GUID类型:使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
      可以设置两个或更多的主键,即联合主键。对于联合主键,允许有部分的重复,只要不是记录的联合主键组合是重复的就行。但是尽量不适用联合主键,因为会使得关系表更复杂。

外键
  外键可以把表中的数据与另一个表联系起来。通过定义外键约束来实现:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);

  第一行说明修改的表格是class,第二行指定外键约束的名称是fk_class_id(可随意定义),第三行指定当前表的class_id为外键,最后一行指定这个外键关联到classes表的id列
  定义外键约束可以当前表无法插入无效的数据,如上面classed的id列没有的数据,无法插入class的class_id里。但是,外键约束会降低数据库的性能,大部分互联网应用并不设置外键,只是依靠应用自身维护逻辑的正确。删除外键使用:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

  第一行指定当前操作的列表students,第二行表示删除外键fk_class_id,注意删除外键对数据没有影响,只是删掉了这个联系。

  关系数据库通过外键可以实现一对多、多对多和一对一的关系:

  • 多对多的情况实际上就是,通过一个中间表关联两个一对多的关系。
  • 一对一的情况有时候可以合并成一个表,但是有的时候不会合并,可能有两点原因:(举例收集的学生信息)
    1、学生的联系信息不完整,有的没有手机号,在一个表格里就会有Null存在。而放在另一个表格里,没有手机号的学生就没有记录。
    2、一般来说重要的核心信息是大家都明确有的一定要收集到的,比如名字和身份号。一些不核心的信息会根据情况表现不完整,且平常对这些信息的使用也不频繁,因此放在另一个表格中就避免每次访问数据库都要连带操作这些信息,以获得更高的性能。

索引
  索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。

ALTER TABLE students
ADD INDEX idx_name_score (name, score);

  给students表添加了名为idx_name_score的两个列name和score的索引,可以建立多列的索引,但是在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。
  索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

  唯一索引:根据业务要求以及数据唯一性可以建立该列数据的唯一索引。

ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);

  也可以只添加唯一约束:

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

  建立索引需要考虑很多因素,需要一定经验的积累,不合适的索引甚至会导致数据的检索速度变慢,因此索引的使用要在数据库的摸索使用中逐步优化,不用很心急哦~

在线SQL
  在浏览器页面运行的一个JavaScript编写的内存型SQL数据库AlaSQL。不必运行MySQL等实际的数据库软件,即可在线编写并执行SQL语句
  但是在使用在线SQL时会有很多限制,只能使用查找、更新、删除数据等常用简单操作,有条件还是用下载的mysql软件实践吧。


学习感悟:随着对数据库的深入理解,发现了其重要的两部分:一是语法,要记住常用命令;另外就是要理解数据库的数据存放结构。有点费脑筋哈,不懂要多查资料,多思考,一切以简便为主,要是对数据库方法的考虑是觉得麻烦了,那一般就是自己的思路和理解错误了,要多查资料解决。下一节要开始结合我们前面安装的mysql软件进行实践了,从查询数据库开始,加油~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值