Postgresql

如何設計兩個表:A hasMany B,每個 A 一個 B 的狀態為“活動”?

  • April 21, 2020

圖兩個表:環境和分支。

它們的關係是:一個環境有很多分支。這很容易在分支表中使用環境外鍵。

問題在於添加此約束:環境分支的零個或一個分支可以具有“活動”狀態。

系統將支持這兩個請求:

  1. 給我環境’E’的分支
  2. 給我環境“E”的活動分支

一個解決方案是在環境表中添加“activeBranchFK”,但這會在表之間產生循環依賴,並且看起來不是一個好的解決方案。

另一種解決方案是分支表中的布爾“活動”,但在我看來,如果同一環境的許多分支同時處於活動狀態,我們可能會有不希望的狀態。

你有沒有為這種模式建模?

您可以在表上使用部分唯一索引branches

create table branches
(
 id integer primary key, 
 env_id integer not null references environments,
 active boolean not null,
 ... other columns ...
);

create unique index on branches (env_id) 
where active;

現在對於每個 env_id,可以有許多不同的行帶有active = false,但只有一個帶有active = true.

引用自:https://dba.stackexchange.com/questions/265493