我正在創建一個PostgreSQL數據庫:Country - Province - City。 一個城市必須屬於一個國家,可以屬於一個省份。 一個省必須屬於一個國家。 一個城市可以是一個國家的資本:在PostgreSQL中實現沒有觸發器的複雜引用
CREATE TABLE country (
id serial NOT NULL PRIMARY KEY,
name varchar(100) NOT NULL
);
CREATE TABLE province (
id serial NOT NULL PRIMARY KEY,
name varchar(100) NOT NULL,
country_id integer NOT NULL,
CONSTRAINT fk_province_country FOREIGN KEY (country_id) REFERENCES country(id)
);
CREATE TABLE city (
id serial NOT NULL PRIMARY KEY,
name varchar(100) NOT NULL,
province_id integer,
country_id integer,
CONSTRAINT ck_city_provinceid_xor_countryid
CHECK ((province_id is null and country_id is not null) or
(province_id is not null and country_id is null)),
CONSTRAINT fk_city_province FOREIGN KEY (province_id) REFERENCES province(id),
CONSTRAINT fk_city_country FOREIGN KEY (country_id) REFERENCES country(id)
);
CREATE TABLE public.capital (
country_id integer NOT NULL,
city_id integer NOT NULL,
CONSTRAINT pk_capital PRIMARY KEY (country_id, city_id),
CONSTRAINT fk_capital_country FOREIGN KEY (country_id) REFERENCES country(id),
CONSTRAINT fk_capital_city FOREIGN KEY (city_id) REFERENCES city(id)
);
對於一些(但不是全部)的國家,我將有省的數據,所以一個城市將屬於一個省,全省的國家。其餘的,我只知道這個城市屬於一個國家。
問題1:關於我所在的國家有省數據,我一直在尋找一種解決方案,它將不允許一個城市屬於一個國家,同時又屬於不同國家的一個省份。
我傾向於通過檢查約束強制執行,即省或國家(但不是兩個)在城市中不爲空。看起來像一個整潔的解決方案。
另一種方法是在城市內保留省和國家的信息,並通過觸發器強制執行一致性。
問題#2:我想禁止一個城市是一個不屬於它的國家的首都。在我的問題#1的解決方案之後,這似乎是不可能的,因爲沒有辦法直接引用一個城市所屬的國家。
也許問題1的替代解決方案更好,它也簡化了未來的查詢。
城市,省份和國家(以及縣也應該是抽象地緣政治區的凝結物)。使用表繼承。 –