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

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

相关文章
|
18天前
|
前端开发 JavaScript 数据可视化
前端组件库 ——Three.js 知识点大全(一)
教程来源 https://www.vhjpe.cn/ Three.js 是基于 WebGL 的主流 JavaScript 3D 库,封装底层图形接口,让开发者用简洁代码快速构建网页级 3D 场景。涵盖场景、相机、渲染器三大核心,支持几何体、材质、光照、动画等完整管线,广泛应用于数据可视化、虚拟展厅与智慧园区等领域。
|
24天前
|
存储 设计模式 缓存
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
LLM Agent需持久化记忆以支撑连续对话、用户画像、知识沉淀与崩溃恢复。但满上下文方案成本高、延迟大、易出错。本文提出五阶段流水线(抽取→整合→存储→检索→遗忘)与四种记忆类型(工作/情景/语义/过程记忆),结合结构化状态+向量搜索等设计模式,实现高效、可控、可审计的生产级记忆系统。
468 9
为生产级 AI Agent 构建持久化记忆:五阶段流水线与四种设计模式
|
5天前
|
JSON 前端开发 测试技术
Kimi-k2.6 流式回包乱序后,我这样接入 ​D​М‌X​Α‌РΙ
kimi-k2.6 不止于聊天,其核心价值在于“可执行交付”:统一支持代码生成、长时程任务、Agent协作、文档→技能复用及多格式输出,具备工程级组合能力。它契合企业对“单模型多工位”的刚需——在研发、内容中台等场景中,稳定闭环完成需求拆解、编码、文档整理等多步任务。真正落地需依托DMXAPI网关实现标准化API集成,解决Web路径的不确定性,让模型能力成为可度量、可审计、可持续的生产基础执行层。(239字)
|
1天前
|
程序员 开发工具 git
初级程序员必备的十大技能之 Git 版本控制(三)
教程来源 http://qcycj.cn Git分支是并行开发的核心利器,本质为轻量指针,创建零成本。支持便捷的创建、切换、合并(快进/三方/冲突)、rebase变基及规范工作流,助力团队高效协作与清晰历史管理。
|
7天前
|
人工智能 自然语言处理 API
阿里云百炼Token Plan团队版产品与收费标准介绍:标准版198元、高级版698元,尊享版1398元
阿里云百炼Token Plan团队版是面向企业和开发者的多模态AI大模型订阅服务,以Credits为统一计量单位,支持文本生成与图像生成模型灵活切换,兼容主流AI编程与智能体工具。提供标准、高级、尊享三档包月套餐,多租户隔离确保高峰不排队,并承诺不使用对话数据训练模型,保障数据安全。超出套餐额度可购买共享用量包,消费可通过控制台和费用中心实时监控。适用于AI编程集成、智能体开发等场景。配合Qwen3.6发布低至4.5折优惠及先用后返最高200元活动,可助力用户灵活控制AI预算。
|
9天前
|
机器学习/深度学习 监控 安全
公共安全打架行为识别数据集分享(适用于YOLO系列深度学习检测任务)
本数据集含3000张真实场景图像(校园、商场、街道等),已划分训练/验证集,YOLO/COCO双格式标注,涵盖打架人员与普通人员两类目标,支持YOLOv5/v8等模型直接训练,助力公共安全智能监控与异常行为识别研究。(239字)
92 3
|
1月前
|
存储 人工智能 机器人
零代码低成本!阿里云一键部署OpenClaw实操教程
还在为部署OpenClaw发愁?阿里云推出官方一键镜像,零代码快速部署!新用户首月仅9.9元享2核4G服务器,叠加7000万免费Token,轻松“养龙虾”——即刻拥有可联网、能执行、会记忆的专属AI助理!
431 10
零代码低成本!阿里云一键部署OpenClaw实操教程
|
16天前
|
弹性计算 前端开发 JavaScript
前端组件库 ——A‑Frame 知识点大全(二)
教程来源 http://oplhc.cn A-Frame采用实体-组件-系统(ECS)架构:实体是空容器,组件提供可复用的外观与行为(如geometry、material),系统管理全局逻辑。基于DOM与声明式HTML,支持灵活组合、解耦设计与VR应用高效扩展。
|
16天前
|
自然语言处理 前端开发 容器
前端组件库 ——FormMaking 知识点大全(二)
教程来源 https://zlpow.cn FormMaking字段体系涵盖基础、高级与布局三类字段,支持丰富配置;全局配置含国际化、默认属性及字段标识绑定,助力低代码高效构建企业级表单。