题目
设计用户信息表
信息
- 类型:问答
- 难度:⭐
考点
表结构设计,数据类型选择,基础约束
快速回答
设计用户表的核心要点:
- 用户ID:主键,使用自增整数或UUID
- 用户名:VARCHAR(50),添加唯一约束
- 邮箱:VARCHAR(100),添加唯一约束
- 密码:VARCHAR(255)存储加密后的哈希值
- 注册时间:TIMESTAMP或DATETIME,默认当前时间
示例SQL:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
## 解析
原理说明
数据库表设计需平衡存储效率、查询性能和数据完整性:
- 主键:唯一标识记录,自增INT节省空间,UUID适合分布式系统
- 字符串类型:VARCHAR按需分配存储,避免CHAR的固定长度浪费
- 时间类型:TIMESTAMP自动记录时间戳,DATETIME支持更大时间范围
- 约束:UNIQUE防止重复,NOT NULL保证数据完整性
代码示例
-- MySQL示例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键
username VARCHAR(50) UNIQUE NOT NULL, -- 唯一用户名
email VARCHAR(100) UNIQUE NOT NULL, -- 唯一邮箱
password VARCHAR(255) NOT NULL, -- 加密密码存储
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 自动注册时间
);
-- PostgreSQL示例
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);最佳实践
- 密码安全:存储bcrypt/scrypt哈希值,绝对禁止明文存储
- 索引优化:主键自动创建索引,UNIQUE约束自动生成唯一索引
- 字段长度:用户名50字符满足大多数场景,邮箱100字符兼容长地址
- 默认值:注册时间使用DEFAULT减少应用层逻辑
常见错误
- 错误1:用TEXT存储用户名——过度消耗存储空间
- 错误2:缺少UNIQUE约束——导致重复用户/邮箱
- 错误3:使用DATETIME但未设默认值——注册时间为空
- 致命错误:密码明文存储如
password VARCHAR(20) NOT NULL
扩展知识
- 自增ID vs UUID:
自增ID:查询快,但分库分表时需额外处理
UUID:全局唯一,但存储空间大(128bit) - 索引原理:B+树加速查询,UNIQUE索引保证字段值唯一
- 密码加密:使用
password_hash('密码', PASSWORD_BCRYPT)(PHP示例)存储,验证时用password_verify()