第一范式

如果实体不包含重复组,那么它满足第一范式。就关系而言,如果表不包含重复列,那么它满足第一范式。重复列会降低数据的灵活性、浪费磁盘空间和导致更难以搜索数据。在以下电话号码簿示例中,name 表包含重复列 child1、child2 和 child3。

图: 规范化之前的 Name 实体


Name 表包含以下列:rec_num、lname、fname、bdate、anniv、email、child1、child2、child3。

您可以在当前表中发现一些问题。这个表总是在磁盘上为三个子女记录保留空间,而无论该人员是否有子女。可以记录的最大子女数是 3,但您的一些熟人可能有四个或更多的子女。要查找特定的子女,就必须在每一行中搜索所有三个列。

要消除重复列并使该表满足第一范式,请将该表分为两个表。将重复列放到其中一个表中。两个表之间的关联是通过主键与外键的组合建立的。由于 name 表中不存在关联就不能存在子女,所以可使用外键 rec_num 来引用 name 表。

图: Name 实体达到第一范式


Name 表包含以下列:rec_num、lname、fname、bdate、anniv、email。子表包含以下列:rec_name、child_name。
现在,检查图 1 中的电话号码簿结构,了解有没有不满足第一范式的组。由于认为 b9600b14400b28800 列是重复列,所以 name-modem 关系不满足第一范式。向 modem 表添加名为 b_type 的新属性,以包含 b9600b14400b28800 出现形式。下图显示按照第一范式进行了规范化的数据模型。

图: 个人电话号码簿的数据模型


本图显示 7 个实体。每个实体都是一个矩形,矩形上方是实体名称。 每个实体的矩形包含该实体属性的名称。 属性名称后加上字母 PK,表示该属性是一个主键,或者是组合主键的一部分。 属性名称后加上字母 FK,表示该属性是一个外键。 “name”实体包含这些属性名:rec_num PK、lname、fname、bdate、anniv 和 email。 它通过关系线连接到其他 5 个实体。这些关系线会在稍后描述。 “voice”实体包含这些属性名:vce_num PK 和 vce_num FK 和 vce_type。 它通过关系线连接到“name”实体。靠近“name”的一端没有特殊符号。 靠近“voice”的一端有“可选”符号和“许多”符号。 “faxname”实体包含这些属性名:fax_num PK FK 和 rec_num PK FK。 它通过关系线连接到“name”实体。靠近“name”的一端没有特殊符号。 靠近“faxname”的一端有“可选”符号和“许多”符号。 “fax”实体包含这些属性名:fax_num PK、oper_from 和 oper_till。 它通过关系线连接到“faxname”实体。靠近“fax”的一端没有特殊符号。 靠近“faxname”的一端有“许多”符号。 “modem”实体包含这些属性名:mdm_num PK、rec_num FK 和 b_type。 它通过关系线连接到“name”实体。靠近“name”的一端有“刚好有一个”符号。 靠近“modem”的一端有“可选”符号和“许多”符号。 “address”实体包含这些属性名:id_num PK、rec_num FK、street、city、state 和 zipcode。 它通过关系线连接到“name”实体。靠近“name”的一端有“许多”符号。 靠近“address”的一端有“可选”符号和“刚好有一个”符号。 “child”实体包含这些属性名:rec_num FK 和 child_name。 它通过关系线连接到“name”实体。靠近“name”的一端没有特殊符号。 靠近“child”的一端有“可选”符号和“许多”符号。