常见的关系型数据库和非关系型数据库:
关系型数据库:
- MySQL
- PostgreSQL
- Oracle
- SQL Server
- SQLite
非关系型数据库(NoSQL):
- MongoDB(文档存储)
- Cassandra(列存储)
- Redis(键值存储)
- Neo4j(图形数据库)
- CouchDB(文档存储)
MySQL常见数据库引擎及比较:
- InnoDB:支持事务处理,具有提交、回滚和崩溃恢复能力,支持外键。
- MyISAM:性能较InnoDB好,但不支持事务处理,不支持外键。
- MEMORY:将所有数据存储在内存中,访问速度快,但数据在数据库服务器重启时会丢失。
- Archive:用于存储大量未修改的数据,数据被压缩存储,只支持INSERT和SELECT操作。
数据三大范式:
- 第一范式(1NF):要求数据库表的每一列都是不可分割的最小单元,即表的原子性。
- 第二范式(2NF):在1NF的基础上,要求表中没有部分依赖,即非主属性完全依赖于主键。
- 第三范式(3NF):在2NF的基础上,要求表中没有传递依赖,即非主属性直接依赖于主键,不依赖于其他非主属性。
什么是事务?MySQL如何支持事务?
事务是一系列操作,这些操作作为一个整体被执行,以确保数据库的完整性。事务具有以下四个重要的属性,通常被称为ACID属性:
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
- 一致性(Consistency):事务必须保证数据库从一个一致的状态转移到另一个一致的状态。
- 隔离性(Isolation):并发执行的事务之间不会互相影响。
- 持久性(Durability):一旦事务提交,它对数据库的改变就是永久性的,即使系统发生故障也不会丢失。
MySQL通过InnoDB
存储引擎支持事务处理。
数据库设计中一对多和多对多的应用场景:
- 一对多(One-to-Many):例如,一个部门可以有多个员工,但每个员工只属于一个部门。在数据库中,这通常通过在“多”的一方表中添加一个外键来实现,指向“一”的一方的主键。
- 多对多(Many-to-Many):例如,一个学生可以选修多门课程,同时一个课程也可以被多个学生选修。这种关系通常通过一个中间表(关联表)来实现,该表至少包含两个其他表的主键作为外键。
如何基于数据库实现商城商品计数器?
实现商城商品计数器通常涉及以下步骤:
- 在商品表中添加一个计数器字段,例如
quantity
,用于存储商品的库存数量。 - 当商品被购买时,执行一个事务,该事务会:
- 减少商品表中相应商品的
quantity
字段值。 - 增加订单表中的记录,记录购买的商品和数量。
- 减少商品表中相应商品的
- 如果
quantity
字段值减少到0或以下,则可以抛出异常或执行其他业务逻辑,如显示商品已售罄。 - 确保更新操作的原子性,以避免在高并发情况下出现库存数量不一致的问题。
示例SQL操作可能如下:
START TRANSACTION;
UPDATE products SET quantity = quantity - 1 WHERE id = product_id AND quantity > 0;
-- 检查是否更新成功
IF ROW_COUNT() = 0 THEN
-- 库存不足,回滚事务
ROLLBACK;
ELSE
-- 库存充足,记录订单
INSERT INTO orders (user_id, product_id, quantity) VALUES (user_id, product_id, 1);
COMMIT;
END IF;
上述伪代码演示了在购买商品时如何使用事务确保库存更新的原子性。实际实现时,需要根据具体的业务逻辑和数据库设计进行调整。
-
常见SQL(必备)
详见武沛齐博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
触发器、函数、视图、存储过程简述:
-
触发器(Trigger): 触发器是数据库的一种特殊类型的存储过程,它在满足特定数据库事件(如INSERT、UPDATE或DELETE)时自动执行。触发器通常用于维护数据的完整性和实施复杂的业务规则。
-
函数(Function): 数据库函数是一段可重用的代码,它接受输入参数,返回单一的结果值。在MySQL中,函数可以是确定性的或非确定性的,并且可以用于复杂的验证或计算。
-
视图(View): 视图是基于SQL查询的虚拟表。它像实际的表一样可以被查询,但其背后不存储数据,而是在查询视图时动态生成结果。视图可以简化复杂的查询,或用于限制用户访问特定数据。
-
存储过程(Stored Procedure): 存储过程是一组为了执行特定任务而预编译的SQL语句。存储过程可以接受输入参数,进行一系列数据库操作,并返回结果。它们可以用于封装复杂的业务逻辑。
MySQL索引种类:
-
主键索引(PRIMARY KEY): 唯一标识表中每一行的索引。
-
唯一索引(UNIQUE INDEX): 表中索引列的值必须唯一。
-
普通索引(INDEX): 普通的索引,没有主键和唯一索引的限制。
-
全文索引(FULLTEXT): 用于对文本内容进行全文搜索。
-
空间索引(SPATIAL): 用于地理空间数据类型,以优化空间查询。
索引遵循最左前缀规则的情况:
最左前缀规则是指在使用索引列进行查询时,索引查找将从最左边的列开始,然后依次向右查找。如果查询条件中包含了索引列的最左列,索引才会被使用。例如,如果有一个复合索引(col1
, col2
),那么以下查询将使用索引:
SELECT * FROM table WHERE col1 = 'value';
SELECT * FROM table WHERE col1 = 'value' AND col2 = 'another_value';
如果查询条件中没有包含col1
,则索引不会被使用。
主键和外键的区别:
-
主键(PRIMARY KEY):
- 唯一标识表中每一行的字段。
- 一个表只能有一个主键。
- 主键列的值必须唯一,且不能为NULL。
-
外键(FOREIGN KEY):
- 用于在两个表之间建立链接,并确保引用的数据的完整性。
- 一个表可以有多个外键。
- 外键值可以是NULL,或者必须匹配另一表的主键或唯一键的值。
MySQL常见的函数:
- 字符串函数:如
CONCAT()
,SUBSTRING()
,REPLACE()
等。 - 数值函数:如
ROUND()
,