【发布时间】:2021-04-16 19:50:16
【问题描述】:
所以,我的任务是建立一个新的数据库来处理服务器补丁。我仍处于设计阶段,无法找到答案来回答这个问题,所以我正在寻求帮助。
到目前为止:
CREATE TABLE servers (
name varchar(50) PRIMARY KEY,
patch_id varchar(10) REFERENCES patch_info(id) NOT NULL,
env varchar(5),
...
)
CREATE TABLE patch_info (
id varchar(10) PRIMARY KEY,
patch_time timestamptz NOT NULL,
reboot_time timestamptz NOT NULL,
)
CREATE TABLE patch_data (
id big serial PRIMARY KEY,
name varchar(50),
patch_id varchar(10),
env varchar(5),
FOREIGN KEY (name, patch_id, env) REFERENCES servers (name, patch_id, env) NOT NULL ON UPDATE CASCADE ON DELETE CASCADE
)
我的问题是,如果我更新服务器表中的 patch_id,会有什么行为。 patch_info 表基本上只包含由其他表中的 id 值引用的补丁/重启时间标识符的完整列表。当更新 id 以反映当月的时间/日期时,实际的 patch_info 表本身每月只会更改一次,但是各个服务器会经常每月更改其时间,因此当服务器表中的 patch_id 字段更改时该更改需要向下级联到 patch_data 表。
另一个问题是关于 ON DELETE 选项的。如果实际的 server.name 字段被删除,我希望 patch_data 表级联删除,但如果 patch_id 为 null 或已删除,则不会。这是我的 ON CASCADE ON DELETE 语句的当前行为还是我可以在两个单独的外键中使用 patch_data.name 列?
感谢您的帮助。
【问题讨论】:
标签: sql database postgresql