2010-03-06 17 views
5

मैं SQL Server 2005 में एक नई तालिका बना रहा हूं जिसमें 2 फ़ील्ड की आवश्यकता है: डेटटाइम और MyValue (Int32)। डेटटाइम फ़ील्ड अद्वितीय होगा इसलिए मैं इस पर एक अनूठी बाधा स्थापित करूँगा।डेटाटाइम फ़ील्ड पर SQL सर्वर प्राथमिक कुंजी

कौन सी तालिका संरचना बेहतर है और क्यों?

MyIndex (पी, पूर्णांक)
MyDate (दिनांक) (IX_UniqueKey)
MyValue (int)

या

MyDate (पी, datetime)
MyValue (int)

मेरी भावना यह है कि मैं इस तालिका में एक कृत्रिम पीके (माई इंडेक्स) नहीं चाहता क्योंकि यह अनावश्यक है और क्योंकि तारीखें अनूठी होंगी, मैं उन्हें किसी भी रिकॉर्ड तक पहुंचने के लिए उपयोग करूंगा। हालांकि, यह हो सकता है कि यह एक कृत्रिम पीके है ...?

+0

व्यक्तिगत रूप से मैं माईडेट, माइंडेक्स, माईवैल्यू इत्यादि का उपयोग नहीं करता। "मेरा" उपसर्ग क्या जोड़ता है?EventDate या EventDateTime, और [Value] या EventValue क्यों नहीं? साथ ही, यदि दिनांक मान अद्वितीय होंगे, तो मुझे लगता है कि संकल्प घंटे या दिन है। यदि ऐसा है, तो DATETIME की तुलना में SMALLDATETIME का उपयोग करना बेहतर है। –

+2

@Aaron Bertrand, मुझे लगता है कि यह केवल एक उदाहरण था, और DATETIME दूसरे/मिलीसेकंद के लिए हो सकता है। –

+0

सही - यह वास्तविक सारणी का एक सार है। – Guy

उत्तर

9

जब आप कहते हैं कि तिथियां अनूठी होंगी, तो क्या आपका मतलब है कि सोचें वे अद्वितीय होंगे, या उनकी विशिष्टता समस्या के बयान से गारंटीकृत है? मेरे अनुभव में, कुछ चीजें एक कल्पना से कम अनूठी सौदा साबित होती हैं (अमेरिकी सामाजिक सुरक्षा संख्या एक उदाहरण है)।

यदि दिनांक मान अद्वितीय नहीं हैं, तो आपको पूर्णांक कुंजी जोड़नी चाहिए।

यदि दिनांक मूल्यों की गारंटी अद्वितीय है, तो क्या वे बदलते हैं? अगर वे बदलते हैं, तो क्या वे अन्य तालिकाओं द्वारा संदर्भित हैं? यदि दोनों उत्तर "हां" हैं तो आपको शायद पूर्णांक कुंजी जोड़नी चाहिए।

यदि तारीख मान अद्वितीय हैं, और परिवर्तित नहीं होते हैं या संदर्भित नहीं हैं, तो आप उन्हें कुंजी के लिए उपयोग कर सकते हैं। नियमित DATETIMEs 8 बाइट्स हैं और मानक INTEGER मान 4 बाइट्स हैं जो अनुक्रमण पर मामूली प्रभाव डाल सकते हैं। यदि आपकी तिथि मान केवल तिथियां हैं, या केवल मिनट या उससे कम के लिए सटीक हैं, और प्रकार द्वारा अनुमत अधिक प्रतिबंधित सीमा में, आप SMALLDATETIME का उपयोग कर सकते हैं और उन इंडेक्स मानों को 4 बाइट्स तक प्राप्त कर सकते हैं।

+0

दिनांक क्षेत्र प्रति दिन आधार पर इसकी भंडारण जानकारी के रूप में अद्वितीय है। उदाहरण के लिए, एक राष्ट्रीय उद्यान के लिए दैनिक आगंतुकों। तो उस दिन आगंतुकों की संख्या को मापने के इतिहास में प्रत्येक दिन केवल एक रिकॉर्ड होगा। आपके बिंदु पर smalldatetime उस फ़ील्ड के लिए एक बेहतर डेटा प्रकार की तरह लगता है क्योंकि समय अप्रासंगिक है। – Guy

1

नहीं, आपका अंतर्ज्ञान सही है। जब तक कोई भी आपके डेटा संग्रह प्रक्रिया के उपलब्ध रिज़ॉल्यूशन को देखते हुए दो (या मुझे लगता है कि) एक साथ कई घटनाएं पर्ची कर सकती हैं, तो आप डरावनी डोरि हैं।

1

यदि आपके पास गारंटी है कि डेटाटाइम्स हमेशा अद्वितीय (समय घटक का संकल्प सोचें), तो डेटाटाइम कॉलम पर प्राथमिक कुंजी बनाना एक अच्छा विकल्प है।

यदि आप कभी भी डेटाटाइम बढ़ाने में जा रहे हैं, तो अपने प्राथमिक कुंजी कॉलम पर क्लस्टर इंडेक्स बनाना भी एक अच्छा विकल्प है।

2

DATETIME मूल्य डेटाबेस आईई की आबादी किया जाएगा:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (GETDATE(), 1234) 

... तो हाँ, mydate स्तंभ प्राथमिक कुंजी बनाने आदर्श समाधान है। तिथि आवेदन आईई द्वारा प्रदान की जाती है:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (@my_date_value, 1234) 

... यह सोचते हैं @my_date_value डेटाबेस द्वारा आपूर्ति किया जा रहा है - नहीं, आदर्श नहीं। डेटाबेस के अलावा किसी अन्य चीज़ से डेटाटाइम सम्मिलन के आधार पर सटीक होने की गारंटी नहीं दी जा सकती है।

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