主键和外键有什么区别?
主键 :用于唯一标识一条数据,值不能为null、不允许有重复。一张表只能有一个主键列,如果建表没有设置主键,首先会选择非空唯一索引作为主键,如果没有合适的索引列会生成一个不可见的列作为主键。
外键 :外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。
为什么不推荐使用外键与级联?
外键与级联更新适用于单机低并发,不适合分布式、高并发集群。
级联更新是强阻塞,存在数据库更新风暴的风险。
外键影响数据库的插入速度。
对分库分表不友好, 因为分库分表下外键是无法生效。
外键与级联的优点?
保证了数据库数据的一致性和完整性。
什么是 ER 图?
E-R 图 也称实体-联系图(Entity Relationship Diagram)。
提供了表示实体类型、属性和联系的方法。
用来描述现实世界的概念模型。
是表示概念关系模型的一种方式。
什么是范式?
数据库设计范式是数据库设计的一系列原理和技术,也是数据库设计的规范,用于减少数据库中数据冗余,增进数据的一致性。
数据库三范式介绍?
无范式(非标准化形式):规定了数据必须要有主键,且没有重复的记录。
1NF(第一范式):在无范式的基础上,即也满足必须有主键,且没有重复的记录的基础上,还有满足字段的原子性。例子:加入date列里存放了两个日期,则不满足第一范式。
2NF(第二范式):在第一范式的基础上,没有部分函数依赖,及每条数据的值都依赖于这条数据的主键。
3NF(第三范式):在第二范式的基础上,没有传递函数依赖,及不存在一条数据B列的值依赖A列的值,C列的值依赖B列的值(A->B->C)
drop,delete与truncate的区别?
是否会删除表结构:
- drop:直接删除表数据和表结构。
- truncate:删除表中数据,其中表结构、约束、索引不变。新行标识所用的计数值重置为该列的种子值(主键会重置)。
- delete:可以配合where条件使用,不会重置主键值,可以删除视图和表。drop只能删除表。
是否记录回滚日志:
- delete每次只删除一行,且会记录undo.log回滚日志,也会触发触发器。
- truncate不会记录回滚日志,不会触发触发器,所以执行速度更快。
是否释放索引空间:
- delete操作不会减少索引空间,truncate会完全释放索引空间。
是否受事务控制:
- drop和 truncate 是DDL,操作立即生效。delete 是DML需要事务提交后才生效。
- 有外键约束的表,使用truncate是不受外键约束。
执行速度:
- 执行速度:drop -> truncate -> delete。
数据库中如何存储时间?
- 不要使用字符串存储时间,字符串占用的空间更大,存储的日期效率比较低(逐个字符进行比对),无法用日期相关的 API 进行计算和比较。
- Datetime 和 Timestamp 之间我们通常都会首选 Timestamp:
- DateTime 类型是时区无关。
- Timestamp 和时区有关。Timestamp 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,简单说就是在不同时区,查询到同一个条记录此字段的值会不一样。
- DateTime 类型耗费空间更大,DateTime需要8个字节,Timestamp 只需要使用 4 个字节,但是能表示更大的时间范围:
- DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- Timestamp: 1970-01-01 00:00:01 ~ 2037-12-31 23:59:59
- 数值型时间戳是更好的选择吗?
- int 或者 bigint 类型的数值存储方式具有 Timestamp 类型的所具有一些优点,并且使用它的进行日期排序以及对比等操作的效率会更高,跨系统也很方便,因为只是存放的数值。缺点是数据的可读性太差,无法直观的看到具体时间。