SQL基础笔记(1)- 约定

SQL 语言功能划分

SQL 语言按照功能划分成以下的 4 个部分

  1. DDL,Data Definition Language,也就是数据定义语言

定义数据库对象,包括数据库、数据表和列。
通过使用 DDL,可以创建,删除和修改数据库和表结构。(CUD)

2. DML,Data Manipulation Language,数据操作语言
操作和数据库相关的记录。
增加、删除、修改数据表中的记录。

3. DCL,Data Control Language,数据控制语言
定义访问权限和安全级别。
4. DQL,Data Query Language,数据查询语言
语言的重中之重。
用它查询想要的记录。

SQL 大小写约定

MySQL在默认情况下是否区分大小写,也和操作系统有关。
在Linux下,MySQL对表名和数据库名是区分大小写的。
在Windows下,MySQL默认情况是不区分大小写的
Oracle中,SQL语句是不区分大小写,如果查询中有字符,是区分大小写的

关于 SQL 大小写的问题,约定下面两点:

  1. 表名、表别名、字段名、字段别名等都小写;
  2. SQL 保留字、函数名、绑定变量等都大写。

UTF8字符集

在这里插入图片描述

  • 字符集是 utf8,排序规则是utf8_general_ci,代表对大小写不敏感,如果设置为utf8_bin,代表对大小写敏感
  • 数据表的存储规则默认采用 InnoDB

是否使用外键

具体看看以下的观点,是否符合你当前的项目场景。

  • 首先,外键本身是为了实现强一致性,所以如果需要正确性>性能的话,还是建议使用外键,它可以让我们在数据库的层面保证数据的完整性和一致性。

  • 当然不用外键,你也可以在业务层进行实现。不过,这样做也同样存在一定的风险,因为这样,就会让业务逻辑会与数据具备一定的耦合性。也就是业务逻辑和数据必须同时修改。而且在工作中,业务层可能会经常发生变化。

  • 当然,很多互联网的公司,尤其是超大型的数据应用场景,大量的插入,更新和删除在外键的约束下会降低性能,同时数据库在水平拆分和分库的情况下,数据库端也做不到执行外键约束。另外,在高并发的情况下,外键的存在也会造成额外的开销。因为每次更新数据,都需要检查另外一张表的数据,也容易造成死锁。
    所以在这种情况下,尤其是大型项目中后期,可以采用业务层来实现,取消外键提高效率。

  • 不过在SQL学习之初,包括在系统最初设计的时候,还是建议你采用规范的数据库设计,也就是采用外键来对数据表进行约束。因为这样可以建立一个强一致性,可靠性高的数据库结构,也不需要在业务层来实现过多的检查。

  • 当然在项目后期,业务量增大的情况下,你需要更多考虑到数据库性能问题,可以取消外键的约束,转移到业务层来实现。而且在大型互联网项目中,考虑到分库分表的情况,也会降低外键的使用。

  • 不过在SQL学习,以及项目早期,还是建议你使用外键。在项目后期,你可以分析有哪些外键造成了过多的性能消耗。一般遵循2/8原则,会有20%的外键造成80%的资源效率,你可以只把这20%的外键进行开放,采用业务层逻辑来进行实现,当然你需要保证业务层的实现没有错误。不同阶段,考虑的问题不同。当用户和业务量增大的时候,对于大型互联网应用,也会通过减少外键的使用,来减低死锁发生的概率,提高并发处理能力。

  • 《阿里巴巴 Java 开发手册》28页第6条。SQL语句中 【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻 塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

DDL思维图

在这里插入图片描述