当前位置: 首页 > news >正文

数据库中表的设计规范

表的结构

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

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

主键: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

意义

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

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

- 简化数据维护

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

http://www.xdnf.cn/news/627607.html

相关文章:

  • 【软考】【信息系统项目管理师】2025年5月24日考试回忆版,祝明天考试的兄弟们顺利
  • maxkey单点登录系统
  • Neo4j(二) - 使用Cypher操作Neo4j
  • iOS 直播特殊礼物特效实现方案(Swift实现,超详细!)
  • STM32F446主时钟失效时DAC输出异常现象解析与解决方案
  • AtCoder AT_abc407_d [ABC407D] Domino Covering XOR
  • 【Web前端】jQuery入门与基础(二)
  • 免费PDF工具-PDF24V9.16.0【win7专用版】
  • TypeScript基础数据类型详解总结
  • 常见的图像生成模型
  • 嵌入式开发学习日志(linux系统编程--进程(1))Day27
  • winsever2016Web服务器平台安装与配置
  • python训练营day34
  • TIT-2014《Randomized Dimensionality Reduction for $k$-means Clustering》
  • 第十天的尝试
  • 快速排序算法的C++和C语言对比
  • Python实用工具:文件批量重命名器
  • Unity3D仿星露谷物语开发49之创建云杉树
  • 常见算法题目3 -反转字符串
  • 2025年—ComfyUI_最新插件推荐及使用(实时更新)
  • 保姆式一步一步制作B端左侧菜单栏
  • 游园安排--最长上升子序列+输出序列
  • 力扣:《螺旋矩阵》系列题目
  • Vant4+Vue3+Vite开发搭建教程
  • 【Redis】分布式缓存的一系列问题(持久化,主从集群,哨兵,分片集群)
  • 解决Docker容器内yum: not found、apt: not found、apk: command not found等命令找不到问题
  • 开发者工具箱-鸿蒙颜色转换器开发笔记
  • python打卡训练营打卡记录day35
  • 《算法导论(第4版)》阅读笔记:p127-p133
  • C语言 — 内存函数和数据的存储