我正在尝试数据库参照完整性,我有些疑惑。我有一个使用复合键的设计,它具有参照完整性,但我发现复合键可能很难在应用程序级别处理。
下表是一个简化,我有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个或更多空格。
鉴于这些表格如何确保参照完整性,以便空间只能与属于同一组织的发票系列相关联?