2013-10-29 6 views
5

मेरे पास एक सारणी है जो एक से एक रिश्ते का वर्णन करती है, आइए चित्रों और एल्बमों के बीच कहें। मैं एल्बम की कवर तस्वीर के रूप में प्रति एल्बम एक और केवल एक तस्वीर चुनने में सक्षम होना चाहता हूं। अभी, टेबल इस तरह है:बुलियन कॉलम (जैसे रेडियो बटन की तरह) के साथ "विशिष्टता" को कैसे लागू करें?

AlbumID int primary key, 
PictureID int, 
IsCover bool 

जाना चाहिए कि मैं समग्र स्कीमा (परिवर्तित करने के लिए नहीं करना चाहती एक समाधान स्थानांतरित करने के लिए एक और मेज पर संबंध, एक एक- को परिभाषित "के कवर है" हो सकता है एक रिश्ते, लेकिन यह प्राथमिकता दी जाती है कि पहले से लागू किए गए प्रश्नों को किसी अन्य तालिका को जोड़कर न बदलें), क्या एक ही एल्बम आईडी के साथ सभी प्रविष्टियों को लागू करने का कोई तरीका है लेकिन किसी के पास IsCover को गलत पर सेट किया गया है?

मैं सर्वर-साइड समाधान की तलाश में हूं। मैं माइक्रोसॉफ्ट एसक्यूएल सर्वर 2012 के साथ काम कर रहा हूं। अद्वितीय बाधा यहां लागू नहीं की जा सकती है, अन्यथा मेरे पास प्रत्येक एल्बम के लिए केवल एक कवर और गैर-कवर हो सकता है। मैंने पहले ही अपने आवेदन में एक चेक लागू कर लिया है, लेकिन मैं वास्तव में सुरक्षा की एक अतिरिक्त परत रखना चाहता हूं।

अग्रिम धन्यवाद।

+2

क्या डालने की जाँच करता है कि क्या नई प्रविष्टि कवर आइटम माना जाता है के बाद अद्यतन करने के बाद एक उत्प्रेरक का उपयोग कर/और फिर के बारे में अन्य सभी के निशान प्रासंगिक प्रविष्टियां झूठी के रूप में? –

+1

चेक बाधा का उपयोग करके आप टेबल पर जो भी नियम पसंद करते हैं उसे लागू कर सकते हैं। एक ऐसा फ़ंक्शन बनाएं जो वास्तविक जांच करता है और इसे बाधा में उपयोग करता है। –

+0

आप दोनों के लिए धन्यवाद! हालांकि, मैं यह जानने की कोशिश कर रहा हूं कि चीजों को यथासंभव सरल रखने के लिए अद्वितीय बाधा के समान कुछ है या नहीं। – Simone

उत्तर

4

शायद अद्वितीय फ़िल्टर्ड सूचकांक बात यह है कि आप मदद कर सकते हैं है:

create table AlbumPics (
    AlbumID int not NULL, 
    PictureID int not NULL, 
    IsCover bit not NULL, 
    primary key clustered (AlbumID, PictureID) 
) 

create unique index UX_AlbumPics_CoverPic 
    on AlbumPics (AlbumID) where IsCover = 1 

-- insert 3 pics for album 1, one of them is cover pic 
insert into AlbumPics values 
(1, 1, 0), (1, 2, 1), (1, 3, 0) 

-- try to insert one more cover for album 1 - will fail 
insert into AlbumPics values 
(1, 4, 1) 
+1

+1, लेकिन याद रखें कि "फ़िल्टर किए गए इंडेक्स" SQL Server 2008 और ऊपर हैं। http://technet.microsoft.com/en-us/library/cc280372.aspx –

+0

धन्यवाद i-one, यह वही समाधान है जिसे मैं ढूंढ रहा था! बस एक और बात: मैं कैसे सुनिश्चित कर सकता हूं कि एल्बम के लिए हमेशा एक कवर होता है? उपरोक्त कोड सुनिश्चित करता है कि केवल एक ही है, लेकिन कोई भी नहीं हो सकता है। – Simone

+1

@ सिमोन, 'कवरपिक्चर आईडी int' न्यूल 'कॉलम को' एल्बम 'तालिका में जोड़ने के अलावा, मुझे यकीन नहीं है कि प्रत्येक एल्बम को कवर करने के लिए लागू करने का कोई विश्वसनीय तरीका है। यदि आप 'एल्बम' तालिका स्कीमा नहीं बदल सकते हैं, तो मुझे लगता है कि, मैं इसे डेटा पुनर्प्राप्ति पर सुनिश्चित करने के बजाय प्रयास करता हूं, जैसे कि विशेष तस्वीर "नो कवर" चुनना, जब किसी एल्बम के लिए कोई कवर न हो, या बस इस तरह के " गंदा डेटा "एल्बम। –

संबंधित मुद्दे