目录

  • 简介
  • 一个例子
  • 缺点
  • 复习:3NF范式
  • 参考

简介

头表、行表(Header-Details)是一种常见的关系型数据库表设计模式,用于存储具有父子关系的数据,例如订单和订单项、发票和发票明细等。

在头表、行表模式中,父表(Header)存储主要信息,如订单号、日期、客户信息等,而子表(Details)存储与父表相关的详细信息,如订单项、发票明细等。子表与父表之间通过外键关联,一般是父表的主键作为子表的外键。

建立头表和行表,是为了避免冗余数据的出现,头表和行表由一对多的关系联系。

具体来说,头表、行表模式通常包含以下几个方面:

  • 头表:头表是父表,通常包含一些关键信息,如订单号、日期、客户信息等。头表的主键通常是唯一的,可以用于与子表进行关联。
  • 包含主键
  • 包含 entire object 的属性
  • 行表:行表是子表,包含与头表相关的详细信息,如订单项、发票明细等。行表通常包含一个外键列,与头表的主键进行关联,以便将子表数据与父表数据关联起来。
  • 包含其自己的主键
  • 有联系到头表的非空外键
  • 包含 specific subitems 的属性(每条明细不同)
  • 关联:头表和行表通过外键关联,建立父子关系。具体来说,头表的主键列作为行表的外键列,行表通过外键列引用头表的主键,建立与头表的关联关系。

MySQL 父子关系 order 数据库中父表和子表_外键

所有头表的外键和退化维度都应包含在行表(事实表)中。

一个例子

  • 头表:订单信息(头ID,超市编号、购买时间、收款员),主键(头ID)
  • 行表:订单明细(头ID,行ID,细目名称,数量,单价),主键(头ID,行ID),外键(头ID)

张三买3个面包、30代牛奶和1块黄油的订单,数据这样存储:

  • 头表:
  • 1,1,2012-12-13,“小王”
  • 行表:
  • 1,1,面包,3,3.00
  • 1,2,牛奶,30,1.20
  • 1,3,黄油,1,5.00

如果存在一张表中(订单ID,细目ID,超市编号,购买时间,收款员,细目名称,数量,单间)就会变成这样(前面的数据就是冗余的),不符合2NF

  • 1,1,2012-12-13,“小王”,3,面包,3,3.00
  • 1,2,2012-12-13,“小王”,30,牛奶,2.00
  • 1,3,2012-12-13,“小王”,1,黄油,1,5.00

如果串资料时,如果不涉及详细内容,比如统计订单数量,或者收款员的工作量,可以只取头表信息
如果要详细信息的内容,比如统计牛奶、面包卖了多少
就要头表和行表做关联查询

缺点

头表、行表模式也存在一些缺点,如需要进行复杂的查询和连接操作,容易出现性能问题;同时,在数据模型发生变化时需要进行复杂的维护操作。因此,在具体的应用场景中需要根据实际情况选择适当的数据模型。

复习:3NF范式

  • 1NF:原子性
  • 2NF:部分依赖
  • 3NF:传递依赖

参考

https://dataedo.com/kb/data-design-patterns/header-lines-tables