【问题标题】:Designing a quick-lookup address database设计快速查找地址数据库
【发布时间】:2013-09-02 02:24:47
【问题描述】:

如果我要在 MySQL 中按照以下规范设计数据库:

1) 超过 2500 万条记录

2) 门牌号、街道、城镇、城市、邮政编码列

3) 街道、城镇、城市和邮政编码需要可全文搜索(在前端,搜索将在 AJAX 上运行,文本输入字段会立即出现下拉结果)

我将如何设计上述内容?

我正在考虑使用单个表 - 这是一个坏主意吗?鉴于这是地址数据,我不确定是否要跨不同的表进行规范化。我还想,如果使用单个表,我会在可搜索字段中创建 FULLTEXT 索引。

我以前没有使用过这么大的数据库。以上是个坏主意吗?


更新 #1:

决定对街道和邮政编码列进行规范化,这些列是实际搜索的唯一列(重新检查了原始规范)。做了一些快速的数学运算,街道名称的基数是总数据集的 2% 和邮政编码 6%,所以我认为这是最好的前进方式。

目前正在运行 2900 万行的导入 - 大约需要 5 小时。为了结束这个问题,稍后将再次更新性能测试。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您的设计听起来很合理。但。您确定数据库中的地址都符合“,,”格式吗? “c/o”地址(“care/of”)呢?单元/公寓/楼层/套房号?具体的建筑物名称(“巴拉克奥巴马,白宫,华盛顿特区”)呢?

    在美国,这种地址布局有多种例外情况。例如,有一种叫做“乡村路线”的东西,其格式是“RR BOX”(描述为here)。有邮政信箱和军事地址。事实上,我刚刚得知美国邮局有一份出版物描述了各种不同的地址格式 (here)。

    更通用的形式是“Address Line 1”、“Address Line 2”、“City”、“Post Code”。有一些服务可以将世界大部分地区的地址标准化,甚至还有可用于此目的的软件。

    您使用全文搜索的想法是个好主意。例如,在查找街道名称的部分匹配时,它会快得多。

    【讨论】:

    • 感谢您的反馈。如果你觉得值得一试,那我就试一试。我对古怪的地址并不那么在意——我主要关心的是查找的速度,因为它需要近乎实时地发生(以响应在输入字段中输入的字符)。我不想花时间导入数据和构建索引,而不知道在单表和 FULLTEXT 设计中性能是否足够。
    • @RC 。 . .让我说。这是合理的,值得一试。 但是对于 2500 万个地址的实时响应,您可能需要更多自定义代码。例如,谷歌做了一些相当复杂的事情来支持它的实时查询建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多