क्या मुझे अपने डेटाबेस में आईडी की आवश्यकता है अगर रिकॉर्ड तारीख से पहचाना जा सकता है?


17

मैं एंड्रॉइड के लिए अपना पहला आवेदन लिख रहा हूं और SQLite डेटाबेस का उपयोग करूंगा ताकि जितना संभव हो सके आकार को सीमित करने की कोशिश की जाएगी, लेकिन मुझे लगता है कि यह सवाल सामान्य रूप से डेटाबेस डिजाइन पर लागू होता है।

मैं उन अभिलेखों को संग्रहीत करने की योजना बना रहा हूं जिनमें पाठ और सृजन की तिथि होगी। ऐप एक स्टैंड-अलोन ऐप है, यानी यह इंटरनेट से लिंक नहीं होगा और केवल एक उपयोगकर्ता इसे अपडेट कर रहा होगा, इसलिए इस बात की कोई संभावना नहीं है कि दी गई तारीख के साथ एक से अधिक प्रविष्टि होगी।

क्या मेरी तालिका को अभी भी एक आईडी कॉलम की आवश्यकता है? यदि ऐसा है, तो आईडी को रिकॉर्ड पहचानकर्ता के रूप में उपयोग करने के क्या लाभ हैं जो दिनांक के विपरीत हैं?


यदि आप पूर्णांक PK निर्दिष्ट नहीं करते हैं, तो SQLite हमेशा पंक्तिबद्ध एक पूर्णांक स्तंभ बनाएगा। तो अंतरिक्ष को बचाने के तरीके के रूप में "आईडी" कॉलम न होने पर भरोसा न करें।
कोडिज़्म

मैं जोड़ता हूँ कि एंड्रॉइड में कुछ वर्गों को काम करने के लिए एक _id कॉलम रखने के लिए तालिकाओं की आवश्यकता होती है। इस एसओ जवाब में अधिक जानकारी ।
बिगस्टोन

5
यदि आपको फोन से ही तारीख मिल रही है और उपयोगकर्ता पहले के समय क्षेत्र में यात्रा करता है (और उसका फोन अपने आप समय को अपडेट करता है) तो इस बात की थोड़ी सी संभावना है कि आप एक ही समय टिकट को एक से अधिक बार प्राप्त कर सकते हैं।
यूजीन

जवाबों:


22

IMHO, प्राथमिक कुंजी के रूप में एक तिथि स्तंभ का उपयोग करने से सबसे अच्छा बचा जाता है।

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

कुछ अन्य बिंदु जिन पर आप विचार करना चाहते हैं:

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

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

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

संपादित करें:

मुझे यह बताना चाहिए कि किसी भी तरह से यह संकेत नहीं देता है कि यह एक खराब डिजाइन निर्णय है। बस कि सवाल में RDBMS की व्यावहारिकता के साथ मुद्दे हो सकते हैं।


जब से मैंने एक SQLite क्वेरी लिखी है, तब से थोड़ी देर हो गई है, लेकिन पूर्णांकों द्वारा फ़िल्टर करने के लिए समान तारीखों को फ़िल्टर नहीं कर रहा है, बाइंडिंग वैल्यू के अधिक वर्बोज़ घोषणा से अलग है?
डगएम

यह सिर्फ अधिक क्रिया है और कुछ आरडीबीएमएस पर भी आपको वह मुद्दा मिलता है जहां दिन और महीने के तत्व को उलट दिया जाता है यदि डीबी को अमेरिकी प्रारूप में स्थापित किया गया हो।
रॉबी डी

धन्यवाद, ये सभी अच्छे उत्तर हैं, लेकिन काम पर आपके अनुभव ने निश्चित रूप से सौदे को सील कर दिया।
18

इसके लिए एक पोस्टस्क्रिप्ट के रूप में: केवल आज मुझे एक एप्लिकेशन ऑडिट टेबल के लिए एक समर्थन मुद्दा सौंपा गया है, जहां उन्हें 2 ग्राहक उपकरणों के बीच समय के अंतर के कारण कर्मचारी संख्या और एक्सेस डेट / टाइम पीके के लिए प्राथमिक कुंजी उल्लंघन मिल रहा है। ..
रॉबी डी

13

नहीं, आपको अपने स्कीमा में परिभाषित आईडी कॉलम की कड़ाई से आवश्यकता नहीं है यदि आप गारंटी दे सकते हैं कि कभी भी डुप्लिकेट तारीख नहीं होगी।

लेकिन ...

... उस ने कहा, आप इसे वैसे भी इस्तेमाल कर सकते हैं। यहाँ थोड़ा रहस्य यह है कि SQLite में पहले से ही ROWID नामक प्रत्येक तालिका के लिए एक अद्वितीय, ऑटो-इंक्रीमेंटिंग आईडी है। यदि आप अपनी तालिका में एक ऑटो-इंक्रीमेंटिंग पूर्णांक कॉलम को PK घोषित करते हैं, तो SQLite एक नया कॉलम नहीं बनाएगा - यह केवल उस पूर्व-मौजूदा ROWID कॉलम को उर्फ ​​करेगा।

SQLite में, हर तालिका की प्रत्येक पंक्ति में 64-बिट हस्ताक्षरित पूर्णांक ROWID है। प्रत्येक पंक्ति के लिए ROWID एक ही तालिका में सभी पंक्तियों के बीच अद्वितीय है।

