“灵活”外键约束

1 postgresql database-design

我们有一个 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),这是我目前最好的后备选项。

a_h*_*ame 6

我根本不认为需要多个阶段表(提示:如果列或表上的数字不断增加,则可能违反了规范化规则)。

我将创建一个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表中添加新行。

  • @K.Mooijman:你为什么认为那些“必须”是不同的表?根据给出的信息,这绝对没用(而且是错误的)。你应该在你的问题中提供**真正的**问题,而不是一些导致完全不同解决方案的过度简化的结构(但我想不出任何可以保证超过一个阶段表的东西 - 这似乎完全违反1NF) (4认同)