外键或不外键..... (inet -> cidr)

Chr*_*ers 5 postgresql database-design

下面是我正在处理的一个项目的一个非常精简的版本。

CREATE TABLE cidr_block (
    id serial not null unique,
    block_def cidr primary key,
    dhcp_server_id int not null references computer_system (id),
    ...
);
CREATE TABLE ip_addr (
    computer_id int not null references computer_system (id),
    mac_addr macaddr not null unique,
    ip_addr inet not null unique,
);
Run Code Online (Sandbox Code Playgroud)

这是一个网络配置数据库。现在,预计大多数(但不是全部)ip_addr.ip_addr 记录将位于 cidr_block.block_def 块中。其他可能是外部链接到客户位置的 vpn 接口可能不是。没有简单的声明性方法来确保两个表之间适用行的 fkey。所以我想知道:

  1. 在适当的地方使用触发器来创建 fkey 链接是否更可取?

  2. 仅仅在预期的地方加入就足够了吗?如果给一台计算机分配了一个错误的 IP 地址,它就不会从 dhcp 服务器获得一个,我们很快就会知道这一点。(写入触发通知,触发相关 dhcp 服务器上的更新)

  3. 还有其他更好的方法吗?

Chr*_*ers 1

为了在这里回答我自己的问题,这是我最终所做的:

  1. 函数 ip_block(inet) 查找 inet 地址的 ip 块记录。

  2. 检查约束以确保对于适当的地址类别返回不为空。这将在插入或更新分配表时触发。

  3. 触发函数检查块中地址的分配表,并在发现此类情况时引发 RI 异常。

  4. 当 ip 块的 block_def 更新或 ip 块被删除时,触发运行上述函数。

我将暂时不接受这个答案,看看其他人是否有更好的方法。然而,实际执行此操作的代码量比预期少得多,所以到目前为止我对此非常满意。