Ho una tabella con questo layout:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Voglio creare un vincolo unico simile a questo:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Tuttavia, ciò consentirà più righe con lo stesso (UserId, RecipeId)
, se MenuId IS NULL
. Voglio permettere NULL
a MenuId
memorizzare un favorito quel menu non ha alcun associato, ma voglio solo al massimo una di queste righe per coppia utente / ricetta.
Le idee che ho finora sono:
Usa un UUID hardcoded (come tutti gli zeri) invece di null.
Tuttavia,MenuId
ha un vincolo FK nei menu di ogni utente, quindi dovrei creare uno speciale menu "null" per ogni utente che è una seccatura.Verificare l'esistenza di una voce null utilizzando invece un trigger.
Penso che questa sia una seccatura e mi piace evitare i trigger laddove possibile. Inoltre, non mi fido di loro per garantire che i miei dati non siano mai in cattivo stato.Basta dimenticarsene e verificare l'esistenza precedente di una voce null nel middleware o in una funzione di inserimento e non avere questo vincolo.
Sto usando Postgres 9.0.
C'è qualche metodo che sto trascurando?
UserId
,RecipeId
), seMenuId IS NULL
?