第一标准形式(1NF)设置基本规则组织数据库:
- 从同一个表中删除重复的列。
- 为每组相关数据创建单独的表,并使用唯一列(主键)标识每一行。
这些规则在考虑数据库的实际设计时意味着什么?它实际上非常简单。
消除重复
第一个规则决定了我们不能在表的同一行中重复数据。在数据库社区中,此概念被称为表格的原子。据说符合此规则的表格是原子的。让我们使用Classic示例探索这个原理:人力资源数据库中存储管理器从属关系的表。出于我们的示例的目的,我们将强加的业务规则,即每个管理者可能具有一个或多个下属,而每个从属可能只有一个管理器。
直观地,在创建列表或电子表格以跟踪此信息时,我们可能会创建一个包含以下字段的表:
- 经理
- 下属1.
- 下属2.
- 下属3.
- 下属4.
但是,请调用1NF强加的第一个规则:消除来自同一表的重复列。显然,下属1-隶属4列是重复的。花点时间,思考这种情况提出的问题。如果管理器只有一个从属,则从属于浪费存储空间(珍贵的数据库商品)。此外,想象经理已经有4个下属的情况 - 如果她接受另一名员工,会发生什么?整个表结构需要修改。
在这一点上,数据库新手通常会想到第二个好主意:我们不希望有多个列,我们希望允许灵活的数据存储量。让我们尝试这样做:
- 经理
- 下属
下属领域将包含“玛丽,比尔,乔”形式的多个条目。
这个解决方案比较接近,但它也没有达到目标。从属列仍然是重复的和非原子的。当我们需要添加或删除下级时会发生什么?我们需要读取和写入表的全部内容。在这种情况下,这不是什么大问题,但如果一个经理有100名员工呢?此外,它还使在以后的查询中从数据库中选择数据的过程变得复杂。
这是一个满足第一个规则的1nf的表:
- 经理
- 下属
在这种情况下,每个下属都有一个条目,但管理器可能有多个条目。
识别主键
现在,第二条规则怎么样:用唯一列或一组列标识每行(主键)。您可以查看上面的表,并建议使用从属列作为主键。实际上,由于我们的业务规则指定每个下级可能只有一个经理,所以下级列很适合使用主键。但是,我们选择存储在表中的数据使这不是一个理想的解决方案。如果我们再雇一个叫吉姆的员工会怎么样?我们如何在数据库中存储他的经理-下级关系?
最好使用真正的唯一标识符(例如员工ID)作为主键。我们的最终桌子看起来像这样:
- 经理ID
- 下属ID
现在,我们的桌子是以第一正常形式!除此之外,还有一个选择你的选择数据库以第二正常形式, 也第三范式如果你对更多的组织感兴趣的话。