आप एक विशेष कॉलम नाम ROWID, ROWID या OID का उपयोग करके SQLite तालिका के ROWID तक पहुँच सकते हैं । सिवाय यदि आप उन विशेष नामों में से एक का उपयोग करने के लिए एक साधारण टेबल कॉलम की घोषणा करते हैं, तो उस नाम का उपयोग घोषित कॉलम को आंतरिक आरओआईडी के लिए नहीं करेगा।

यदि किसी तालिका में INTEGER PRIMARY KEY का एक कॉलम होता है, तो वह कॉलम ROWID के लिए एक उपनाम बन जाता है। फिर आप किसी भी चार अलग-अलग नामों का उपयोग करके ROWID का उपयोग कर सकते हैं, ऊपर वर्णित मूल तीन नाम या INTEGER PRIMARY KEY कॉलम को दिए गए नाम। ये सभी नाम एक दूसरे के लिए उपनाम हैं और किसी भी संदर्भ में समान रूप से अच्छी तरह से काम करते हैं।

http://www.sqlite.org/autoinc.html

इसलिए, आप आईडी कॉलम का उपयोग न करके किसी भी स्थान को बचा सकते हैं क्योंकि आप एक टेबल प्राप्त कर रहे हैं चाहे आप इसे चाहते हैं या नहीं!


9

यदि निम्न में से कोई सत्य है, तो एक ID फ़ील्ड का उपयोग करें:

  1. कोई प्राकृतिक कुंजी मौजूद नहीं है (तिथि अद्वितीय नहीं होगी)
  2. दिनांक फ़ील्ड अक्सर बदलती रहेगी
  3. सम्मिलन के क्षण में तारीख ज्ञात नहीं हो सकती है।
  4. एक बहुरंगी पहचानकर्ता तीन स्तंभों से अधिक होता है, जो क्रिया को बहुत अधिक जोड़ देता है।

इस प्रश्न को पढ़ें: क्या "ऑल-सरोगेट्स" का समर्थन करने वाला एक विहित स्रोत है?

संपादित करें:

चूंकि, मेरी राय में, ऐसा लगता है कि उपरोक्त में से कोई भी सत्य नहीं है, आपको फ़ील्ड का उपयोग करने और आईडी करने की आवश्यकता नहीं है , लेकिन आप चाहें तो एक का उपयोग कर सकते हैं।


1
+1 ID कॉलम एक स्कीमा कोड गंध है, जो दर्शाता है कि आपका डेटा वास्तव में रिलेशनल मॉडल में फिट नहीं है।
रॉस पैटरसन

10
@RossPatterson मुझे इतना यकीन नहीं है। मैं कई मामलों के बारे में सोच सकता हूं जहां कोई प्राकृतिक कुंजी मौजूद नहीं हो सकती है, लेकिन डेटा अभी भी रिलेशनल मॉडल को फिट कर सकता है। मेरे सिर के ऊपर से बस एक मामला: जीवित व्यक्तियों के बारे में जानकारी संग्रहीत करना। कई ( सभी नहीं! ) देश प्रत्येक नागरिक को विशिष्ट पहचानकर्ता प्रदान करते हैं, लेकिन इसका मतलब यह नहीं है कि उस पहचानकर्ता का उपयोग करना उचित है या संभव भी है (यह रिकॉर्ड निर्माण के समय ज्ञात नहीं हो सकता है, सौंपा नहीं जा सकता है, या इसका उपयोग नहीं हो सकता है लागू नियमों द्वारा उदा। निषिद्ध हो सकता है)। इसका मतलब यह है कि डेटा संबंधपरक मॉडल फिट नहीं है? मुझे ऐसा नहीं लगता।
एक CVn

और थोड़ा अजीब तथ्य यह है कि जहां इस तरह के विशिष्ट पहचानकर्ता हैं, पुलिस (आदि) कभी-कभी अपनी नकली आईडी के लिए डुप्लिकेट का उपयोग करते हैं। और जब यह जानबूझकर नहीं होता है, तो लिपिकीय त्रुटि वैसे भी दोहराव सुनिश्चित करेगी।
user470365

4
चाहे वह (एक ला ओरेकल) में बनाया गया हो या बोना फाइड कॉलम के रूप में जोड़ा गया हो, वे बहुत उपयोगी हैं। किसी के रूप में जो बाड़ (डीबीए और डेवलपर) के दोनों किनारों पर रहा है, एक आईडी के साथ एक तालिका को तैयार करना बहुत आसान है जिसे आप गारंटी दे सकते हैं कि यह अद्वितीय होगा।
रॉबी डी

1
@RobbieDee आप सही हैं। यह विषय से हटकर है।
ट्यूलेंस कोरडोवा

2

ध्यान रखें कि आप भी से "तिथि" कॉलम के परिवर्तन अर्थ करना चाह सकते हैं created_atकरने के लिए updated_atया उन पंक्तियों, जो मैं बहुत ही सामान्य मामला है लगता है के साथ किसी भी अन्य परिवर्तन।

कुछ मामलों में आईडी कॉलम जोड़ने से आपको अधिक लचीलापन मिलेगा जब आपका डिज़ाइन बदल जाएगा।


+1 जोड़ने की तारीखें तैयार की गई और जब पंक्तियों को बनाया और अद्यतन किया गया, तो ट्रैकिंग के लिए date_modified बहुत उपयोगी है। रिपॉजिटरी / डेटा वेयरहाउस अपडेट मुद्दों की जांच करते समय यह सोने में इसके वजन के लायक है।
रॉबी डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.