假设我们有3个表如下 -
CREATE TABLE countrymaster
(
id serial NOT NULL,
country character varying(255) NOT NULL,
currency character varying(255) NOT NULL,
created_on character varying(255) NOT NULL,
updated_on character varying(255) DEFAULT NULL::character varying,
idcompany integer NOT NULL,
iduser integer NOT NULL,
status status DEFAULT '1'::status,
CONSTRAINT countrymaster_pkey PRIMARY KEY (id),
CONSTRAINT countrymaster_idcompany_fkey FOREIGN KEY (idcompany)
REFERENCES companies (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT countrymaster_iduser_fkey FOREIGN KEY (iduser)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE TABLE regionmaster
(
id serial NOT NULL,
region_name character varying(255) NOT NULL,
region_code character varying(255) NOT NULL,
created_on character varying(255) NOT NULL,
updated_on character varying(255) DEFAULT NULL::character varying,
idcountry integer NOT NULL,
idcompany integer NOT NULL,
iduser integer NOT NULL,
status status DEFAULT '1'::status,
CONSTRAINT regionmaster_pkey PRIMARY KEY (id),
CONSTRAINT regionmaster_idcompany_fkey FOREIGN KEY (idcompany)
REFERENCES companies (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT regionmaster_idcountry_fkey FOREIGN KEY (idcountry)
REFERENCES countrymaster (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT regionmaster_iduser_fkey FOREIGN KEY (iduser)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
CREATE TABLE statemaster
(
id serial NOT NULL,
state_name character varying(255) NOT NULL,
created_on character varying(255) NOT NULL,
updated_on character varying(255) DEFAULT NULL::character varying,
idcountry integer NOT NULL,
idregion integer,
idcompany integer NOT NULL,
iduser integer NOT NULL,
status status DEFAULT '1'::status,
CONSTRAINT statemaster_pkey PRIMARY KEY (id),
CONSTRAINT statemaster_idcompany_fkey FOREIGN KEY (idcompany)
REFERENCES companies (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT statemaster_idcountry_fkey FOREIGN KEY (idcountry)
REFERENCES countrymaster (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT statemaster_idregion_fkey FOREIGN KEY (idregion)
REFERENCES regionmaster (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT statemaster_iduser_fkey FOREIGN KEY (iduser)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
如何在三者之间保持优化的参照完整性。
假设我有一个国家印度。在印度有北,南,东,西地区和北部地区,我有克什米尔,德里,上,钦奈。
假设,现在我必须将所有地区都改为中国。我怎样才能在州长"表也以优化的方式。
请建议任何一个。我怎么能处理这种情况。
答案 0 :(得分:0)
你通过在国家和州之间加入FK给自己一个问题。没有直接关系:关系是:
这确实意味着一个国家也有一个国家,但它不是直接的 - 它是通过地区。
你实际上对这种关系进行了非规范化。要放入适当的3NF,你需要摆脱州和国家之间的FK,并从州中删除countryId。当你想知道一个国家所处的国家时,你需要通过它所涉及的区域行查看,然后查看该区域与之相关的国家行。
这似乎不太有效,但它会导致问题,因为你发现如果你不这样做。在实践中,只有当效率低下变得太大时才会进行非规范化 - 系统变得太慢。我从未发现这种特殊类型的关系会产生需要非规范化的问题。