【问题标题】:How to store postal addresses and political divisions in a normalized way?如何以规范的方式存储邮政地址和政治分区?
【发布时间】:2012-10-07 10:09:11
【问题描述】:

是否可以以标准化方式存储邮政地址和政治区划,从而避免冗余?它应该适用于任何州,即使每个州都需要自己的结构。

这不仅仅是存储地址。我想附上有关城镇等的其他信息。

【问题讨论】:

  • 我不确定您能否找到一种适合所有国际通用的尺寸。或者你想要一个只针对一个国家的解决方案?如果有,请说明。
  • @fvu 应该针对多个国家/地区,但不必为每个国家/地区使用相同的表格。
  • 为什么这里没人看数据模型模式书?

标签: database-design street-address


【解决方案1】:

我能想象的最规范化的方式是创建表格,例如国家 -> 州 -> 城市 -> 邮编 -> 地址。每个“节点”都与下一个表存在一对多的关系。从与州有一对多关系的国家开始,DDL 将如下所示:

CREATE TABLE countries (
    country_id integer NOT NULL,
    name character varying(80) NOT NULL,
    symbol_3 character(3),  -- i meant ISO-code
    symbol_2 character(2),  -- ISO -code as well
    citizenship character varying(50) -- not obligatory in my case
);

CREATE TABLE states (
    state_id integer NOT NULL,
    country_id integer NOT NULL,
    name character varying(50) NOT NULL
);

CREATE TABLE cities (
    city_id integer NOT NULL,
    state_id integer NOT NULL,
    name character varying(80) NOT NULL
);

CREATE TABLE zips (
    zip_id integer NOT NULL,
    city_id integer NOT NULL,
    number character(5) NOT NULL
);

CREATE TABLE addresses (
    address_id integer NOT NULL,
    zip_id integer NOT NULL,
    street text NOT NULL,
    notes text
);

请记住(以及最佳设计实践)数据库中的大多数属性应声明为 NOT NULL,主要是因为性能。

并回答您的下一个问题(如果您还没有弄清楚)zip 应该存储为字符类型 - 而不是您的数据库支持的几种数字数据类型之一。为什么?因为您不想在邮政编码的开头填写零或 ziros。数值类型只是截断数字前面的零。

有用的图表显示了我的意思:

http://blog.blueage-software.com/pics/blog-images/ERD_country_province.jpg

【讨论】:

  • 请注意不同城市可以共享same zip code
  • 这取决于我们谈论的是哪个国家。不过谢谢你的通知。
  • 为了避免这个问题,可以在 zips 表中添加代理键,这样就可以编写尽可能多的重复邮政编码。
【解决方案2】:

任何东西都可以以规范化的形式存储。第五范式和正交设计原则等工具可用于消除数据库设计中的某些类型的问题。然而,没有范式声称可以消除所有类型的冗余,这样做也不是可取的,甚至是不可能实现的(信息论的观点是,冗余是一条数据中的有用信息)。

您可能会发现派对数据模型很有帮助: http://www.tdan.com/view-articles/5014/

【讨论】:

  • 建模本身不是问题。更多的是我不知道什么属于一起。例如:邮政编码标识什么?
  • 根据我的经验,邮政编码在识别任何东西方面的​​作用有限。您可以实现一些软件或数据库来验证、丰富甚至排除不一致的地址,但即便如此,假设代码是确定地址某些部分的完全可靠的方法也没什么用。新代码一直在发布或撤回,甚至官方邮局数据库也无法保持一致或最新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多