数据库中表的设计规范

表的结构

列:由多个字段构成,每个字段存储单一数据项,列的先后顺序对表没有影响

行:记录,一个表中不能存在完全相同的两行,行的顺序对表没有影响

主键:primary key 表中的一列或多列组合起来唯一的标识表中的一条记录

主键的选取:

  • 业务(逻辑)主键:选择使用业务中有实际意义的一个字段做主键,比如身份证号码,手机号...

  • 代理主键:使用一个无意义的数值: 自增长的数值, UUID(通用唯一识别码)

外键:foreign key 用于连接另外一张表,(通常)是连接表中的主键或唯一键

外键约束:数据的一致性

关系范式:一套约束、确保多个表结构的设计符合关系模型

  • 1NF:每一列都是不可再分的原子数据项,即表中的每个字段都是不可分割的基本数据项,不能包含多个值。

当数据为1对多时,可以提取为另外一个表,嵌入原表中

不符合1NF:

复制代码
用户表
user_id | user_name | phone_numbers
1       | Alice     | 1234567890, 0987654321

符合1NF:

复制代码
用户表
user_id | user_name
1       | Alice

用户电话表
user_id | phone_number
1       | 1234567890
1       | 0987654321
  • 2NF:主键依赖,非主键字段必须完全依赖于主键字段,不能部分依赖于主键。否则要提取出另外的表

不符合2NF:

复制代码
订单表
order_id | product_id | product_name | quantity
1        | 101        | Product A    | 2
1        | 102        | Product B    | 3

在这个表中,product_name 只依赖于 product_id,而不是整个主键 (order_id, product_id)

符合2NF:

复制代码
订单表
order_id | product_id | quantity
1        | 101        | 2
1        | 102        | 3

产品表
product_id | product_name
101        | Product A
102        | Product B
  • 3NF:表中的非主键字段不能存在传递依赖关系,即非主键字段之间不能存在依赖关系。当非键之间有依赖时,可以提取为另外的表

不符合3NF:

复制代码
学生表
student_id | student_name | department_name | department_head
1          | Alice        | Computer Sci    | Dr. Smith

符合3NF:

复制代码
学生表
student_id | student_name | department_id
1          | Alice        | 1

部门表
department_id | department_name | department_head
1             | Computer Sci    | Dr. Smith

意义

  • 减少冗余(一些数据只存一次,而非存储多次)

  • 保证数据完整性、一致性

  • 简化数据维护

  • 提高查询效率(当不符合范式时效率更高,则会由反范式的操作)

相关推荐
计算机毕设VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
Mr__Miss3 小时前
保持redis和数据库一致性(双写一致性)
数据库·redis·spring
Knight_AL4 小时前
Spring 事务传播行为 + 事务失效原因 + 传播行为为什么不用其他模式
数据库·sql·spring
倔强的石头_4 小时前
时序数据时代的“存储与分析困局”解析及金仓解决方案
数据库
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
倔强的石头_5 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库
SelectDB6 小时前
驾驭 CPU 与编译器:Apache Doris 实现极致性能的底层逻辑
运维·数据库·apache
zbguolei6 小时前
MySQL根据身份证号码计算出生日期和年龄
数据库·mysql
马克学长7 小时前
SSM校园图书借阅服务系统jd2z8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·图书管理系统·ssm 框架·ssm 校园图书借阅系统
软件派7 小时前
高斯数据库使用心得——从性能优化到行业实践的深度解析
数据库·oracle