2010-10-07 11 views
6

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

मैं डेटाबेस के प्रदर्शन या विकास से समझौता नहीं करने के लिए सबसे अच्छा संभव समाधान प्राप्त करने का प्रयास कर रहा था।

कोई सुझाव?

अग्रिम धन्यवाद!

+2

यदि आप ईएवी मार्ग नीचे जा रहे हैं, तो मेरा सुझाव है कि आप कुछ पढ़ते हैं कि यह संबंधपरक डेटाबेस में खराब डेटा संरचना क्यों है। देखें: http: //www.simple-talk.com/opinion/opinion-pieces/bad-carma/ यदि आपको वास्तव में ऐसा करने की आवश्यकता है, तो आप इसके बजाय एक nosql समाधान पर विचार कर सकते हैं। – HLGEM

उत्तर

11

वर्कर (अधिकतम) शायद ऐसा करने का सबसे आसान तरीका है।

sql_variant इस उद्देश्य के लिए डिज़ाइन किया गया था ताकि आप इसका उपयोग कर सकें, लेकिन यह सुनिश्चित करने के लिए पुस्तकें ऑनलाइन प्रविष्टि पढ़ें कि यह वही करने जा रहा है जो आप चाहते हैं।

http://msdn.microsoft.com/en-us/library/ms181071.aspx

+0

मुझे वर्चर्स समाधान पसंद नहीं है, लेकिन मैं निश्चित रूप से sql_variant को आजमा रहा हूं और रूपांतरण प्रदर्शन हिट का परीक्षण कर रहा हूं। अगर यह स्वीकार्य है, तो यह वही तरीका है! आपका सुझाव देने के लिए धन्यवाद। –

+0

+1 - sql_variant के लिए सामान – Brad

+3

+1 सीखना अच्छा लगता है। सबसे पहले मैंने इसके बारे में सुना है! –

0

इसे varchar (या nvarchar) के रूप में स्टोर करें। यह सभी प्रकारों को संभालेगा। आपको यह निर्धारित करना होगा कि आप अपने डेटा के बारे में जो जानते हैं उसके आधार पर इसे किस लंबाई में बनाना है।

तुम हो वस्तु स्ट्रिंग के कुछ प्रकार के रूप में सहेजा करना होगा:

+0

सुझाव के लिए धन्यवाद। लेकिन मैं डेटाबेस विकास और रूपांतरण प्रदर्शन हिट के कारण वर्चर (nvarchar) समाधान से परहेज कर रहा था। –

+2

आप अपने केक नहीं ले सकते हैं और इसे भी खा सकते हैं; यदि आप एक ही कॉलम में विभिन्न प्रकारों को स्टोर करना चाहते हैं, तो आप किस *** अन्य *** प्रकार का उपयोग करेंगे? स्ट्रिंग/वर्कर ** ** केवल ** प्रकार है जो सभी अन्य प्रकारों का प्रतिनिधित्व कर सकता है (बाइनरी या पाठ्यक्रम को छोड़कर)। – Brad

+0

** नोट: मैंने बस 'sql_varient' प्रकार के बारे में पढ़ा है और यह एक व्यवहार्य समाधान की तरह लगता है, लेकिन मुझे आश्चर्य है कि .NET उस कॉलम में ऑब्जेक्ट्स को उस प्रकार के प्रकार कास्टिंग करने के लिए प्रतिक्रिया देगा जो आप चाहते हैं। – Brad

1

मैं इसे देखना रूप में, आप केवल दो विकल्प हैं। वह स्ट्रिंग कच्ची स्ट्रिंग या एक्सएमएल हो सकती है। यदि आप एक्सएमएल उत्तर के रूप में इसे "क्रमबद्ध" करते हैं, तो इसे डेटाबेस में संग्रहीत करें, फिर से, आप nvarchar या XML चुन सकते हैं। मैं बताता हूं कि "इसे क्रमबद्ध करना" डेटा को फहराएगा। यदि आप किसी अन्य कॉलम के आधार पर डेटा प्रकार को उचित रूप से निर्धारित कर सकते हैं, तो आप इसे एक स्ट्रिंग के रूप में डालने का सुझाव देंगे।

YourTableName 
...more columns... 
ColType char(1)  --B=bit, S=smallint, I=int, R=real, n=nvarchar, you can FK to a table to store these or just check constraint them 
Col  nvarchar(x) --where x is large enought to hold your longest string or other value 
...more columns... 
नेट अनुप्रयोग में

, ColType में पढ़ सकते हैं और उस प्रकार के Col स्तंभ परिवर्तित:

+1

समाधान ठीक लगता है, लेकिन धारा डेटा की तुलना में धारावाहिक स्ट्रिंग या एक्सएमएल बहुत बड़ा (बाइट्स में) नहीं होगा? –

+0

@ गुइलेरमे, हां, यही कारण है कि मैंने कहा, 'मैं यह इंगित करता हूं कि "इसे क्रमबद्ध करना" डेटा को फट जाएगा "लेकिन यदि आपके पास वास्तविक डेटा प्रकार निर्धारित करने का कोई अन्य तरीका नहीं है, तो यह एक पतन-वापसी हो सकता है। – Brad

0

इस प्रयास करें। सहेजते समय, SQL सर्वर मूल डेटा प्रकारों को आपके लिए nvarchar() में परिवर्तित कर देगा।

+0

सुझाव के लिए धन्यवाद। लेकिन मैं डेटाबेस विकास और रूपांतरण प्रदर्शन हिट के कारण वर्चर (nvarchar) समाधान से परहेज कर रहा था। –

+0

हेक्टेयर, आपका चयनित उत्तर: "sql_variant" आपको कैसा लगता है कि बेहतर प्रदर्शन करेगा? –

1

मुझे यकीन है कि आप 'अज्ञात प्रकार' से क्या मतलब है नहीं कर रहा हूँ। यदि आपका मतलब है कि एक मूल्य एक सीमित संख्या में संभावित प्रकारों में से एक है तो मैं प्रत्येक तालिका के लिए दृढ़ता से टाइप की गई तालिका - एक 'सुपरक्लास' तालिका का उपयोग करता हूं ताकि आपको यह बताने के लिए कि कौन सी तालिका दिखानी है।

+0

वास्तव में यह मेरा वर्तमान समाधान है। लेकिन मैं तालिका क्रॉसिंग को बढ़ाने की कोशिश कर रहा था, और एकल "मान" तालिका के आधार पर प्रश्नों का चयन कर रहा था। यदि कोई अन्य विकल्प नहीं है, तो यह वही तरीका है जो यह रहने जा रहा है। –

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