你有没有遇到过这种情况?刚接手一个项目,打开数据库一看,一堆表名和字段,像是在看天书。user_info、tbl_x_2023、col1、col_flag……别说新人了,老手都得缓两秒。其实问题不在数据,而在表结构格式没整明白。
表结构到底是什么
简单说,数据库表结构就是一张“电子表格的设计图”。比如你要存用户信息,这张表得有“用户名”“手机号”“注册时间”这些列。每一列的名称、类型、是否允许为空、有没有默认值,这些加起来就是表结构。
就像你装修房子前得先画图纸,建表也得先设计结构。不然数据一多,改起来比翻修厨房还麻烦。
常见的字段类型怎么选
很多人乱用 VARCHAR(255),所有字段全设成文本,结果查起来慢,还浪费空间。其实 MySQL、PostgreSQL 这些主流数据库都有明确的类型支持:
id BIGINT AUTO_INCREMENT PRIMARY KEY
username VARCHAR(50) NOT NULL
age TINYINT UNSIGNED
is_active BOOLEAN DEFAULT TRUE
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
你看,年龄用 TINYINT 就够了(0-255),没必要上 INT;状态用布尔值比用 0/1 的 INT 更直观;时间直接用 DATETIME,自带格式,还能自动填充。
命名别太“自由发挥”
见过叫 user、u、t_user_bak_2 的表吗?开发团队一换人,谁都看不懂。建议统一风格,比如都用下划线分隔的小写:order_item、product_category。
字段也一样,别用缩写让人猜。create_time 比 ct 强一百倍,六个月后再来看代码,自己都能读懂。
主键和索引不是摆设
每张表最好有个自增主键,方便关联和调试。比如订单表用 order_id 当主键,查起来快,删改也精准。
另外,常用来查的字段记得加索引。比如用户登录频繁按手机号找,那 mobile 字段就得加索引,不然每次都是全表扫描,人多的时候系统直接卡住。
ALTER TABLE user ADD INDEX idx_mobile (mobile);
但别啥都加索引,更新数据时索引也得跟着变,太多反而拖慢写入速度。
实际场景:做个会员系统
假设你在小区楼下开个奶茶店,想做个会员积分系统。表结构可以这么设计:
CREATE TABLE member (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
phone VARCHAR(11) UNIQUE NOT NULL,
points INT DEFAULT 0,
level TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP
);
名字不能空,手机号唯一,积分和等级记录状态,两个时间字段自动管理。以后查“最近一周新增会员”,直接用 created_at 筛就行,不用手动填时间。
表结构清晰了,后续加功能也轻松。比如哪天想搞个生日优惠,加个 birth_date 字段就完事。