2008-12-04 14 views
11

के हिस्से के रूप में एक तिथि का उपयोग किया जाना चाहिए प्राथमिक कुंजी के हिस्से के रूप में दिनांक फ़ील्ड को शामिल करने के लिए पेशेवर/विपक्ष क्या हैं?डाटाबेस डिज़ाइन - प्राथमिक कुंजी

उत्तर

4

मैं कुंजी का हिस्सा होने के साथ ठीक हूं, लेकिन यह भी जोड़ता है कि आपके पास ऑटो-इंक्रिमेंटिंग अनुक्रम संख्या भी पीके का हिस्सा होनी चाहिए, और यह भी लागू करें कि किसी भी तारीख को यूटीसी के रूप में डेटाबेस में लिखा गया है, स्थानीय समय में कनवर्ट करने की तुलना में डाउनस्ट्रीम सिस्टम।

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

+1

+1। हमारा डीबी यूटीसी का उपयोग नहीं करता है और यह हमें दर्द की दुनिया का कारण बनता है। –

2

एक मामूली चोर हो सकता है कि यह के रूप में सुरुचिपूर्ण कुछ अन्य पहचानकर्ता

(एक सहयोगी से यह कहते हुए जैसे आप रिकॉर्ड 475,663 देख सकते हैं थोड़ा तुम 2008- देख सकते हैं कृपया कह की तुलना में आसान है कृपया के रूप में एक संभाल नहीं है 12-04 19:34:02)

वहाँ भी विभिन्न स्थानों में अलग तिथि प्रारूप पर भ्रम की स्थिति का खतरा है

(जैसे 4 थी मार्च 2008 - 2008/04/03 यूरोप में, 2008/03/04 संयुक्त राज्य अमेरिका में)

(मेरी प्राथमिकता हमेशा उपयोग करने के लिए है अलग कुंजी कॉलम)

+1

आईएसओ दिनांक प्रारूप YYYY-MM-DD चट्टानों! :) राज्यों में काम कर रहे एक ब्रिट के रूप में मैं इसे हर समय एक समझौता स्थिति के रूप में उपयोग करता हूं, क्योंकि 10 साल के बाद भी एमएम/डीडी/वाई वाईवायवाई ब्लैकबोर्ड के नीचे नाखूनों जैसे मेरे नसों पर grates। –

+1

हाँ, मैं सभी को आईएसओ का उपयोग करने की कोशिश करता हूं। करने से आसान कहा .... – cagcowboy

3

कुछ प्रश्न हैं जो मैं प्राथमिक कुंजी के हिस्से के रूप में किसी तारीख का उपयोग करने के बारे में पूछूंगा।

क्या तिथि में समय का हिस्सा शामिल है? यह चीजों को मुश्किल बनाता है क्योंकि समय में समय क्षेत्र और डेलाइट बचत शामिल होती है। यह दिनांक/समय मान को परिवर्तित नहीं करता है, लेकिन क्वेरी के आधार पर मूल्यों को क्रमबद्ध करने या पुनर्प्राप्त करने के मामले में अप्रत्याशित परिणाम उत्पन्न कर सकता है।

मैं प्राकृतिक कुंजी (जैसे किसी तारीख का उपयोग करने) की बजाय सरोगेट कुंजी (यानी प्राथमिक कुंजी के रूप में अनुक्रम कॉलम का उपयोग करें) के उपयोग में एक बड़ा आस्तिक हूं।

7

भागों की सूची की एक तालिका पर विचार करें - यदि आप प्रत्येक दिन के अंत में सूची स्तर को स्टोर करना चाहते हैं तो part_id और date_of_day पर एक समग्र प्राथमिक कुंजी ठीक होगी। आप इसे एक अनूठी कुंजी बनाने और सिंथेटिक प्राथमिक कुंजी जोड़ने का विकल्प चुन सकते हैं, खासकर यदि आपके पास एक या अधिक तालिकाओं को एक विदेशी कुंजी बाधा के साथ संदर्भित किया गया है, लेकिन उस तरफ, कोई समस्या नहीं है।

