上一篇
场景引入:
凌晨3点,程序员小张盯着报错的订单系统抓狂——"为什么用户买了10件商品,数据库只存了3件?" 原来同事设计的订单表里,商品ID字段长度只够存3个数字…这就是没学好数据库表结构的血泪教训!今天我们就用"搭积木"的思维,拆解数据存储的核心秘密。
想象你有个万能收纳盒:
-- 这就是个用户表的"说明书" CREATE TABLE users ( user_id INT PRIMARY KEY, -- 🔑主键:每个用户的身份证号 name VARCHAR(50), -- 可变长度字符串(省空间) age TINYINT UNSIGNED, -- 无符号微型整数(0-255岁够用了) created_at TIMESTAMP -- 自动记录注册时间 );
类型 | 适用场景 | 翻车案例 |
---|---|---|
INT | 用户ID、订单号 | 用VARCHAR存ID,查询慢10倍 |
DECIMAL(10,2) | 金额、精确计算 | 用FLOAT存钱,出现0.1+0.2≠0.3 |
ENUM('男','女') | 固定选项 | 存"雄性/雌性",业务改需求全表重写 |
冷知识:MySQL 8.0开始支持CHECK约束
,
ALTER TABLE employees ADD CONSTRAINT CHECK (salary > 0);
-- 多对多中间表示例 CREATE TABLE student_courses ( student_id INT REFERENCES students(id), course_id INT REFERENCES courses(id), PRIMARY KEY (student_id, course_id) -- 联合主键防重复 );
a1
,b2
,三个月后自己都看不懂 2025年新趋势:
-- 商品表(注意价格用DECIMAL防精度丢失) CREATE TABLE products ( product_id BIGINT AUTO_INCREMENT, name VARCHAR(100) NOT NULL, price DECIMAL(10,2) CHECK (price >= 0), stock INT DEFAULT 0, PRIMARY KEY (product_id) ) ENGINE=InnoDB; -- 支持事务的存储引擎 -- 订单表(记录流水) CREATE TABLE orders ( order_id VARCHAR(32), -- 用UUID或雪花ID user_id INT NOT NULL, total_amount DECIMAL(12,2), status ENUM('待支付','已发货','已完成') DEFAULT '待支付', PRIMARY KEY (order_id), INDEX idx_user (user_id) -- 加速用户查询 );
设计技巧:
TIMESTAMP
或DATETIME(6)
(支持毫秒) TEXT
类型,但避免SELECT *(影响性能) 💡 好的表结构像乐高积木——
- 每个零件(字段)各司其职
- 拼接处(关联关系)严丝合缝
- 预留扩展接口(新需求来了不加表)
下次设计表时,不妨先画个实体关系图(ER图)再动手,你的数据库会感谢你!
本文由 仪冉冉 于2025-08-04发表在【云服务器提供商】,文中图片由(仪冉冉)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/532320.html
发表评论