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。所以我想知道:
在适当的地方使用触发器来创建 fkey 链接是否更可取?
仅仅在预期的地方加入就足够了吗?如果给一台计算机分配了一个错误的 IP 地址,它就不会从 dhcp 服务器获得一个,我们很快就会知道这一点。(写入触发通知,触发相关 dhcp 服务器上的更新)
还有其他更好的方法吗?
为了在这里回答我自己的问题,这是我最终所做的:
函数 ip_block(inet) 查找 inet 地址的 ip 块记录。
检查约束以确保对于适当的地址类别返回不为空。这将在插入或更新分配表时触发。
触发函数检查块中地址的分配表,并在发现此类情况时引发 RI 异常。
当 ip 块的 block_def 更新或 ip 块被删除时,触发运行上述函数。
我将暂时不接受这个答案,看看其他人是否有更好的方法。然而,实际执行此操作的代码量比预期少得多,所以到目前为止我对此非常满意。
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |