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

简介: 教程来源 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/

相关文章
|
16天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23521 12
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
1303 7
|
5天前
|
人工智能 BI 持续交付
Claude Code 深度适配 DeepSeek V4-Pro 实测:全场景通关与真实体验报告
在 AI 编程工具日趋主流的今天,Claude Code 凭借强大的任务执行、工具调用与工程化能力,成为开发者与自动化运维的核心效率工具。但随着原生模型账号稳定性问题频发,寻找一套兼容、稳定、能力在线的替代方案变得尤为重要。DeepSeek V4-Pro 作为新一代高性能大模型,提供了完整兼容 Claude 协议的 API 接口,只需简单配置即可无缝驱动 Claude Code,且在任务执行、工具调用、复杂流程处理上表现极为稳定。
1405 3
|
10天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
2556 4
|
3天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
975 0
|
20天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
6082 22
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
21天前
|
人工智能 JSON BI
DeepSeek V4 来了!超越 Claude Sonnet 4.5,赶紧对接 Claude Code 体验一把
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro 的真实体验与避坑记录 本文记录我将 Claude Code 对接 DeepSeek 最新模型(V4Pro)后的真实体验,测试了 Skills 自动化查询和积木报表 AI 建表两个场景——有惊喜,也踩
7345 18