初级程序员必备的十大技能之数据库基础(二)

简介: 教程来源 http://wkmsa.cn/ 本节详解数据库表设计核心:精准选用数值(如DECIMAL防浮点误差)、字符串及日期类型;深入约束机制、主外键关联逻辑;掌握索引优化与三大范式(1NF–3NF)设计原则,并辨析范式与反范式的实际权衡。

三、表设计:好表是成功的一半

3.1 数据类型详解
数值类型
image.png

-- DECIMAL 示例:总位数10,小数点后2位
price DECIMAL(10,2)  -- 最大 99999999.99

为什么金额用 DECIMAL 不用 FLOAT?

-- FLOAT 的问题
SELECT 0.1 + 0.2;  -- 可能得到 0.30000000000000004

-- DECIMAL 精确计算
SELECT 0.1 + 0.2;  -- 0.3

字符串类型
image.png

-- CHAR vs VARCHAR
CHAR(10) -> 无论存"ab"还是"abcdefghij",都占10字节
VARCHAR(10) -> "ab"占2+1字节,"abcdefghij"占10+1字节

日期时间类型
image.png

-- 常用日期函数
SELECT NOW();                  -- 当前日期时间
SELECT CURDATE();              -- 当前日期
SELECT CURTIME();              -- 当前时间
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);  -- 7天后
SELECT DATEDIFF('2024-12-31', '2024-01-01'); -- 天数差
SELECT YEAR(created_at) FROM users;  -- 提取年份

3.2 约束(Constraints)
约束是数据库强制执行的规则,保证数据的完整性。

-- 1. NOT NULL:不能为空
email VARCHAR(100) NOT NULL

-- 2. UNIQUE:值唯一
username VARCHAR(50) UNIQUE

-- 3. PRIMARY KEY:主键(NOT NULL + UNIQUE + 索引)
id INT PRIMARY KEY

-- 4. FOREIGN KEY:外键(关联其他表)
user_id INT REFERENCES users(id)

-- 5. CHECK:检查条件
age INT CHECK (age >= 0 AND age <= 150)

-- 6. DEFAULT:默认值
status TINYINT DEFAULT 1

3.3 主键与外键

-- 创建带外键的表
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE    -- 用户删除时,同时删除订单
        ON UPDATE CASCADE    -- 用户ID更新时,自动更新
);

-- ON DELETE 选项
-- CASCADE:   删除用户时,删除关联订单
-- SET NULL:  删除用户时,订单的user_id设为NULL
-- RESTRICT:  如果有关联订单,禁止删除用户
-- NO ACTION: 同 RESTRICT

3.4 索引基础
索引是提高查询速度的核心手段。

-- 创建索引
CREATE INDEX idx_username ON users(username);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);

-- 创建复合索引
CREATE INDEX idx_age_status ON users(age, status);

-- 查看索引
SHOW INDEX FROM users;

-- 删除索引
DROP INDEX idx_username ON users;

-- 主键本身就是索引
-- 外键会自动创建索引

3.5 三大范式(Normalization)
范式是表设计的规范,目的是减少数据冗余、避免更新异常。

第一范式(1NF):列不可再分

-- ❌ 违反1NF(电话号码列包含多个值)
CREATE TABLE students (
    id INT,
    name VARCHAR(50),
    phone_numbers VARCHAR(200)  -- "13812345678,13987654321"
);

-- ✅ 符合1NF
CREATE TABLE students (
    id INT,
    name VARCHAR(50),
    phone VARCHAR(20)
);
-- 或者拆分成多行

第二范式(2NF):消除部分依赖

-- ❌ 违反2NF(订单详情表中,产品名称依赖产品ID,不是完全依赖订单ID)
CREATE TABLE order_details (
    order_id INT,
    product_id INT,
    product_name VARCHAR(100),  -- 部分依赖 product_id
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);

-- ✅ 符合2NF(拆分成两张表)
CREATE TABLE order_details (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)
);

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100)
);

第三范式(3NF):消除传递依赖

-- ❌ 违反3NF(省份名依赖省份ID,省份ID依赖用户ID)
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    province_id INT,
    province_name VARCHAR(20)  -- 传递依赖:id → province_id → province_name
);

-- ✅ 符合3NF
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    province_id INT,
    FOREIGN KEY (province_id) REFERENCES provinces(id)
);

CREATE TABLE provinces (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

3.6 范式 vs 反范式
image.png

-- 反范式设计示例:订单表冗余用户名
CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    username VARCHAR(50),  -- 冗余字段,避免 JOIN users 表
    amount DECIMAL(10,2)
);

