如何以规范化的方式存储邮政地址和政治分歧



是否可以以规范化的方式存储邮政地址和政治划分,以便没有冗余?它应该适用于任何州,即使每个州都需要自己的结构。

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

我能想象的最规范化的方式是创建像国家/地区 -> 州 -> 城市 -> zip -> 地址这样的表。每个"节点"都与下一个表处于一对多关系中。从与国家有一对多关系的国家开始,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

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

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

最新更新