构建邮政编码的数据库表

时间:2012-11-19 16:03:34

标签: mysql database-design

我正在尝试构建一个包含邮政编码数据的数据库表(稍后在我的应用程序中引用)。

我抓取http://www.populardata.com/zipcode_database.html.csv文件,该文件包含以下数据:

  • 拉链
  • 纬度
  • 经度
  • 城市
  • 状态
  • zip_class

到目前为止我尝试的是:

CREATE TABLE `finder_zip_codes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `zip` mediumint(128) DEFAULT '0',
  `latitude` varchar(128) DEFAULT NULL,
  `longitude` varchar(128) DEFAULT NULL,
  `city` varchar(128) DEFAULT NULL,
  `state` varchar(128) DEFAULT NULL,
  `county` varchar(128) DEFAULT NULL,
  `zip_class` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

但是因为我是MySQL的新手,所以最好的做法等等都悄悄告诉我。例如,zip表似乎剥离了邮政编码的开头。我查看了ZEROFILL,但我不认为'我想要的是什么,我基本上想要使用zip作为int字段,但是不能自动更正其中的数据(或者截断它)。

任何帮助都会非常感激 - 我一直在尝试一些doc网站,这是我到目前为止所提出的 - 所以任何额外的提示都会很棒。谢谢!

4 个答案:

答案 0 :(得分:3)

您可能想要将邮政编码存储为整数字段,因为它实际上不是整数。它看起来像一个,但对它执行整数运算是没有意义的(例如,你永远不会12034 + 32523 - 这将是荒谬的。)

最好将其存储为char(5)字段,因为它实际上就是这样 - 一个5个字符的字符串,恰好被限制为只包含数字。

修改

LatitudeLongitude可以存储为数字数据类型(可能是十进制或双精度),因为它们实际数字:)

答案 1 :(得分:1)

整数的存储方式与数字相同。最有可能的是,它不是“剥离” - 您用来查看表格的界面正在删除前导零以使其对人类友好。

同样,当您在屏幕或报告上生成零时,也应该使用零填充。

答案 2 :(得分:0)

我们经常收到这个问题,因为我们销售邮政编码数据。默认情况下,Microsoft产品会删除前导零和波多黎各,新英格兰和部分新泽西邮政编码有一个或多个前导零。我在SQL中看到的最好方法是使用:RIGHT(100000 + zip,5)。

这也适用于墨西哥邮政编码和您想要前导零的任何整数。您只需更改逗号后的零数和整数表达式。例如,如果您需要一个6位数的支票号字段,那么您将拥有前导零:RIGHT(1000000 + check_num,6)

答案 3 :(得分:0)

看来你限制了美国的邮政编码。您可能也想考虑外国邮政编码。在这种情况下,您需要重新构建数据库架构以包含国家/地区。这将需要多个表(规范化)以及表之间的外键关联。示例:country_id和state_id。

此外,国家/地区的邮政编码格式也不同。参考:http://en.wikipedia.org/wiki/List_of_postal_codes

我建议你为表名提供一个更有意义的名称,而不是finder_zip_codes。我们通常不使用复数形式的表名(删除尾随's')。此外,表名应为名词,'finder'表示动词。更好的名称是usa_zip_code。

此外,主键通常是表的名称,后跟'id'。示例:usa_zip_code_id。这样,当你将另一个表中的usa_zip_code_id作为外键时,你会立即知道它所引用的表。最后,考虑哪些列不应为null和/或唯一。