8.2.2 避免保存冗余数据

此前,我们曾经问过这样一个问题:“为什么不能将Julie Smith的地址保存在Orders表中?”

如果Julie在Book-O-Rama书店多次订购了图书(这是我们所希望的),我们会将她的资料存储多次。可能会得到如图8-4所示的Orders表。

8.2.2 避免保存冗余数据 - 图1

图 8-4 保存冗余的数据库设计将占用额外的空间,并且可能引起数据异常

这种设计产生两个基本问题:

■首先是空间的浪费。既然只要将Julie的详细信息存储一次就足够了,为什么还要保存3次呢?

■第二个问题是它会导致数据更新的不一致,也就是说,在修改数据库之后容易产生数据不一致。数据的完整性将被破坏,以至于我们不知道哪些数据正确,哪些数据不正确,通常这会导致信息的丢失。

这里,需要避免3种情况的更新不规则:修改、插入和删除不规则。

如果Julie在下了订单后搬家了,需要在3个地方而不只是一个地方更新她的地址,进行3次相同的操作。这很容易使我们只在一个地方修改数据,从而导致数据库中的数据不一致(非常糟糕的事情)。因为这些问题发生在对数据库进行修改的时候,因此称为修改不规则。

使用这种设计,每次在处理订单的时候都需要插入Julie的详细信息,因此每次必须检查并确认她的数据是否与表中当前行一致。如果不检查,则可能有两行关于Julie并且相互冲突的信息。例如,一行可能告诉我们Julie住在Airport West,另一行则可能表明她住在Airport。这叫做插入不规则,因为它出现在插入数据的时候。

第三类不规则称为删除不规则,因为它在从数据库中删除一行的时候发生。例如,假设一个订单已经交货,需要将它从数据库中删除。当Julie的当前订单都已交货,那么这些订单都将从数据库中删除。这意味着我们再也没有Julie的地址记录。这样就不能再为她提供服务,若下次她希望再到这里订货,我们又需要获取其信息。

通常,数据库的设计不应该出现上述不规则中的任何一种。