设计数据库表的 Column(列),本质上是定义数据的结构、约束和扩展能力。可以从下面几个维度系统地进行设计。
在动手设计列之前,先明确:
✅ 命名规范:
user_id
order_amount
created_at
❌ 不推荐:
uid
amt
date
这是最重要的一层设计。
| 场景 | 推荐类型 |
|---|---|
| 主键 ID | BIGINT / UUID |
| 用户名 | VARCHAR(50) |
| 金额 | DECIMAL(12,2) |
| 状态 | TINYINT / SMALLINT |
| 是否删除 | TINYINT(1) / BOOLEAN |
| 时间 | DATETIME / TIMESTAMP |
| 大文本 | TEXT |
| JSON | JSON / JSONB(MySQL / PostgreSQL) |
✅ 原则:
✅ 建议:尽量 NOT NULL
username VARCHAR(50) NOT NULL
❌ 常见问题:
✅ 替代方案:
0、'')减少 NULL,提高数据一致性。
status TINYINT NOT NULL DEFAULT 1
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
PRIMARY KEYUNIQUENOT NULLCHECK(如金额 ≥ 0)FOREIGN KEY(慎用)email VARCHAR(100) NOT NULL UNIQUE
amount DECIMAL(12,2) CHECK (amount >= 0)
常见方案对比:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 自增 ID | 简单、快 | 不安全、分片困难 |
| UUID | 唯一、安全 | 索引性能差 |
| 雪花 ID | 高性能、有序 | 实现复杂 |
✅ 推荐:
❌ 不推荐:
status VARCHAR(20)
✅ 推荐:
status TINYINT NOT NULL DEFAULT 1 COMMENT '1:启用 2:禁用'
或:
几乎每张表都应该有:
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
用于未来变化:
remark VARCHAR(255)
extra JSON
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
order_no VARCHAR(64) NOT NULL UNIQUE,
amount DECIMAL(12,2) NOT NULL CHECK (amount >= 0),
status TINYINT NOT NULL DEFAULT 1,
remark VARCHAR(255),
extra JSON,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
VARCHAR(255)FLOATNULLtype 一个字段表示多种业务)FOREIGN KEY如果你愿意,可以告诉我:
我可以帮你 直接设计一张真实可用的表结构 ✅
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。