我有两张桌子城市和郊区。 Postgresql代码:
CREATE TABLE city
(
id uuid PRIMARY KEY,
name character varying NOT NULL,
CONSTRAINT city_id_key UNIQUE (id),
CONSTRAINT city_name_key UNIQUE (name)
)
CREATE TABLE suburb
(
id uuid PRIMARY KEY,
city_id uuid NOT NULL,
name character varying NOT NULL,
CONSTRAINT fk_suburb_city FOREIGN KEY (city_id) REFERENCES city (id),
CONSTRAINT suburb_id_key UNIQUE (id),
CONSTRAINT suburb_name_key UNIQUE (name)
)
我想创建一个名为address的表来存储城市+郊区对。这是地址表的DDL:
CREATE TABLE address
(
id uuid NOT NULL,
city_name character varying NOT NULL,
suburb_name character varying NOT NULL
)
我想确保只将冗余的信息副本插入到地址中。这是一个例子:
我想允许插入所有city_name suburb_name对的地址:
SELECT c.name AS city_name, s.name AS suburb_name
FROM city c, suburb s
WHERE c.id = s.city_id
结果:
A - B
A - C
X - Y
对于上面的数据,我想允许所有对:
A - B
A - C
X - Y
但如果有人想将A - Y对插入地址,我希望DBMS引发错误/异常。
问题:
检查这样的约束是否有意义?
如果这是一个有效的想法,那么最佳解决方案是什么?触发器,存储过程,某种约束?
我更喜欢DBSM独立解决方案。我对建议的解决方案的基本概念更感兴趣,而不是在postgresql特定的解决方案中。
反映@Yuri G的回答:当我阅读表格地址时,我不想要任何加入。我想在其中存储实际值而不是ID。缓慢插入地址不是问题。快速阅读对我来说很重要。插入地址后,城市或郊区表的变化不是问题。所以不需要在地址表中更新。我只是想确保我插入地址的数据是一个有效的城市 - 郊区对(根据城市和郊区表)。
我的计划是上传包含大量数据的城市和郊区表格,并使用它们来验证地址表中的插入内容。我不想让我的用户插入地址,例如:“New York - Fatima bint Mubarak St”,因为Fatima bint Mubarak St.在阿布扎比。
感谢您的回答。
答案 0 :(得分:0)
让客户端的软件操作City&的记录标识符。郊区,而不是他们的价值观。
在服务器端也这样做:
CREATE TABLE address
(
id uuid NOT NULL,
city_id character varying NOT NULL,
suburb_id character varying NOT NULL,
CONSTRAINT fk_city FOREIGN KEY (city_id) REFERENCES city (id),
CONSTRAINT fk_suburb FOREIGN KEY (suburb_id) REFERENCES suburb (id),
)
当然,在插入之前你需要进行2次查找操作,基本上是按城市/郊区的名称选择两个,以检索这些ID(或拒绝操作)。
通过这种方式,您可以保持数据完整性最简单&有效的方式,我相信。