이 레이아웃이있는 테이블이 있습니다.
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
다음과 유사한 고유 제약 조건을 만들고 싶습니다.
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
그러나 이렇게하면 (UserId, RecipeId)
if 가 동일한 여러 행이 허용 됩니다 MenuId IS NULL
. 내가 허용 할 NULL
에 MenuId
어떤 메뉴를 관련 지을 수있는 즐겨 찾기를 저장하지만, 난 단지 사용자 / 조리법 쌍 당이 행의 대부분 하나를 원한다.
지금까지 내가 가진 아이디어는 다음과 같습니다.
null 대신 하드 코딩 된 UUID (예 : 모든 0)를 사용하십시오.
그러나MenuId
각 사용자의 메뉴에 FK 제약이 있으므로 번거로운 모든 사용자에 대해 특별한 "널"메뉴를 만들어야합니다.대신 트리거를 사용하여 널 항목이 있는지 확인하십시오.
나는 이것이 번거롭고 가능한 한 트리거를 피하는 것을 좋아합니다. 또한 데이터가 결코 나쁜 상태에 있지 않다는 것을 보증하지 않습니다.이를 잊고 미들웨어 또는 삽입 함수에 널 항목이 존재하는지 점검하십시오.이 제한 조건이 없습니다.
Postgres 9.0을 사용하고 있습니다.
내가 간과하는 방법이 있습니까?
UserId
,RecipeId
) 의 여러 행을 허용하는 이유는 무엇MenuId IS NULL
입니까?