Bu düzen ile bir tablo var:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Buna benzer benzersiz bir kısıtlama oluşturmak istiyorum:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Ancak bu aynı olan birden fazla satır sağlayacaktır (UserId, RecipeId)
eğer MenuId IS NULL
. Ben izin vermek istediğiniz NULL
yer MenuId
yok menü ilişkilendirdiği bir sık saklamak için, ama sadece kullanıcı / reçete çifti başına bu satırlardan en az birini istiyorum.
Şimdiye kadar sahip olduğum fikirler:
Null yerine sabit kodlanmış bir UUID (tüm sıfırlar gibi) kullanın.
Ancak,MenuId
her kullanıcının menülerinde bir FK kısıtlaması vardır, bu yüzden bir güçlük olan her kullanıcı için özel bir "boş" menü oluşturmak zorunda kalacaktım.Bunun yerine bir tetikleyici kullanarak boş bir giriş olup olmadığını kontrol edin.
Bence bu bir güçlük ve mümkün olan yerlerde tetikleyicilerden kaçınmayı seviyorum. Ayrıca, verilerimin hiçbir zaman kötü durumda olmadığını garanti etmelerine güvenmiyorum.Sadece unutun ve orta eşyada veya bir ekleme işlevinde boş bir girdinin önceki varlığını kontrol edin ve bu kısıtlamaya sahip değilsiniz.
Postgres 9.0 kullanıyorum.
Göz ardı ettiğim bir yöntem var mı?
UserId
,RecipeId
) ile birden fazla satıra izin verirMenuId IS NULL
?