2009-07-09 10 views
12

मैं एक पुराने एसक्यूएल सर्वर 2000 डेटाबेस के साथ काम कर रहा हूं, इसकी एक नई ऐप के साथ इसकी कुछ जानकारी मिलाकर मैं इमारत कर रहा हूं। मैंने देखा कि कई टेबलों में से कुछ प्राथमिक कुंजी किसी भी प्रकार की चींटियों की बजाय तैरती हैं। वे विदेशी कुंजी नहीं हैं और सभी अद्वितीय हैं। मैं किसी भी कारण से नहीं सोच सकता कि कोई भी अपनी अनूठी प्राथमिक कुंजी आईडी तैरना चाहता है, लेकिन मैं किसी भी माध्यम से एसक्यूएल विशेषज्ञ नहीं हूं। तो मुझे लगता है कि मैं क्या पूछ रहा हूं वह है जो इस काफी व्यापक डेटाबेस को डिजाइन करता है, मुझे कुछ पता नहीं है?स्वच्छता जांच: प्राथमिक कुंजी के रूप में फ़्लोट्स?

+0

मेरा मानना ​​है कि आपकी सहजताएं 100% सही हैं; फ्लोट खराब चाबियाँ बनाते हैं। –

उत्तर

8

मैं वर्तमान में एक बड़े एकाउंटेंट पैकेज के साथ काम कर रहा हूं जहां 350+ टेबलों में से प्रत्येक के पास फ्लोट (53) की प्राथमिक कुंजी है। सभी वास्तविक मान पूर्णांक हैं और सिस्टम कड़ाई से जांच करता है कि वे वास्तव में हैं (ऐसे विशेष कार्य हैं जो सभी बढ़ते काम करते हैं)।

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

इसलिए, फ्लोट ठीक है।

+0

यह दिलचस्प है, क्या आप आसानी से पठनीय द्वारा अपना मतलब समझ सकते हैं? क्या आपका मतलब बाहरी अनुप्रयोगों को पढ़ने या मानव पठनीय पढ़ने के लिए आसान है? जवाब के लिए धन्यवाद। –

+1

नहीं, मेरा मतलब है कि वे सिस्टम जिनके साथ लोग बड़ी चीजों के आसपास अपने स्वयं के छोटे सहायक अनुप्रयोग लिख रहे हैं, आसानी से 64-बिट पूर्णांक से निपटने में सक्षम नहीं हो सकते हैं। बीबीआईएनटीटी को मूल रूप से समर्थन देने के लिए वीबी 6 में कोई डेटा प्रकार नहीं है, आपको डबल के साथ खेलना होगा (जैसे एक्सेल स्वचालित रूप से सुझाता है) या वेरिएंट-डेसिमल (एडीओ करता है)। और यह कम से कम कुछ है! मैं आसानी से बाहरी प्रणाली की कल्पना कर सकता हूं जो कि बिगिनट्स का उपभोग करने में सक्षम नहीं होगा। – GSerg

+0

आह ठीक है, मैं देख रहा हूं कि आप क्या कह रहे हैं, ऊपर, धन्यवाद। –

2

क्या यह एक NUMERIC (x, y) प्रारूप और एक पहचान है? यदि ऐसा है, तो यह SQL सर्वर के पुराने संस्करण से अपग्रेड हो सकता है। बैक-इन-द-डे पहचान केवल एक NUMERIC प्रारूप हो सकती है, न कि सामान्य INT जिसे आज हम उपयोग करते हैं।

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

के बाद से यह लग रहा है आप ints भंडारण कर रहे हैं:

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

+1

असल में, पीके हमेशा आईएनटी कर सकते थे लेकिन चूंकि बिगिनट्स मौजूद नहीं थे, इसलिए लोग NUMERICs – zvolkov

+1

Ah OK का उपयोग करते थे। मुझे पता है कि Sybase SQL सर्वर - हमेशा के लिए - केवल NUMERICS का समर्थन किया और मैंने सोचा कि SQL सर्वर की 6.5 से अधिक पुरानी है कि प्रतिबंध –

+0

मेरा मानना ​​है कि उन्होंने शुरुआत से SQL Server 2000 का उपयोग किया था, हालांकि मैं 100% निश्चित नहीं हूं। हालांकि मैं दोबारा जांच करने जा रहा हूं। –

6

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

+2

सिद्धांत के मामले में, यदि आप इन गुणों को चाहते हैं तो मुझे लगता है कि आप हमेशा प्राथमिक प्राथमिक कुंजी के अतिरिक्त फ्लोट युक्त अनुक्रमित कॉलम जोड़ सकते हैं। –

