上面的表结构中 ,region_id 和 industry_id 是以ID,而不是纯字符串“Greater Seattle
Area”和“Philanthropy”的形式给出的。为什么?
如果用户界面用一个自由文本字段来输入区域和行业,那么将他们存储为纯文本字符串是合理的。另一方式是给出地理区域和行业的标准化的列表,并让用户从下拉列表或自动填充器中进行选择,其优势如下:
- 各个简介之间样式和拼写统一避免歧义(例如,如果有几个同名的城市)
- 易于更新——名称只存储在一个地方,如果需要更改(例如,由于政治事件而改变城市 名称),很容易进行全面更新。
- 本地化支持——当网站翻译成其他语言时,标准化的列表可以被本地化,使得地区和行 业可以使用用户的语言来显示
- 更好的搜索——例如,搜索华盛顿州的慈善家就会匹配这份简介,因为地区列表可以编 码记录西雅图在华盛顿这一事实(从“Greater Seattle Area”这个字符串中看不出来)
存储ID还是文本字符串,这是个副本(duplication)问题。当使用ID时,对人类有意义的信息(比如单词:Philanthropy)只存储在一处,所有引用它的地方使用ID(ID只在数据库中有意义)。当直接存储文本时,对人类有意义的信息会复制在每处使用记录中。
使用ID的好处是,ID对人类没有任何意义,因而永远不需要改变:ID可以保持不变,即使它标识的信息发生变化。任何对人类有意义的东西都可能需要在将来某个时候改变——如果这些信息被复制,所有的冗余副本都需要更新。这会导致写入开销,也存在不一致的风险(一些副本被更新了,还有些副本没有被更新)。