首批通过分布式安全可靠测评,为关键业务系统打造
表结构设计
更新时间:2026-04-10 11:58:35
在数据库使用过程中,开发者会创建各种表,来进行数据库操作,本文旨在帮助开发者规范数据库中表的结构设计。
三大范式
在推荐表结构设计之前,先来了解一个数据库概念,数据库设计三大范式。为了建立出冗余更小、结构更合理的数据库,在进行数据库创建的时候要遵循一定的原则,在关系型数据库中这种规范被称为范式。下面简单介绍下三大范式。
第一范式(字段原子值)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该表满足了第一范式。
示例:学生表,具体字段的定义如下。
| sno | sname | 联系方式 |
|---|---|---|
| 01 | 赵浅 | 1******1@qq.com |
| 02 | 孙理 | 138****1234 |
| 03 | 周吾 | 135****1234 |
从表中明显可以看出,联系方式值有邮箱和手机号码,因此不是原子值,不满足第一范式。这里将联系方式拆分为邮箱和手机号码,则每一列都是原子值,从而满足了第一范式。修改后的学生表的字段定义如下。
| sno | sname | 邮箱 | 手机号码 |
|---|---|---|---|
| 01 | 赵浅 | 1******1@qq.com | |
| 02 | 孙理 | 138****1234 | |
| 03 | 周吾 | 135****1234 |
第二范式(无部分依赖)
第二范式在第一范式的基础之上对字段的定义要求更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
示例:学生教师表,具体字段定义如下:
| (sno | tno)~pk~ | sname | tname |
|---|---|---|---|
| 01 | 01 | 赵浅 | 郑望 |
| 01 | 02 | 赵浅 | 冯沉 |
| 02 | 01 | 孙礼 | 郑望 |
| 02 | 03 | 孙礼 | 楚卫 |
| 03 | 02 | 周吾 | 冯沉 |
| 03 | 03 | 周吾 | 楚卫 |
这张表中的主键为(sno,tno),很明显 每个字段都是原子值不可再分,满足第一范式,但 sname 依赖于 sno,tname 依赖于 tno,不满足第二范式,因此需要对表进行拆分。将 1 张表拆分为 3 张表具体拆分后的字段如下。
学生表:
| sno~pk~ | sname |
|---|---|
| 01 | 赵浅 |
| 02 | 孙礼 |
| 03 | 周吾 |
教师表:
| tno~pk~ | tname |
|---|---|
| 01 | 郑望 |
| 02 | 冯沉 |
| 03 | 楚卫 |
学生教师关系表:
| id~pk~ | sno~fk~ | tno~fk~ |
|---|---|---|
| 1 | 01 | 01 |
| 2 | 01 | 02 |
| 3 | 02 | 01 |
| 4 | 02 | 03 |
| 5 | 03 | 02 |
| 6 | 03 | 03 |
上面3张表字段皆为原子值,且不存在部分依赖,满足第二范式。
第三范式(无传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
示例:学生教室表,具体字段定义如下
| tno~pk~ | tname | cno | cname |
|---|---|---|---|
| 01 | 赵浅 | 01 | 唐朝班 |
| 02 | 孙礼 | 01 | 唐朝班 |
| 03 | 周吾 | 02 | 周朝班 |
从表中明显看出表中各字段皆为原子值,且不存在部分依赖,满足第一、第二范式,但 cname 依赖于 cno,cno 依赖于 tno,存在传递依赖,不满足第三范式。将这张表进行拆分为 2 张表,具体如下:
班级表:
| cno~pk~ | cname |
|---|---|
| 01 | 唐朝班 |
| 02 | 周朝班 |
学生班级关系表:
| tno~pk~ | tname | cno~fk~ |
|---|---|---|
| 01 | 赵浅 | 01 |
| 02 | 孙礼 | 01 |
| 03 | 周吾 | 02 |
经过拆分后,表中不存在传递依赖,满足了第三范式。
普通表结构设计规范
表结构设计不应该简单遵循三大范式,应该以业务性能为指导,适当进行数据冗余存储,以减少表的关联从而提升业务性能。冗余字段应遵循:
不是频繁修改的字段。
不是
varchar超长字段。
建表时应该设定主键。
建议使用业务字段做主键或做联合主键,不建议使用自增列做主键。
OceanBase 数据库的表存储模型为索引聚集表模型(
IOT),如果用户未指定主键,系统会自动生成一个隐藏主键。
表必备两字段:
gmt_create,gmt_modified。说明
gmt_create,gmt_modified的类型选择DATE(精确到秒)或TIMESTAMP WITH TIME ZONE(精确到微秒,且带当前时区信息),可以使用sysdate或systimestamp函数。表、字段需要有
COMMENT属性。表中所有字段推荐是
NOT NULL属性,业务可以根据需要定义DEFAULT值。多表中的相同列,必须保证列定义一致。
进行
join的关联字段,数据类型保证一致,避免隐式转换。不推荐使用复杂的数据类型,如
blob或者json。表达是与否概念的字段,推荐数据类型是
unsigned tinyint(1 表示是,0 表示否),值的内容要统一。 示例:表达逻辑删除的字段名is_deleted,1 表示删除,0 表示未删除。如果修改字段含义或对字段表示的状态追加时,建议及时更新字段注释。