+0

यह मेरा पहला विचार था, लेकिन मुझे ऐसा कोई नहीं मिल रहा है, वे सभी अनुक्रमिक 3.0, 4.0, 5.0 आदि हैं, शायद यह भविष्य के सबूत का कुछ प्रकार था, हालांकि मुझे पूरा यकीन नहीं है कि क्यों वे बस लगते हैं आईडी होना आपके सहयोग के लिए धन्यवाद। –

+2

ऐसा नहीं लगता है कि यह प्रश्नकर्ता के विशिष्ट मामले का सही उत्तर है ... लेकिन आप इस प्रश्न की खोज करने के लिए अगले व्यक्ति के लिए एक दिलचस्प और संभावित उत्तर देने के लिए वैसे भी मतदान कर सकते हैं। – Beska

8

मैंने किसी ऐसे व्यक्ति के साथ काम किया जो एसक्यूएल सर्वर डेटाबेस में पीके के रूप में तैरता था। अगर वह आईएनटी पर फंस गया तो वह पहचानकर्ताओं के लिए संख्याओं से बाहर निकलने के बारे में चिंतित था। (एसक्यूएल सर्वर पर 32 बिट।) उसने सिर्फ फ्लोट की रेंज को देखा और इस तथ्य के बारे में नहीं सोचा कि इस तथ्य के बारे में कभी भी बुरा नहीं है कि सीमित परिशुद्धता के कारण बड़ी संख्या में स्थान संख्या में नहीं है। तो MAX (पीके) + 1.0 लेने के लिए उसका कोड कुछ बिंदु पर MAX (पीके) के बराबर संख्या लौटाएगा। अच्छा नही। अंत में मैंने उन्हें भविष्य में डेटाबेस के लिए सरोगेट प्राथमिक कुंजी के लिए फ्लोट का उपयोग न करने के लिए आश्वस्त किया। वह उस डीबी को ठीक करने से पहले छोड़ दिया जिस पर वह काम कर रहा था।

अपने प्रश्न का उत्तर देने के लिए, "तो मुझे लगता है कि मैं जो पूछ रहा हूं वह ऐसा करता है जो इस काफी व्यापक डेटाबेस को डिजाइन करता है, मुझे कुछ पता नहीं है?" सबसे अधिक संभावना नहीं! कम से कम डेटाटाइप चुनने के संबंध में नहीं।

+1

वह नंबर जहां आप समस्या में भागना शुरू करते हैं 'पीके + 1.0 = पीके' 9007199254740992 है। प्रति सेकंड 1000000 नई पीके पर, आपको उस नंबर पर चलाने के लिए 285 साल लगेंगे। मुझे नहीं लगता कि यह चिंता करने योग्य एक बिंदु है। दूसरी ओर, केवल 100 प्रति सेकंड पर आप एक वर्ष से भी कम समय में एक हस्ताक्षरित int में कमरे से बाहर भाग सकते हैं। –

1

मैं कुछ वर्षों तक सर्नेर मिलेनियम डेटाबेस के साथ काम कर रहा हूं (कवर के तहत यह ओरेकल का उपयोग करता है)। शुरुआत में मैं यह देखकर बहुत हैरान था कि उसने टेबल पर आईडी के लिए फ्लोट का इस्तेमाल किया था। तब मुझे हमारे डेटाबेस में एक आईडी का सामना करना पड़ा> 2^32 और मैंने जो प्रश्न लिखा था, उसने गलत परिणाम दिए क्योंकि मैंने गलत तरीके से इसे आईएनटी में डाला था, मुझे एहसास हुआ कि उन्होंने ऐसा क्यों किया।मुझे असली दुनिया में चलने वाली फ्लोट्स का उपयोग करने के ऊपर उपर्युक्त तर्क नहीं मिलते हैं, जहां कुंजी के लिए आपको केवल 2^32 की तुलना में केवल "कुछ हद तक अधिक" की आवश्यकता होती है और आईडी का मान हमेशा #### ##। 0। (कोई भी फॉर्म ######। ######।) की आईडी के बारे में बात नहीं कर रहा है। हालांकि अब हम इस डेटा को SQL सर्वर वेयरहाउस में आयात कर रहे हैं, और बिगिन उपलब्ध है, हम जा रहे हैं फ्लोट के बजाय बिगिन के साथ।

1

FYI-- इस देखने का एक और तरीका है:

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

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