构建符号表

如果列所包含的字符串在每行中不唯一,那么可以将这些字符串移到只存储唯一副本的表中。

例如:customer.city 列包含城市名称。 有些城市名称在列中是重复的,并且大多数行在字段的尾部都有一些空白。 使用 VARCHAR 数据类型可以消除这些空白,但不能消除重复。

您可以创建名为 cities 的表,如以下示例所示:
CREATE TABLE cities (
      city_num SERIAL PRIMARY KEY,
      city_name VARCHAR(40) UNIQUE
)

可以更改 customer 表的定义,这样 它的 city 列会变成外键,引用 cities 表 中的 city_num 列。

要将新客户的城市插入 cities,必须更改 所有向 customer 插入新行的程序。SQL 通信区 (SQLCA) 的 SQLCODE 字段中的数据库服务器返回码可以指示由于重复键而导致插入失败。这不是逻辑错误;它仅表示现有的某客户在该城市中。有关 SQLCA 的更多信息,请参阅 GBase 8s SQL 指南:教程

除了更改插入数据的程序以外,还必须更改所有检索城市名称的程序和存储查询。 这些程序和存储查询必须使用到新的 cities 表的连接以获得数据。 插入行的程序中和某些查询中的额外的复杂性,是在数据模型中放弃了理论的正确性的结果。 进行更改前,请确保它会带来节省磁盘空间或执行时间的回报。