当一个表子到另一个子表时,保持3个表之间的优化参照完整性

时间:2015-04-27 16:10:48

标签: 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::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
);

如何在三者之间保持优化的参照完整性。

假设我有一个国家印度。在印度有北,南,东,西地区和北部地区,我有克什米尔,德里,上,钦奈。

假设,现在我必须将所有地区都改为中国。我怎样才能在州长"表也​​以优化的方式。

请建议任何一个。我怎么能处理这种情况。

1 个答案:

答案 0 :(得分:0)

你通过在国家和州之间加入FK给自己一个问题。没有直接关系:关系是:

  1. 一个州有一个地区
  2. 某个地区有国家/地区
  3. 这确实意味着一个国家也有一个国家,但它不是直接的 - 它是通过地区。

    你实际上对这种关系进行了非规范化。要放入适当的3NF,你需要摆脱州和国家之间的FK,并从州中删除countryId。当你想知道一个国家所处的国家时,你需要通过它所涉及的区域行查看,然后查看该区域与之相关的国家行。

    这似乎不太有效,但它会导致问题,因为你发现如果你不这样做。在实践中,只有当效率低下变得太大时才会进行非规范化 - 系统变得太慢。我从未发现这种特殊类型的关系会产生需要非规范化的问题。