可选父/子关系表

Nor*_*sen 3 postgresql foreign-key database-design

假设我们有下表:Item、Parent、Child 和 Parent 是 child 的父级。

该项目可以属于父项或子项,但不能同时属于两者。

我还有其他类似于 Item 的表,它们也可以属于父级或子级。

我应该简单地向它们添加 2 个可为空的 FK 吗?

我可以强制使用 db 必须存在父级或子级吗?

Erw*_*ter 8

您概述的解决方案是一个有效的选择 - 假设一件物品在任何给定时间只能属于一个

PostgreSQL 中,您可以使用简单的CHECK约束在两个 fk 列之间强制互斥:

Parent 或 Child 必须存在

...您可以添加一个简单的CHECK约束:

CHECK (a IS NOT NULL OR b IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)

将要求至少一NOT NULL列-也让这两个parent_id child_id存在。如果您也想禁止这样做,请执行以下操作:

CHECK (a IS NOT NULL AND b IS NULL OR b IS NOT NULL AND a IS NULL)
Run Code Online (Sandbox Code Playgroud)