Sql 当一个表子对象与另一个表子对象发生冲突时,在3个表之间保持优化的引用完整性
假设我们有3个表,如下所示-Sql 当一个表子对象与另一个表子对象发生冲突时,在3个表之间保持优化的引用完整性,sql,postgresql,Sql,Postgresql,假设我们有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::
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
);
如何在三者之间保持优化的引用完整性
假设我有一个国家印度。在印度有北、南、东、西四个地区,在北部地区我有克什米尔、德里、上、钦奈
假设,现在我必须将所有地区都改为中国。我如何在statemaster表中以优化的方式反映它
请推荐任何人。我如何处理这种情况。你在国家和州之间设置了一个FK,这给自己带来了一个问题。没有直接关系:这种关系是: 一个国家有一个地区 一个地区有一个国家 这确实意味着一个州也有一个国家,但它不是直接的,而是通过地区 实际上,你已经将这种关系非规范化了。要输入正确的3NF,您需要去掉州和国家之间的FK,并从州中删除countryId。当你想知道一个州所在的国家时,你需要通过它所涉及的地区行,然后是该地区所涉及的国家行来查看
遗憾的是,这似乎效率较低,但如果不这样做,确实会造成问题。在实践中,非规范化只有在低效率增长过大时才能实现——系统变得太慢。我从未发现这种特殊类型的关系会出现需要反规范化的问题。你好,朋友,我知道这种结构不在3NF中,因为我们需要这样一个系统。因为在我们的系统中,一个州可能在一个地区之下,也可能不在一个国家之下,但必须在一个国家之下,所以我必须将外键与国家放在一起。希望你现在能理解我的问题。我可以这样做的一种方法是在每个国家下添加一个“未知”或“无区域”或任何区域,然后将该区域内没有区域的州与该国联系起来。