做软件开发,绕不开的一个环节就是数据库设计。很多人一开始上手写代码,急着建表插数据,结果后期改字段、加索引、调结构,改得焦头烂额。其实,好的数据库设计,就像盖房子前的图纸,前期多花点时间,后面省心不少。
先想清楚业务要啥
别一上来就打开 MySQL 开始建表。先问问自己:这个系统是干啥的?比如你做个电商后台,用户要下单、查订单、管理库存。那核心数据就有用户、商品、订单、库存这些。把这些关键实体列出来,再理清它们之间的关系,比如一个用户可以下多个订单,一个订单包含多个商品。
表怎么分,字段怎么定
实体清楚了,就可以拆成表。比如用户表(user)至少要有 ID、姓名、手机号;订单表(order)得有订单号、用户ID、下单时间、总金额。注意别把所有信息堆一张表里,比如别在订单表里直接存用户姓名,应该用 user_id 关联,避免数据冗余。
字段类型也别随便选。手机号看着像数字,但别用 int,得用 varchar,毕竟前面可能带区号,中间也可能有横线。时间字段统一用 datetime,别一会 timestamp 一会 string,后期查询对不上劲。
主键和索引不是摆设
每张表最好有个自增主键,比如 id INT AUTO_INCREMENT PRIMARY KEY,简单又高效。另外,常用来查数据的字段得加索引。比如用户经常用手机号登录,那就给 phone 字段加个索引,不然每次全表扫描,慢得让人抓狂。
但索引也不是越多越好,更新数据时索引也得跟着变,太多反而拖慢写入速度。一般重点照顾查询频繁、条件筛选多的字段就行。
举个简单例子
假设做个博客系统,至少需要用户表和文章表:
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE post (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT,
user_id INT,
published_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(id)
);
这里 user_id 是外键,关联用户表,确保每篇文章都知道是谁写的。同时,如果经常按作者查文章,可以给 user_id 加个索引。
留点余地,别堵死自己
上线后需求变是常态。比如一开始商品只有价格,后来要加折扣价、会员价。所以字段设计时,能预留的尽量考虑。比如加个 status 字段表示状态,别用文字写死,用数字 0、1、2 表示不同状态,后期扩展方便。
还有,别忘了备份和权限控制。开发阶段大家都能删表,真出事哭都来不及。正式环境得限制 DROP 权限,重要操作走审批流程。
数据库设计不是一次定终身,但前期理清逻辑,能少走很多弯路。与其后期不停补锅,不如一开始就认真画好这张数据地图。