Postgresql
如何設計兩個表:A hasMany B,每個 A 一個 B 的狀態為“活動”?
圖兩個表:環境和分支。
它們的關係是:一個環境有很多分支。這很容易在分支表中使用環境外鍵。
問題在於添加此約束:環境分支的零個或一個分支可以具有“活動”狀態。
系統將支持這兩個請求:
- 給我環境’E’的分支
- 給我環境“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
.