假裝我有一個用戶表,其中用戶是一個特定租戶的成員,他們的電子郵件是唯一收錄到自己的房客,是這樣的:Postgres的條件唯一約束
User
id | tenant_id | email
1 1 [email protected]
2 1 [email protected]
該用戶被允許的,因爲儘管一個重複的電子郵件,它們是在不同承租人:
3 2 [email protected]
防止該用戶,因爲電子郵件是在相同的租戶重複:
4 2 [email protected] <--- will throw an error
我們有這麼多的獨特索引 - 這部分很簡單。
現在假裝我希望能夠添加一個可以訪問所有租戶的全局用戶,但前提是電子郵件根本不存在於表中。另外,一旦記錄存在,沒有其他人 - 無論是否出租 - 都可以使用相同的電子郵件。
爲了清楚起見,全球用戶可能只是有一個空的租戶ID,但我們也可能會添加一個global
布爾值。
有沒有辦法爲這個邏輯寫約束?您不能簡單地使電子郵件在全球範圍內受到限制,因爲它們無法在租戶之間重複使用,並且如果您使用空的租戶ID進行索引,則postgres將允許未安裝的用戶(如果租借的用戶具有相同的e -郵件。
我查看了排除約束和檢查,但無法弄清楚如何組合它們(如果tenant_id爲空,則唯一地限制全局電子郵件,並在插入時檢查具有空租戶ID和匹配電子郵件的記錄任何記錄)。
請不要問我爲什麼這樣做,讓 - 我的表是不實際的用戶和我們已經考慮並駁回其他架構:)
提前感謝!
爲什麼不通過(電子郵件,租戶)的唯一索引? – McNets
正如我所說的「他們的電子郵件是唯一索引給他們的租客的」 - 我們已經涵蓋了第一部分,這很容易。問題是關於第二部分。 – tekunokurato