使用街道地址作为主键的最佳做法是什么?

时间:2015-06-04 19:04:04

标签: mysql database-performance composite-primary-key

我正在学习如何使用mysql构建一个房地产网站。我想创建一个propertyDetail表来存储每个公寓的细节,似乎有意义的是使用公寓的地址作为主键,但是每个公寓地址都由单位信息组成(例如,单元A,5楼,第2块),建筑物名称,街道名称和街道名称,城市,邮政编码,国家,我不确定表现明智是否是一种好的做法。

此外,如果有人输入了一个带有建筑物名称的地址,但是另一个人输入了没有建筑物名称的相同地址信息,则两者都有效,但是mysql会将它们视为不同的公寓,因为复合键不一样。

另一个例子是有人输入“单元A,第5层,第2单元”,另一个人输入“单元A,5 / F,块2”。我应该怎么处理?我应该使用别的东西作为主键吗(我想不出其他字段可以代表地址以外的独特公寓)?

如果我应该坚持使用主键的地址,我是否应该使用hash()之类的函数来生成一个唯一的键来存储作为性能原因的主键?

如果有些专家可以分享一些见解,我感激不尽。

1 个答案:

答案 0 :(得分:0)

主键的目的是确保表中记录的唯一性。街道地址的唯一性可以实现,但需要付出一些努力。以下是问题:

  1. 同一个正确的地址可以用许多不同的方式拼写,例如" 123 1st Ave"," 123 1st Avenue"," 123 First Ave",依此类推。
  2. 由于大多数地址数据来自人类编写或发音,因此它们容易出现拼写错误和拼写错误,例如: Asbury vs. Ashbury,Jupiter vs. Jupitar等。
  3. 名称中可能有缩写,而不仅仅是街道类型:" Asbury Park" vs." Asbury Prk"。
  4. 地址可能包含可纠正的诚实错误,例如: " 123 N Ash St" vs." 123 Ash St"。
  5. 要克服这些问题并实现地址的唯一性,您需要在存储到数据库之前验证,更正和标准化它们。当您对密钥进行查询时,查询中的计数器地址需要以相同的方式进行清理。我们为此目的提供了一些工具,包括YAddress(由我工作的公司制作)。

    由于各个街道地址在其相应的邮政编码(美国地址)中是唯一的,因此您可以包含街道地址和邮政编码的密钥,为简洁起见省略城市和州。更好的方法是使用由Zip和街道地址列组成的双列主键。这样你就可以获得Zip的额外奖励。