规范化你的数据库:第一范式

这两个简单的规则将有助于规范化数据库

第一范式(1NF)为有组织的数据库设置基本规则:

在考虑数据库的实际设计时,这些规则意味着什么? 其实很简单。

1.消除重复

第一条规则规定我们不得在表格的同一行内复制数据。 在数据库社区中,这个概念被称为表的原子性。 据说这个规则的表格被认为是原子的。 让我们用一个经典的例子来探索这个原理:一个人力资源数据库中的一张表,存储经理 - 从属关系。 就我们的例子而言,我们会强制规定每个经理可能有一个或多个下属,而每个下属可能只有一个经理。

直观地说,创建一个列表或电子表格来跟踪这些信息时,我们可能会创建一个包含以下字段的表格:

但是,回想1NF强加的第一条规则:消除同一个表中的重复列。 显然,Subordinate1-Subordinate4列是重复的。 花点时间思考这种情况引发的问题。 如果经理只有一个下属,Subordinate2-Subordinate4列只是浪费了存储空间(一种宝贵的数据库商品)。 此外,设想一个经理已经有4个下属的情况 - 如果她接管另一个员工会发生什么情况? 整个表格结构将需要修改。

在这一点上,数据库新手通常会遇到第二个明智的想法:我们不希望有多个列,我们希望允许灵活的数据存储。 让我们尝试这样的事情:

而下属字段将包含“Mary,Bill,Joe”形式的多个条目。

这个解决方案比较接近,但也不符合标准。 下属专栏仍然是重复的,并且是非原子的。 当我们需要添加或删除下属时会发生什么? 我们需要读取和写入表格的全部内容。 在这种情况下这不是什么大问题,但如果一位经理有一百名员工呢? 而且,它在将来的查询中从数据库选择数据的过程变得复杂。

这是一张满足1NF第一条规则的表格:

在这种情况下,每个下属都有一个条目,但管理者可能有多个条目。

2.确定主键

现在,第二条规则是什么:使用唯一列或一组列( 主键 )标识每一行? 你可以看看上面的表格,并建议使用从属列作为主键。 事实上,由于我们的业务规则指定每个下属可能只有一个经理,所以下级列是主键的良好候选人。 然而,我们选择存储在我们的表中的数据使得这不是理想的解决方案。 如果我们雇用另一名名叫吉姆的员工会怎样? 我们如何将他的经理 - 从属关系存储在数据库中?

最好使用真正唯一的标识符(如员工ID)作为主键 。 我们的决赛桌看起来像这样:

现在,我们的桌子是第一种正常形式! 如果您想继续学习规范化,请阅读本系列中的其他文章: