不使用组合键的{3}表之间的参照完整性

时间:2017-05-24 14:43:19

标签: sql postgresql database-design 3nf

我正在尝试数据库参照完整性,我有些疑惑。我有一个使用复合键的设计,它具有参照完整性,但我发现复合键可能很难在应用程序级别处理。

下表是一个简化,我有4和5列的表作为复合键。有完整的参考完整性,它是一个堡垒,它具有很多学术意义,但作为一个务实的程序员,我认为这将是一个应用程序级别的兔子洞。所以我想知道如果有可能的话,如何使用代理键,同时仍然保持参照完整性,那么架构是什么样的。

使用复合键的简化模式如下所示:

CREATE TABLE organisations (
  id integer NOT NULL,
  name character varying NOT NULL
);
ALTER TABLE ONLY organisations ADD CONSTRAINT organisations_pkey PRIMARY KEY (id);

CREATE TABLE invoice_series (
  natural_key varying NOT NULL,
  organisation_id integer NOT NULL
);
ALTER TABLE ONLY invoice_series ADD CONSTRAINT invoice_series_pkey PRIMARY KEY (organisation_id, natural_key);

CREATE TABLE spaces (
  natural_key integer NOT NULL,
  organisation_id integer NOT NULL
  invoice_serie_id integer NOT NULL
);
ALTER TABLE ONLY spaces ADD CONSTRAINT spaces_pkey PRIMARY KEY (organisation_id, natural_key);
ALTER TABLE ONLY spaces ADD CONSTRAINT fk_spaces_org FOREIGN KEY (organisation_id, natural_key) REFERENCES invoice_series

没有复合键的简化架构如下所示:

CREATE TABLE organisations (
  id integer NOT NULL,
  name character varying NOT NULL
);

CREATE TABLE invoice_series (
  id integer NOT NULL,
  organisation_id integer NOT NULL,
);

CREATE TABLE spaces (
  id integer NOT NULL,
  organisation_id integer NOT NULL
  invoice_serie_id integer NOT NULL
);

我可以这样做:

execute "ALTER TABLE spaces ADD CONSTRAINT fk_rails_invoice_serie_spaces FOREIGN KEY (organisation_id, invoice_serie_id) REFERENCES invoice_series;"

但这会迫使我在invoice_series上添加一个唯一索引:organisation_id和:id。这对我来说似乎是一个非常奇怪的索引。

什么是更好的方法?

-

组织可能有0个或更多空格 空间属于一个组织

组织有1个或多个发票系列 发票系列属于一个组织

空间有一个发票系列 发票系列可能属于0个或更多空格。

鉴于这些表格如何确保参照完整性,以便空间只能与属于同一组织的发票系列相关联?

0 个答案:

没有答案