मेरे पास इस लेआउट वाली एक तालिका है:
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)
, यदि MenuId IS NULL
। मैं अनुमति देना चाहते हैं NULL
में MenuId
एक पसंदीदा कोई संबंधित किया जाता है कि मेनू स्टोर करने के लिए है, लेकिन मैं केवल प्रति उपयोगकर्ता / नुस्खा जोड़ी इन पंक्तियों की अधिकतम एक बार चाहता हूँ।
मेरे पास अब तक के विचार हैं:
अशक्त के बजाय कुछ हार्ड-कोडेड यूयूआईडी (जैसे सभी शून्य) का उपयोग करें।
हालांकि,MenuId
प्रत्येक उपयोगकर्ता के मेनू पर एक FK बाधा है, इसलिए मुझे हर उपयोगकर्ता के लिए एक विशेष "अशक्त" मेनू बनाना होगा जो एक परेशानी है।इसके बजाय ट्रिगर का उपयोग करके एक अशक्त प्रविष्टि के अस्तित्व की जांच करें।
मुझे लगता है कि यह एक परेशानी है और मुझे जहां भी संभव हो ट्रिगर से बचना पसंद है। इसके अलावा, मुझे भरोसा नहीं है कि मेरे डेटा की गारंटी देने की स्थिति कभी खराब नहीं होगी।बस इसके बारे में भूल जाओ और मध्य-बर्तन में या प्रविष्टि फ़ंक्शन में एक अशक्त प्रविष्टि के पिछले अस्तित्व की जांच करें, और यह बाधा नहीं है।
मैं का उपयोग कर रहा हूँ Postgres 9.0।
क्या कोई तरीका है जो मैं देख रहा हूँ?
UserId
,RecipeId
), के साथ कई पंक्तियों की अनुमति देगा , यदिMenuId IS NULL
?