2008-10-09 15 views
7

एक टेबल डिज़ाइन करते समय मेरे सहयोगी यहां कहते हैं कि मुझे पहचान कॉलम से बचना चाहिए क्योंकि यह SQL सर्वर और एमएस एक्सेस के लिए विशिष्ट है, लेकिन मैं उनके विचारों से अलग हूं क्योंकि यह मेरे कोडिंग को सरल बनाता है।डीबी: पहचान कॉलम का उपयोग करने के लिए या नहीं?

क्या मुझे पहचान कॉलम का उपयोग करना चाहिए या नहीं? यदि नहीं, तो आवेदन कोड से पहचान कॉलम बनाने का सबसे अच्छा तरीका क्या नहीं है?

उत्तर

10

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

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

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

5

क्या इससे कोई फर्क पड़ता है कि यह माइक्रोसॉफ्ट मंच के लिए विशिष्ट है? क्या आपका आवेदन पोर्टेबल होना है, यानी क्या आप इसे mysql/postgres/जो कुछ भी माइग्रेट करने की योजना बना रहे हैं?

+1

यह अभी तक योजनाबद्ध नहीं है, हालांकि मुझे लगता है कि यह हमेशा के लिए एमएस एसक्यूएल सर्वर होगा, जब तक कि एमएस भविष्य में परेशानी में नहीं चलेगा। – Kishork

3

जहां तक ​​मुझे पता है, हर छोटी गंभीर आरडीबीएमएस के पास प्रति तालिका की अनूठी संख्यात्मक योजना है।

  1. प्रवेश और एसक्यूएल सर्वर पहचान कॉलम
  2. MySQL ऑटो वेतन वृद्धि स्तंभ है
  3. PostgreSQL दृश्यों है
  4. हालांकि मैं नहीं कर रहा हूँ
  5. SQLite एक अंतर्निहित ROWID स्तंभ
  6. ओरेकल अनुक्रम में किसी प्रकार का है है इसके साथ परिचित सभी

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

+0

आप ओरेकल में अनुक्रमकों से परिचित नहीं हैं, इसलिए आप तय करते हैं कि "हर छोटी गंभीर आरडीबीएमएस की प्रति तालिका एक संख्या है"? –

+0

@ डेव, 42 हमेशा एक संख्या है, फिर भी एक संख्या हमेशा 42 नहीं होती है। – Kris

+0

हाँ, इसका कोई मतलब नहीं है कि इसका मतलब क्या है। पिछली बार जब मैंने ओरेकल की जनरेटर की जांच की थी, तो पोस्टग्रेएसक्यूएल के अनुक्रमों की तरह, जो प्रति तालिका नहीं हैं। –

5

पहचान कॉलम का उपयोग करें!

यह "व्यापार तर्क" से आपके "एप्लिकेशन तर्क" को अलग करता है।

मान लें कि आप प्राथमिक ईमेल के रूप में "ईमेल" का उपयोग करते हैं (जो "व्यापार तर्क" की अवधि में समझ में आता है)। जब आप उस ईमेल में मौजूद नहीं होंगे और आपका उपयोगकर्ता आपका ईमेल संपादित करना चाहता है तो आपको परेशानी होगी।

2

पहचान कॉलम का उपयोग न करें जब तक कि आप इसके नुकसान के बारे में पूरी तरह से अवगत न हों और SEQUENCE या नकली अनुक्रम जनरेटर का उपयोग करने के लिए कोई वैध कारण नहीं है।

अनुक्रम अधिक लचीला हैं और पहचान कॉलम के नुकसान/प्रतिबंध नहीं हैं।

http://www.jumpingbean.co.za/blogs/mark/identity_autoincrement_fields_and_database_sequences से

:

डेटा पर ऑटो बढ़ाने

प्रतिलिपि बनाई जा रही के साथ दर्द, जबकि संरक्षण पहचान मूल्य

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

"SET IDENTITY_INSERT उत्पादों को चालू कर सकते हैं" जारी कर सकते हैं।

अन्य विक्रेताओं को आपको बाधा छोड़ने और फिर इसे फिर से सक्षम करने की आवश्यकता होगी।

अधिक दर्द- की नई डाली गई पंक्तियों का मूल्य कैसे प्राप्त करें?

इसके अलावा सर्वर आमतौर पर एक नव डाला पंक्ति के लिए पहचान स्तंभ मान प्राप्त करने के लिए अलग अलग तरीके प्रदान करता है। MySQL के लिए यह LAST_INSERT_ID() फ़ंक्शन है और MSSQL के लिए यह @@ पहचान है उदाहरण के लिए @@ पहचान चुनें।

एमएस एसक्यूएल सर्वर 2011 SEQUENCE का समर्थन करेगा।

  1. स्विच PostgreSQL रहे हैं:

    आप एक आरडीबीएमएस सर्वर है कि अनुक्रम (MSSQL पूर्व 2011 या MySQL की तरह) का समर्थन नहीं करता उपयोग करते हैं, दो विकल्प होते हैं। यह वास्तव में सबसे आसान विकल्प है। आपको उद्यम-ग्रेड, पूरी तरह से खुला स्रोत आरडीबीएमएस सर्वर मिलता है। और यदि आप चाहें तो वाणिज्यिक सहायता भी हो सकती है।

  2. डेटा एक्सेस लाइब्रेरी का उपयोग करें जो SEQUENCE अनुकरण करने का समर्थन करता है। JPA 2.0 कार्यान्वयन उदा। EclipseLink, Hibernatethis very trivial for you (TABLE strategy) बनाते हैं। यह उपरोक्त के साथ पारस्परिक रूप से अनन्य नहीं है। PostgreSQL के साथ जेपीए 2.0 का उपयोग करके, आपके जीवन को MySQL के साथ कच्चे जेडीबीसी की तुलना में इतना आसान बना देगा।
+0

मुझे लगता है कि यदि आप "पहचान" नामक एक नई तालिका जोड़ते हैं और इसके अंदर प्रत्येक तालिका के लिए नवीनतम आईडी संग्रहीत करते हैं, तो प्रत्येक बार आपको तालिका के लिए एक नई आईडी की आवश्यकता होने पर SET [tablename] +1 कहना बहुत आसान होगा। – BerggreenDK

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