来源:
http://aescc.cn/

相关文章
|
10天前
|
SQL 程序员 持续交付
程序员进阶工程师必备技能之代码质量与重构能力(四)
教程来源 https://ltglu.cn/ 本节系统介绍代码审查与质量保障实践,涵盖结构化审查清单、自动化检查(Ruff/MyPy/pytest)、CI质量门禁,以及从紧耦合遗留系统到领域驱动重构的完整实战案例,全面提升代码可读性、可维护性与安全性。
|
10天前
|
程序员 测试技术
程序员进阶工程师必备技能之代码质量与重构能力(一)
教程来源 https://zlpow.cn/ 代码是写给人看的,只是恰好能被机器执行。程序员70%时间在读代码,质量决定项目寿命:可读性让逻辑一目了然,可维护性降低修改成本,可测试性保障稳定,可扩展性应对需求变化。重构即偿还技术债务。
|
21天前
|
程序员 开发工具 git
初级程序员必备的十大技能之 Git 版本控制(三)
教程来源 http://qcycj.cn Git分支是并行开发的核心利器,本质为轻量指针,创建零成本。支持便捷的创建、切换、合并(快进/三方/冲突)、rebase变基及规范工作流,助力团队高效协作与清晰历史管理。
|
11天前
|
存储 缓存 Java
程序员必备的十大技能(进阶版)之底层计算机原理(二)
教程来源 http://bncne.cn/ 本文详解计算机内存层次结构与指令集原理:从寄存器到硬盘的存储金字塔,剖析缓存行、伪共享、内存一致性模型及屏障机制;涵盖x86-64汇编基础、C/Java代码映射、JNI内联汇编调用,助力高性能编程优化。
|
21天前
|
SQL 关系型数据库 程序员
初级程序员必备的十大技能之数据库基础(一)
教程来源 https://bncne.cn 本文系统讲解关系型数据库核心知识:从数据库原理、SQL四大语句(DDL/DML/DQL/DCL)到表设计、索引优化、事务机制与性能调优,涵盖WHERE/HAVING区别、多表JOIN、子查询、UNION等重点难点,配原理图解与实战代码,助你真正理解而非仅会写SQL。
|
21天前
|
SQL 程序员 数据库
初级程序员必备的十大技能之数据库基础(三)
教程来源 http://ltglu.cn/ 本文详解数据库索引优化与事务机制:索引类比书目录,B+树大幅降低IO;详解最左前缀、函数/类型转换等索引失效场景及EXPLAIN分析法;事务部分涵盖ACID、四大隔离级别(解决脏读/不可重复读/幻读)、行锁/乐观锁及秒杀防超卖实战。
|
21天前
|
SQL 运维 安全
初级程序员必备的十大技能之数据库基础(四)
教程来源 http://xgmoi.cn/ 本节聚焦MySQL性能优化与安全运维:通过慢查询日志定位瓶颈,结合SQL写法优化(如避免SELECT*、善用EXPLAIN)、索引与分区设计提升查询效率;同时涵盖权限管控、mysqldump备份恢复及自动化策略,兼顾性能与可靠性。
|
20天前
|
Linux 程序员 网络安全
初级程序员必备的十大技能之基础 Linux 命令(一)
教程来源 https://qcycj.cn/ 本文系统讲解程序员必备的Linux核心命令,涵盖文件操作、文本处理、权限管理、进程与网络工具等,结合原理、参数详解及实战案例,助你高效部署、排查与运维——无论用Windows还是macOS,Linux都是程序员不可或缺的“第二操作系统”。
|
8天前
|
JSON 程序员 数据库
初级程序员实战教程(六)
教程来源 https://wkmsa.cn/ 本系列实战项目涵盖通讯录系统(JSON文件版)、学生成绩管理系统(SQLite数据库版)及调试测试技术。项目结构清晰、代码简洁,含增删改查、模糊搜索、统计分析、CSV导出等功能,配套print/pdb/unittest/doctest等调试测试方法,适合Python初学者学习与扩展。
|
14天前
|
安全 Java 程序员
程序员必备的十大技能(进阶版)之网络与高并发原理(三)
教程来源 https://zlpow.cn/ Java并发编程深度剖析涵盖JMM内存模型、volatile内存屏障、synchronized锁升级优化、AQS源码机制、线程池调优及伪共享问题,系统揭示多线程安全与高性能底层原理。