数据库设计(一)

数据库设计

varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。

nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。

如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar

https://blog.csdn.net/honglei_zh/article/details/7172538


数据库设计范式:

https://www.cnblogs.com/knowledgesea/p/3667395.html

第一范式:列不可再分,确保每列的原子性.

如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.
例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等

第二范式:所有非主属性依赖于主属性,不可以把多种数据保存在同一张数据库表中。目标是确保表中的每列都和主键相关

如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式.
例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的
关系,即"产品编号"列不依赖于主键列,应删除该列

第三范式:属性不能依赖与非主属性  [===>等价于==>属性直接依赖于主键],目标是确保每列都和主键列直接相关,而不是间接相关

如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键列,则满足第三范式.
为了理解第三范式,需要根据Armstrong公里之一定义传递依赖。假设A、B和C是关系R的三个属性,如果A­〉B
且B­〉C,则从这些函数依赖中,可以得出A­〉C,如上所述,依赖A­〉C是传递依赖。
        例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和
主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客编号"相关,"顾客编号"和"订单编号"又相关,最后经过传
递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。


where 在分组之前对行进行筛选,having 在分组之后,对表进行过滤

sql  的顺序 : select, from, where,  group by, having, order by

sql优化:

  1. 少用*号
  2. 避免子查询,耗费CPU资源
  3. 避免耗费资源的操作:[distinct放在所有列的最前面,对所有列进行过滤][union ,union all(允许重复的值),order by,minus(去除),intersect(两个表的交集)]
  4. 数据记录少的表放在右边
  5. or比较多的运算,建议分成多个查询,使用union all进行连接
  6. 合理使用索引(简单 复合 唯一)

EXPLAIN select * from stu;

索引列(key_len)的值计算:(不损失精度的情况下,越短越好,效率高)

varchar(n)+允许null = n*3[utf8=3,gbk=2,lain=1]+2+1(如果允许null的话)

索引多列的话

1.尽量全值匹配

  遵循左前缀法则,只要含有做前缀的都会用到

2.索引列上面做了函数的操作,不会做索引,比如+-拼接,类型转换(比如int自动转为string),left()

3.范围所在条件之后,索引失效

4.覆盖索引尽量使用(查询列和索引列一样)

5.使用not null null 查不出来索引

6.%开头的索引列都会失效

7.exists 替换 in(轮询前面一张表,in适合外大内小,exists适合外小内大,in会把查询的所有的字段缓存下来,不走索引,exists只会检测行是否存在,返回的是空非空的布尔值) ... or改为union all ,union,  union合并结果集


1.简述数据库的5大约束:

1.NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值.
2.CHECK (检查)--检查在约束中指定的条件是否得到了满足.
3.UNIQUE (唯一)--保证在指定的列中没有重复值.在该表中每一个值或者每一组值都将是唯一的.(可以有多个,可以为null)
4.PRIMARY KEY (主键)--用来唯一的标识出表的每一行,并且防止出现NULL值,一个表只能有一个主键约束.(不能为null)
5.POREIGN KEY (外部键)--通过使用公共列在表之间建立一种父子(parent-child)关系,在表上定义的外部键可以指向主键或者其他表的唯一键.

2.简述数据库事物的4大特性:

1 、原子性 
事务是数据库的逻辑工作单位,不可分割,事务中包含的各操作要么都做,要么都不做 
2 、一致性 
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。 
3 、隔离性 
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 事务的隔离级别有4级,可以查看这篇博客,关于MySQL的事务处理及隔离级别 
4 、持续性 
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,不能回滚。接下来的其它操作或故障不应该对其执行结果有任何影响。

※ MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持!

ORACLE默认的是 READ COMMITTED。(不允许脏读)

MYSQL默认的是 REPEATABLE READ。(允许幻读)

READ UNCOMMITTED:幻读,不可重复读和脏读均允许;

READ COMMITTED:允许幻读和不可重复读,但不允许脏读;

REPEATABLE READ:允许幻读,但不允许不可重复读和脏读;

SERIALIZABLE:幻读,不可重复读和脏读都不允许; 

标准SQL语句分类:

Data Definition Language(DDL) 
DDL使我们有能力创建或删除表格。也可以定义索引(键),规定表之间的链接,以及施加表间的约束。 
CREATE DATABASE - 创建新数据库 
ALTER DATABASE - 修改数据库 
CREATE TABLE - 创建新表 
ALTER TABLE - 变更(改变)数据库表 
DROP TABLE - 删除表 
CREATE INDEX - 创建索引(搜索键) 
DROP INDEX - 删除索引

Data Manipulation Language(DML) 
供用户实现对数据的追加、删除、更新、查询等操作。 
SELECT - 从数据库表中获取数据 
UPDATE - 更新数据库表中的数据 
DELETE - 从数据库表中删除数据 
INSERT INTO - 向数据库表中插入数据

Data Control Language(DCL) 
GRANT - 授权 
REVOKE - 撤销授权 
DENY - 拒绝授权

Transaction Control Language(TCL) 
SAVEPOINT - 设置保存点 
ROLLBACK - 回滚 
COMMIT - 提交


数据库脚本: 一般来说就是sql语句、命令的组合,属于未命名的,每次执行前需要编译。
存储过程: 是命名的sql脚本,经过预编译;执行时不需要再次编译。

数据完整性分为以下四类:
1) 实体完整性:规定表的每一行在表中是惟一的实体。
2) 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
3) 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4) 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。

decode()函数https://blog.csdn.net/weeknd/article/details/71157044

更多可见(转发):https://blog.csdn.net/boonya/article/details/60962774

猜你喜欢

转载自blog.csdn.net/weixin_39134861/article/details/81627387