इसलिए इसके साथ कुछ भी गलत नहीं है, लेकिन किसी भी अन्य विधि की तरह इसे पैट्रिक के उदाहरण में गलत तरीके से इस्तेमाल किया जा सकता है।

संपादित करें: यहां जोड़ने के लिए एक और टिप्पणी है।

मुझे कुछ समय पहले लिखा गया था कि मैंने कुछ समय पहले लिखा था कि डेटाबेस में दिनांक मूल्य वास्तव में प्राकृतिक या सिंथेटिक थे या नहीं। "YYYY-MM-DD" जैसी तारीख का पठनीय प्रतिनिधित्व निश्चित रूप से प्राकृतिक है, लेकिन आंतरिक रूप से ओरेकल में इसे एक संख्यात्मक के रूप में संग्रहीत किया जाता है जो केवल उस विशेष दिनांक/समय को ओरेकल को दर्शाता है। हम विशेष तिथि और समय के रूप में अपना अर्थ खोने के आंतरिक मूल्य के बिना किसी भी समय (अलग-अलग पठनीय प्रारूपों, या पूरी तरह से एक अलग कैलेंडर सिस्टम के लिए) उस आंतरिक मूल्य के प्रतिनिधित्व को चुन सकते हैं और बदल सकते हैं। मुझे लगता है कि उस आधार पर, एक दिनांक डेटा प्रकार प्राकृतिक और कृत्रिम के बीच कहीं स्थित है।

0

प्राथमिक कुंजी के एकमात्र या पहले घटक के रूप में दिनांक उच्च डालने वाले तालिकाओं पर प्रदर्शन समस्याओं का कारण बनता है। (तालिका को बार-बार पुन: संतुलित करने की आवश्यकता होगी)।

अक्सर एक समस्या का कारण बनता है यदि एक दिन प्रति दिन डाला जाता है।

ज्यादातर स्थितियों में मैं इसे एक खराब गंध मानता हूं, और इसके खिलाफ सलाह दूंगा।

2

हमेशा के रूप में .. यह निर्भर करता है।

पीके में दिनांक/समय कॉलम शामिल करने का आपका उद्देश्य क्या है? क्या यह वास्तव में पंक्ति का चयन किए बिना रिकॉर्ड के बारे में अतिरिक्त जानकारी प्रदान करना है?

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

[साइड नोट] इस तरह की मुझे (1) COMB (संयुक्त GUID) के पीछे सिद्धांत की याद दिलाता है, हालांकि यहां विचार एक पीके के लिए एक अद्वितीय आईडी बनाना था जो SQL सर्वर बेहतर अनुक्रमित/आवश्यक सूचकांक पुनर्निर्माण की बजाय किसी पंक्ति के लिए कोई सार्थक दिनांक/समय मान जोड़ें।

