8

मैं अपने डेटाबेस में User तालिका डिज़ाइन कर रहा हूं। मेरे पास प्रत्येक उपयोगकर्ता के लिए लगभग 30 या तो विकल्प हैं जो या तो "अनुमति" या "अस्वीकार" हो सकते हैं।कई बिट्स संग्रहीत करना - क्या मुझे एकाधिक कॉलम या एक बिटफील्ड कॉलम का उपयोग करना चाहिए?

मेरा प्रश्न है कि मुझे इन्हें 30 bit कॉलम के रूप में स्टोर करना चाहिए या क्या मुझे उन्हें स्टोर करने के लिए एक int कॉलम का उपयोग करना चाहिए और मेरे आवेदन में प्रत्येक बिट को पार्स करना चाहिए?

इसके अलावा, हमारे डेटाबेस एसक्यूएल सर्वर 2008 और 2005 (पर्यावरण के आधार पर)

+1

@ मार्टिन मैंने अभी अपने प्रश्न – Earlz

उत्तर

4

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

5

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

आपके पास तालिका में एक हजार से अधिक कॉलम हो सकते हैं, या आपके पास उपयोगकर्ता सेटिंग्स के लिए एक बाल तालिका हो सकती है। खुद को 30 बिट्स तक सीमित क्यों करें जिन्हें आपको अपने ऐप में पार्स करने की आवश्यकता है? कल्पना करें कि ऐप में आपको किस तरह के बदलाव की आवश्यकता होगी यदि इनमें से कई सेटिंग्स बहिष्कृत हैं या कुछ नए लोगों को पेश किया गया है।

4

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

11

मैं सिर्फ दो तालिकाओं, एक भी पूर्णांक स्तंभ के साथ एक 30 बिट कॉलम के साथ एक बनाने की कोशिश की तो प्रत्येक के लिए एक पंक्ति जोड़ा गया है और 30 बिट के साथ तालिका के लिए SQL Server Internals Viewer

CREATE TABLE T_INT(X INT DEFAULT 1073741823); 

CREATE TABLE T_BIT(
X1 BIT DEFAULT 1, 
/*Other columns omitted for brevity*/ 
X30 BIT DEFAULT 1 
); 

INSERT INTO T_INT DEFAULT VALUES; 

INSERT INTO T_BIT DEFAULT VALUES; 

एकल पंक्ति के साथ उन्हें देखा कॉलम

BITS

एक पूर्णांक कॉलम के साथ तालिका के लिए एकल पंक्ति

INT

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

फ़ील्ड के लिए कुंजी (int के लिए संस्करण, रंग कोडिंग बिट संस्करण के लिए एक ही) है

Int key

+2

में जोड़ा तकनीकी विवरण देने के लिए +1 – Earlz

+0

समय के साथ टूटी हुई छवियों को अपडेट करेगा। –

+0

और यही कारण है कि आपको हमेशा भविष्य में छवियों के लिए imgur का उपयोग करना चाहिए;) – Earlz

1

मैं मानता हूँ अपने डिजाइन ठीक से सामान्यीकृत किया जाना चाहिए, तीन टेबल उपयोगकर्ता और उपयोगकर्ता की स्थापना, और एक पुल तालिका:

उपयोगकर्ता:

प्रयोक्ता आईडी पूर्णांक

उपयोगकर्ता नाम varchar (एक्स)

UserSetting:

Settingid पूर्णांक

SettingName varchar (एक्स)

UserUserSetting:

प्रयोक्ता आईडी पूर्णांक

SettingId पूर्णांक

isset सा

वहाँ FK के पुल तालिका और UserUserSetting UserSetting और उपयोगकर्ता तालिका और टी प्रयोक्ता-आईडी का एक अनूठा contr बाधा के बीच हो सकता है, SettingId उपयोगकर्ता यूज़रसेटिंग

+1

+1 सामान्यीकरण के लिए ब्रावो। हालांकि, 'UserUserSetting' की आवश्यकता है। क्या पंक्ति का अस्तित्व इंगित नहीं करेगा कि उपयोगकर्ता के लिए उपयोगकर्ता सेटिंग सक्षम है? – bobs

+2

किसी उपयोगकर्ता की बजाय एक विशेषता के रूप में प्रत्येक उपयोगकर्ता सेटिंग का इलाज करने से 1 एनएफ का उल्लंघन नहीं होता है। जिस तरह से सवाल phrased है, हालांकि एक सामान्य अवधारणा के रूप में एक "उपयोगकर्ता सेटिंग" का इलाज करता है; इस मॉडल में उपयोगकर्ता सेटिंग एक इकाई है और एक टेबल की आवश्यकता है। उपयोगकर्ता सेटिंग्स का उपयोग कैसे किया जाता है इसके बारे में अधिक जानकारी और यह समझने के लिए कि कौन सा दृष्टिकोण बेहतर फिट है, विशिष्ट उदाहरणों की आवश्यकता है। –

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