1. 数据库三大范式是什么?1.1 第一范式:1NF
1.2第二范式:2NF
1.3第三范式:3NF

2. MySQL有哪些索引类型,分别有什么作用?3. 事务的特性和隔离级别

1. 数据库三大范式是什么?

数据库三大范式是设计关系型数据库时的规范化原则,确保数据库结构的合理性和减少数据冗余。
这三大范式分别是:
- **第一范式(1NF):** 
	数据表中的所有列都是不可分割的原子数据项,即每一列都不可再分。这消除了重复的列。
- **第二范式(2NF):** 数据表中的非主键列完全依赖于主键。
	这意味着每一行数据都能通过唯一的主键来识别,并且非主键列不能部分依赖于主键。
- **第三范式(3NF):** 数据表中的非主键列之间不存在传递依赖关系。
	换句话说,非主键列不能依赖于其他非主键列。

1.1 第一范式:1NF

--第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线
每列的值具有原子性,不可再分割。
每个字段的值都只能是单一值

### 解释
学籍信息可以继续分割,所以不符合1NF

mysql哪些情况事务失效 mysql事务有什么作用_2NF

1.2第二范式:2NF

--第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)
如果表是单主键,那么主键以外的列必须完全依赖于主键;
如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。

### 解释
学生id和课程id联合主键,非主键列【分数】完全依赖于主键【学生id和课程id】,学生id和课程id两个值才能决定score的值
但是【课程名字】只依赖于课程id,与学生id没有依赖关系,它不完全依赖于主键,只依赖于主键的一部分,不符合2NF

mysql哪些情况事务失效 mysql事务有什么作用_2NF_02

1.3第三范式:3NF

--第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式
第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;
也就是说:非主键列之间不能相关依赖,不存在传递依赖

### 解释
表中【部门名称】依赖于【部门id】,而【部门id】依赖于【id主键】,从而推出【部门名称】依赖于id(主键)
【部门名称】不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF

mysql哪些情况事务失效 mysql事务有什么作用_mysql哪些情况事务失效_03

2. MySQL有哪些索引类型,分别有什么作用?

-主键索引(聚簇索引)---》主键,表不建立主键,也会有个隐藏字段是主键,是主键索引,
	 mysql是基于主键索引构建的b+树,如果没有主键,如果按主键搜索,速度是最快的---》一定会有主键索引

    -辅助索引(普通索引,其他索引)-->咱们给某个自己加索引,django  index=True,通过该字段查询,
    会提高速度,如果字段 变化小(性别,年龄),不要建立普通索引
    	-CREATE INDEX index_id ON tb_student(id);
        
    	-前缀索引: 在创建索引时,使用列名后加括号,并在括号中指定要索引的前缀长度。
        """
        
            -- 创建带有前缀索引的表
            CREATE TABLE sample_table (
                id INT PRIMARY KEY,
                long_text_column VARCHAR(1000)
            );

            -- 创建前缀索引,索引长文本列的前 10 个字符
            CREATE INDEX prefix_index ON sample_table (long_text_column(10));

            -- 插入一些数据
            INSERT INTO sample_table (id, long_text_column) VALUES
            (1, 'This is a long text example'),
            (2, 'Another example with a long text');

            -- 查询使用前缀索引的列
            SELECT * FROM sample_table WHERE long_text_column LIKE 'This%';
    -唯一索引(unique)
    	-不是为了提高访问速度,而是为了避免数据出现重复
        -唯一索引通常使用 UNIQUE 关键字
    	-CREATE UNIQUE INDEX index_id ON tb_student(id);
    	"""
    	
    -组合索引(联合索引)
    	-django 中:class Meta:
            class Meta:
                indexes = [
                    models.Index(fields=['field1', 'field2'], name='composite_index'),
                ]
        -CREATE INDEX index_name
		ON table_name (column1, column2, column3);    			
    
    
    
    -全文索引-->基本不用---》
    	like %你%
        全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。
        在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
        全文索引允许在索引列中插入重复值和空值。
        不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。
        创建全文索引使用 FULLTEXT 关键字
        
        -倒排索引
    

	-hash
    -B+

3. 事务的特性和隔离级别

**事务的四个特性(ACID):**
	- **原子性(Atomicity):** 事务是一个不可分割的工作单位,要么全部执行,要么全部不执行。
	- **一致性(Consistency):** 
		事务执行后,数据库从一个一致的状态变到另一个一致的状态,保持数据库的完整性。
	- **隔离性(Isolation):** 
		多个事务并发执行时,每个事务都应该感觉不到其他事务的存在,它们之间是隔离的。
	- **持久性(Durability):** 事务一旦提交,对数据库的改变应该是永久性的。

**事务的隔离级别:**
	- **READ UNCOMMITTED(读取未提交):** 
		允许读取其他事务未提交的数据,可能导致脏读、不可重复读和幻读。
	- **READ COMMITTED(读取已提交):** 
		只能读取已经提交的数据,解决了脏读问题,但仍可能存在不可重复读和幻读。
	- **REPEATABLE READ(可重复读):** 
		保证了在同一事务中多次读取同一数据时,结果保持一致。解决了脏读和不可重复读问题,但仍可能存在幻读。
	- **SERIALIZABLE(可串行化):** 
		最高的隔离级别,通过强制事务串行执行来解决所有并发问题,包括脏读、不可重复读和幻读。

随着隔离级别的提高,事务的并发性能通常会降低,因为更高的隔离级别通常需要更多的锁和资源。
选择隔离级别时需要权衡一致性和性能的需求。
-- 创建银行账户表
CREATE TABLE bank_account (
    id INT PRIMARY KEY,
    account_name VARCHAR(50),
    balance INT
);

-- 插入一些初始数据
INSERT INTO bank_account (id, account_name, balance) VALUES
(1, 'Alice', 1000),
(2, 'Bob', 1000);

-- 查看初始数据
SELECT * FROM bank_account;

-- 开始一个事务
START TRANSACTION;

-- 转账操作
UPDATE bank_account SET balance = balance - 100 WHERE id = 1;
UPDATE bank_account SET balance = balance + 100 WHERE id = 2;

-- 查看转账后的数据(未提交)
SELECT * FROM bank_account;

-- 提交事务
COMMIT;

-- 查看最终数据
SELECT * FROM bank_account;