(1) [http://www.informit.com/articles/article.aspx?p=25862&seqNum=7]

4

आप पहले से ही एक 'प्राकृतिक' प्राथमिक कुंजी का उपयोग करने का फैसला किया है, तो सवाल है: तिथि प्राथमिक कुंजी, या नहीं का एक आवश्यक हिस्सा है - पेशेवरों/विपक्ष अप्रासंगिक हैं !

+0

बिल्कुल सही। किसी भी अन्य विचार बिंदु से बाहर हैं। या तो यह विशिष्टता को अलग करने के लिए तर्कसंगत है, या यह नहीं है। यदि ऐसा है, तो यह प्राकृतिक पीके में है, या यह एक वैकल्पिक विशिष्टता contstraint में होना चाहिए। यह एफके में लगभग कभी भी उपयोगी नहीं होगा। – dkretz

+0

एमएमएम ... एफके में कभी भी उपयोगी नहीं होगा? यदि आप पीके में शामिल हैं, तो यह एफके में प्रभावशाली है। उपयोगी कोई विकल्प नहीं है या नहीं, यह वही है। समग्र कुंजी के चारों ओर ले जाना निश्चित रूप से अधिक कठिन है लेकिन यह संभव से अधिक है, यह काम करता है। –

0

इसके साथ कुछ भी कण गलत नहीं है, लेकिन जैसा कि अन्य पोस्टर्स ने नोट किया है कि आप समय क्षेत्र और स्थानीय लोगों के साथ समस्याएं प्राप्त कर सकते हैं। इसके अलावा आप अपने SQL को obfusticating DATE() फ़ंक्शन के साथ समाप्त कर सकते हैं।

यदि यह पहले उल्लेखित दिन के अंत में सूची की तरह कुछ है, तो आप शायद प्राथमिक कुंजी के दूसरे भाग के रूप में "20081202" जैसे आठ वर्ण टेक्स्ट फ़ील्ड पर विचार कर सकते हैं। यह समय क्षेत्र लोकेल समस्याओं से बचाता है और यदि आपको आवश्यकता हो तो वास्तविक तिथि में परिवर्तित करना काफी आसान है।

याद रखें कि प्राथमिक कुंजी में रिकॉर्ड की पहचान करने और विशिष्टता को लागू करने के लिए दो कार्य हैं। सरोगेट प्राथमिक कुंजी नीदर करते हैं।

+0

विशिष्टता एक अद्वितीय अनुक्रमणिका के साथ लागू करने के लिए बस इतना आसान है। सरोगेट कुंजी अक्सर जुड़ने में बहुत तेज होती है। और बहुत कम वास्तविक जीवन डेटा में एक वास्तविक प्राकृतिक अनूठी कुंजी है (ऑडिट एजेंसी के लिए काम करते समय सैकड़ों विभिन्न व्यावसायिक कार्यों से संबंधित हजारों डेटाबेस पूछताछ से)। – HLGEM

+0

मैं एक महत्वपूर्ण कॉलम में 'दिनांक' को समझता हूं जिसका मतलब नाममात्र दिनांक है जिसमें समय के साथ कुछ भी नहीं है। यह एक चेक तिथि या चालान तिथि की तरह है। लोग हर समय बैकडेट करते हैं। 2005-12-02 को 11:50 बजे निर्धारित एक उड़ान को लुकअप प्रयोजनों के लिए उसी तारीख को रखना चाहिए, भले ही यह 15 मिनट देर से निकल जाए। –

2

तिथियां पूरी तरह से अच्छी प्राथमिक कुंजी बनाती हैं, बशर्ते वे प्राकृतिक कुंजी के हिस्से के रूप में समझें। मैं की तरह टेबल में एक तिथि का प्रयोग करेंगे:

  • holiday_dates (hol_date तारीख)
  • employee_salary (employee_id पूर्णांक, sal_start_date तारीख)

(ऊपर सरोगेट employee_salary_id जोड़ने की बात क्या होगी?)

कुछ तालिकाओं के लिए, एक तिथि में इस्तेमाल किया जा सकता है, लेकिन कुछ और अधिक समझ में आता है प्राथमिक कुंजी, जैसे के रूप में:

  • hotel_room_booking (booking_reference)

हम (room_no, booking_from_date) या (room_no, booking_to_date) का उपयोग किया जा सकता था, लेकिन एक संदर्भ, ग्राहक आदि हम अद्वितीय की कमी में इन बनाता है हो सकता है के साथ संवाद स्थापित करने के लिए और अधिक उपयोगी है, लेकिन वास्तव में हमें इनके लिए एक अधिक जटिल "कोई ओवरलैप" जांच की आवश्यकता नहीं है।

-2

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

+1

क्या आप इस बारे में निश्चित हैं - क्या आपने बेंचमार्क किया है? ओरेकल दिनांक 7 बाइट्स में आयोजित होते हैं - जॉइन में तुलना करने के लिए शायद ही कभी कठिन। –

+0

जॉब गति एक सरोगेट कुंजी का चयन करने के लिए पर्याप्त कारण नहीं है। मैं बोनमार्क के बारे में टोनी की टिप्पणी गूंजता हूं। –

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