Database design 如何以规范化的方式存储邮政地址和政治分区?

Database design 如何以规范化的方式存储邮政地址和政治分区?,database-design,street-address,Database Design,Street Address,是否有可能以正常化的方式存储邮政地址和政治分区,从而避免冗余?它应该适用于任何国家,即使每个国家都需要自己的结构 这不仅仅是存储地址。我想附上关于城镇等的附加信息。任何东西都可以以规范化的形式存储。第五范式和正交设计原理等工具可用于消除数据库设计中的某些问题。然而,没有任何标准形式声称要消除所有类型的冗余,这样做也不可取,甚至不可行(信息论观点认为冗余是数据中有用的信息) 您可能会发现Party数据模型非常有用: 我能想象到的最规范化的方式是创建国家->州->城市->拉链->地址之类的表。每个“

是否有可能以正常化的方式存储邮政地址和政治分区,从而避免冗余?它应该适用于任何国家,即使每个国家都需要自己的结构

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

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

您可能会发现Party数据模型非常有用:

我能想象到的最规范化的方式是创建国家->州->城市->拉链->地址之类的表。每个“节点”都与下一个表存在一对多关系。从与州有一对多关系的国家开始,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
);
请记住(以及最佳设计实践),数据库中的大多数属性都应该声明为NOTNULL,这主要是因为性能

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

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


我不确定您是否能找到一种适用于国际市场的“一刀切”方案。或者你想要一个只针对一个国家的解决方案?如果是,请指定。@fvu它应该用于多个国家,但不必为每个国家使用相同的表。为什么这里没有人阅读数据模型模式手册?建模本身不是问题。更重要的是,我不知道什么应该在一起。例如:邮政编码能识别什么?根据我的经验,邮政编码在识别任何东西方面的作用都是有限的。您可以实现一些软件或数据库来验证、丰富甚至排除不一致的地址,但即使这样,假设代码是确定地址某一部分的完全可靠的方法也没有什么用处。新代码一直在发布或撤销,甚至官方邮局数据库也不保持一致或最新。请注意,不同的城市可以共享新代码。这取决于我们谈论的国家。但是感谢您的通知。为了避免这个问题,可以将代理密钥添加到zips表中,这样就可以编写尽可能多的重复邮政编码。