企业旅行者的姓名字段还没有成为最小的可能单元,从而破坏了1NF(First Normal Form)原则。这些旅行者可以是单独的游客而非公司。不过解决这个问题也很简单,我们可以创建两个字段:FirstName和LastName,然后做出些有关定义。 新的客户表也有个性质比较严重的问题:接受零售服务的客户很可能是需要FirstName和LastName字段的个人。为了简化示例,我们不妨规定以下一条商务规则:所有的客户都是公司,所以在目前阶段还不需要解决这个问题。出于简单的目的,我们只引入了这一条商务规则,把客户限定为企业而非个人,这样就不再需要进一步地设计了。 地址信息破坏了2NF(Second Normal Form)规则。地址字段和其他完整说明客户的所有字段而非地址字段都存在依附性。所以,某些开发人员可能会取消新表中的地址字段。不过那样做的话,假如数据表按照BCNF规则规范化(Boyce-Codd Normal Form)则可能引入额外的数据表。在这种起来下,你可以引入地址、城市和州等数据表来遵守以上规则。此外,客户还可能具有多个地址,比如说,一个地址专门用来通邮;一个地址专门用来寄送票据和日程表信息等等。 客户表中的打折和佣金字段也有问题,它们倒没有违反什么规范化规则,但是这类字段很多往往会是空白。空字段虽然也没什么坏处,但最好还是尽量避免出现这样的情况。事实上,太多的空白往往是出现规范化错误的信号。所以,就我们的例子来说,两个字段都完全说明了主键而且不会与其他非键字段形成明显的依附关系。不过,由于可能出现空白字段的缘故,我们还是把这些字段移到一个新表,通过客户标识每条记录,然后给佣金或者折扣标记百分比。 客户只会有一个电话号码吗?假如不是这样,客户表内当前的电话号码字段就破坏了1NF规则:禁止出现多值字段。那就是说,一个字段内不答应输入多个电话号码。所以电话号码字段也必须移到一个新表中来,这样就需要一个电话号码表。解决的办法是从客户表中删除电话号码字段然后创建一个只有电话号码的新表。 规范化还是不规范化 假如我们的目标是老实遵守BCNF原则,那么地址表的规范化(Normalizing)就是必须考虑的问题,我们需要按照客户类型来标识每一地址:商务、服务交付等等。第1步是从客户表中删除地址字段,然后根据图B所显示的初始列表创建新的地址表。但我们还必须接着解决州和城市字段之间的依附性问题。