8.2.6 避免多个空属性的设计
如果希望在数据库中添加一些图书评论,至少有两种方法可以实现。这两个方法如图8-7所示。
图 8-7 为了添加评论,可以在表Books中加一个Review列,或者专门为评论添加一个表
第一种方法意味着在Books表中加一个Review列。这样,每本书就有了一个字段来添加评论。如果数据库中的图书太多,评论员无法评论所有的书。那么在此属性项上,许多数据行就没有值。这就叫空值。
数据库里有许多空值是一件糟糕的事情。它极大地浪费空间,并且在统计列总量或对其他数值列应用计算函数时可能导致错误。当用户看到表中一部分为空的时候,他们也不知道是否因为该属性是无关的,还是数据库中有错误,或者是数据尚未输入。
通常,使用一个替代设计可以避免这种空值较多的问题。在这个例子中,可以采用图8-7给出的第二种设计。这里,Book_Reviews表中只包含带有评论的图书,当然也包含这些评论。
请注意,本设计是基于只有一个书店内部评论员的。也就是说,在Books和Reviews之间只存在一个一对一的关系。如果希望为同一本图书包含多个评论,这就是一个一对多的关系,而且必须选择第二个设计方案。此外,如果使用一本图书只有一个评论的设计,可以使用ISBN作为Book_Reviews表的主键。如果使用一本图书有多个评论的设计,必须为每一个评论引入一个唯一标识符。