避免在数据库表中重复地址

时间:2009-05-15 03:50:46

标签: database database-design

我只是想在一个表中存储一次街道地址时避免重新发明轮子。在某些常见情况下,唯一性约束不起作用:

100 W 5th Ave
100 West 5th Ave
100 W 5th

200 N 6th Ave Suite 405
200 N 6th Ave  #405

我可以实现一些业务逻辑或触发器来规范化所有字段,然后在表中的几个字段中插入和使用唯一性约束,但是很容易错过某些与街道地址不同的情况。

最好的是每个地址的通用标识符,可能基于GPS坐标。在存储新地址之前,请查找其GUID并查看地址表中是否已存在GUID。

Mapquest,Postal Serice,FedEx或美国政府等组织可能都有这样的系统。

有没有人找到一个很好的解决方案?

现在这是我的地址表(由JPA生成):

CREATE TABLE address
(
  id bigint NOT NULL,
  "number" character varying(255),
  dir character varying(255),
  street character varying(255),
  "type" character varying(255),
  trailingdir character varying(255),
  unit character varying(255),
  city character varying(255),
  state character varying(255),
  zip integer,
  zip4 integer,
  CONSTRAINT address_pkey PRIMARY KEY (id)
)

4 个答案:

答案 0 :(得分:4)

在Google地图中查找地址并使用他们使用的拼写。

答案 1 :(得分:0)

您需要支持语法等正则表达式。您可以提出某种自动机功能,它将解析令牌并尝试匹配它们,然后将它们扩展或缩小为缩写。我会研究一下glob()函数来支持*?在unix上作为一个快速的脏修复。

答案 2 :(得分:0)

我不是在寻找地址验证或规范化,尽管地址验证是一个好主意。我需要每个街道地址的唯一标识符,以避免重复记录。

看起来地理编码可以提供解决方案。通过地理编码,输入可以是街道地址,输出将是纬度和经度坐标,具有足够的精度来解析特定建筑物。

街道地址模糊的问题比我想象的更严重。这是来自维基百科的地理编码页面:

“......在马萨诸塞州的波士顿有多条100条华盛顿街道,因为有几个城市在不改变街道名称的情况下被吞并。”

关于地理编码的维基百科页面有一个资源列表(许多免费)来执行地理编码。

答案 3 :(得分:0)

由于其良好的网络服务界面并且易于注册,我选择了USC WebGIS服务。

但是,由于多种原因,地理编码不适合作为街道地址的唯一密钥。例如,地理编码无法区分共管公寓大楼或公寓楼中的不同单元。

我决定使用地理编码结果中的解析地址,并对街道号码,街道名称,单位,城市,州和邮政编码设置唯一约束。它并不完美,但它适用于我正在做的事情。