我们有一个 Postgres 设置,其中包含多个表,代表项目的不同部分和阶段,目前有 4 个,但将来可能会更多。我们想要制作一个Task
带有这些表中任何一个的外键的表。最好是这样的:
CREATE TABLE stage1(
id SERIAL PRIMARY KEY,
description TEXT);
CREATE TABLE stage2 (
id SERIAL PRIMARY KEY,
description TEXT);
CREATE TABLE stage4 (
id SERIAL PRIMARY KEY,
description TEXT);
CREATE TABLE task (
id SERIAL PRIMARY KEY,
description TEXT,
foreignkey_table VARCHAR(20),
foreignkey_id INTEGER);
Run Code Online (Sandbox Code Playgroud)
其中命名的列foreignkey_table
可以指示“父”表,并且foreignkey_id
将指示“父 ID”。
这些阶段 1 到 3 是为了使示例简单,但它们绝不能合并为一个。将它们视为“准备阶段”、“执行阶段”和“评估阶段”。或者作为完全不同的表格,如“用户”、“公司”和“活动”,每个表格都有自己特定的不重叠内容。
我怎样才能做到这一点?
我读过一些帖子,说这是不可能的,但它们已经很旧了,所以我希望在这些帖子之后实施解决方案。我还在Constraint for multiple foreign key上找到了一个潜在的解决方案,但它是互斥的 (PostgreSQL),这是我目前最好的后备选项。
我根本不认为需要多个阶段表(提示:如果列或表上的数字不断增加,则可能违反了规范化规则)。
我将创建一个stage
包含以下信息的表:
CREATE TABLE stage
(
id SERIAL PRIMARY KEY,
level integer not null check (level between 1 and 4),
description TEXT
);
CREATE TABLE task
(
id SERIAL PRIMARY KEY,
description TEXT,
stage_id integer references stage
);
Run Code Online (Sandbox Code Playgroud)
如果您将来有新的阶段,您需要做的就是向stage
表中添加新行。