2012-02-02 11 views
6

मुझे एक पोस्टिंग तालिका में एक चयन क्वेरी करना है जहां एक पूर्णांक का एक विशिष्ट बिट सेट किया गया है। पूर्णांक बिटमैस्क में श्रेणियों के एक सेट का प्रतिनिधित्व करता है: E.g.mySQL SELECT पंक्तियां जहां एक पूर्णांक का एक विशिष्ट बिट सेट किया गया है

1 => health 
2 => marketing 
3 => personal 
4 => music 
5 => video 
6 => design 
7 => fashion 
8 => ...... 

डेटा का उदाहरण:

id | categories | title 
1 | 11   | bla bla 
2 | 48   | blabla, too 

मैं एक mysql क्वेरी कि पोस्टिंग, कि एक विशिष्ट श्रेणी के साथ चिह्नित हैं का चयन करता है की जरूरत है। के कहते हैं कि "सभी वीडियो पोस्टिंग" इसका मतलब यह है मैं पोस्टिंग की एक परिणाम सेट जहां catgories स्तंभ की 5 वीं बिट सेट कर दिया जाता आवश्यकता है (उदाहरण के लिए 16,17,48 ....)

SELECT * FROM postings WHERE ....???? 

कोई भी विचार?

+1

समूह करने की क्षमता खो देते हैं तो श्रेणियों_पॉस्टिंग्स के बीच में कोई अतिरिक्त तालिका क्यों नहीं है, तो एक जीबी तालिका में कुछ एमबी सहेजना कोई लाभ नहीं है? यह भविष्य का सबूत समाधान होगा क्योंकि यह केवल एक मानक एकाधिक श्रेणियों डेटाबेस लगता है? –

+1

मैं ल्यूक से सहमत हूं, यह एक अतिरिक्त तालिका को बनाए रखने के लिए आसान होगा, जिसे कहते हैं, श्रेणियां_ग्रुप, जिसमें एक संरचना होगी: id, category_group_name, स्वास्थ्य, विपणन, व्यक्तिगत, संगीत ... और जो या तो प्रत्येक श्रेणी के अंतर्गत "0"/"1" यह चिह्नित करने के लिए कि क्या यह श्रेणी इस समूह से संबंधित है। इस तरह "समूहों" श्रेणी में शामिल समूहों की संख्या को जोड़ना भी अधिक आसान होगा। – alfasin

+0

@Luc - आप दोनों सही हैं - तथ्य यह है कि डेटा बाहरी एप्लिकेशन द्वारा प्रकाशित किया जाता है जहां मैं कोई बदलाव नहीं कर सकता। कई सारे रिश्तों का सबसे अच्छा समाधान होगा .... – derRobert

उत्तर

9

आप इस तरह के bitwise ऑपरेटरों का उपयोग कर सकते हैं। वीडियो के लिए (बिट 5):

WHERE categories & 16 = 16 

स्थानापन्न मूल्य 16 प्रत्येक बिट के लिए निम्न मान का उपयोग कर:

1 = 1 
2 = 2 
3 = 4 
4 = 8 
5 = 16 
6 = 32 
7 = 64 
8 = 128 

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

+0

उपरोक्त मैपिंग को सरलीकृत किया जा सकता है: bitVal = 2^(i-1), जहां मैं बाईं ओर इंडेक्स वैल्यू हूं। तो, उदाहरण के लिए, 16 = 2^(5-1)। –

2

कैसे इस के साथ

के बारे में
SELECT * FROM postings WHERE (categories & 16) > 0; -- 16 is 5th bit over 

एक मुद्दा तो आप शायद एक सूचकांक हिट नहीं होगा, ताकि आप पर्फ़ मुद्दों में अगर यह डेटा की एक बड़ी राशि है चला सकते है।

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

-1

एसक्यूएल (केवल mySQL नहीं) bitwise संचालन के लिए उपयुक्त नहीं है। यदि आप थोड़ा सा करते हैं और आप टेबल स्कैन को मजबूर करेंगे क्योंकि SQL किसी भी इंडेक्स का उपयोग करने में सक्षम नहीं होगा और एक ही समय में प्रत्येक पंक्ति को जांचना होगा।

यह बेहतर होगा अगर आपने अलग "श्रेणियां" तालिका बनाई और दोनों को जोड़ने के लिए एक उचित तरीके से अनुक्रमित कई पोस्टिंग कैटलॉग तालिका बनाई।

अद्यतन

कि बिटमैप क्षेत्रों आग्रह लोगों के लिए एक मुद्दा नहीं हैं, यह जो सेलको के BIT of a Problem जाँच करने के लिए मदद करता है। लेख के निचले भाग में बिटमैप्स के कारण गंभीर समस्याओं की एक सूची है।

टिप्पणी कि एक कंबल बयान सही नहीं किया जा सकता, ध्यान दें # 10 के बारे में - यह 1NF टूट जाता है तो हाँ, बिटमैप क्षेत्रों बुरा कर रहे हैं:

  1. डेटा पढ़ने योग्य नहीं है। ...
  2. बाधाएं लिखने के लिए एक बी #### हैं ....
  3. आप प्रति फ़ील्ड में दो मान तक सीमित हैं। यह बहुत ही सीमित है; यहां तक ​​कि आईएसओ सेक्स कोड भी ऐसे कॉलम में फिट नहीं हो सकता है ...
  4. बिट मास्क (या एकल बिट झंडे) के लिए कोई अस्थायी तत्व नहीं है। उदाहरण के लिए, एक ध्वज "is_legal_adult_flg" है ... जन्म तिथि (केवल 3 बाइट्स) के लिए एक तिथि पूरी तथ्य रखेगी और हमें गणना करने की आवश्यकता है जो हमें जानने की आवश्यकता है; यह हमेशा भी सही होगा। ...
  5. आपको पता चलेगा कि झंडे का उपयोग कई इकाइयों पर एक इकाई की स्थिति को विभाजित करने के लिए होगा ....
  6. बिट झंडे अनावश्यकता को आमंत्रित करते हैं। सिस्टम में मैंने अभी उल्लेख किया है, उसी तालिका में हमारे पास "is_active_flg" और "is_completed_flg" था। एक पूर्ण नीलामी सक्रिय और उपाध्यक्ष नहीं है। यह दो झंडे में एक ही तथ्य है। मानव मनोविज्ञान (और अंग्रेजी भाषा) एक सकारात्मक शब्द सुनना पसंद करता है (पुराने गीत को याद रखें "हां, हमारे पास आज कोई केले नहीं है!"?)। इन सभी बिट झंडे, और अनुक्रम सत्यापन को राज्य संक्रमण तालिका के दो सेट, बोलियों के लिए एक और शिपमेंट के लिए प्रतिस्थापित किया जा रहा है। राज्य संक्रमण बाधाओं के विवरण के लिए। प्रत्येक नीलामी का इतिहास अब एक ही स्थान पर है और इसे व्यवसाय नियमों का पालन करना है।
  7. जब तक आप थोड़ा मास्क कॉलम डिस्सेबल करते हैं, और उन फ़ील्ड को फेंक देते हैं जिनके लिए आपको प्रदर्शन की आवश्यकता नहीं होती है, सरल डेटा प्रकारों में सुधार नहीं किया जा रहा है।
  8. व्यक्तिगत क्षेत्रों पर समूह बनाना और ऑर्डर करना वास्तविक दर्द है। कोशिश करो।
  9. आपको पूरे कॉलम को इंडेक्स करना होगा, इसलिए जब तक कि आप भाग्य न लें और उन्हें सही क्रम में न रखें, तो आप टेबल स्कैन के साथ फंस गए हैं।
  10. चूंकि थोड़ा मास्क पहले सामान्य फॉर्म (1 एनएफ) में नहीं है, इसलिए आपके पास सभी विसंगतियां हैं जिन्हें हम आरडीबीएमएस में टालना चाहते थे।

मैं भी जोड़ूंगा, एनयूएलएस के बारे में क्या? के बारे में झंडे क्या है? क्या होगा अगर कुछ सच या गलत न हो?

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

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

+0

यह सटीक होने के लिए एक कंबल कथन का बहुत अधिक है। यह सच है कि आप बिटवाई फ़ील्ड में इंडेक्स स्कैन करने में सक्षम नहीं होंगे, हालांकि, वे अक्सर काम में आ सकते हैं और स्टोरेज आकार में भारी कमी कर सकते हैं, या आप जिस चीज के लिए जा रहे हैं उसके आधार पर क्वेरी स्पीडअप ले सकते हैं। – delrox

+1

यदि आपकी खोज केवल "अंतिम मील" के लिए बिटमैपड फ़ील्ड का उपयोग कर रही है - दूसरे शब्दों में आपने कुछ सौ रिकॉर्ड तक बहुत अधिक खोज को संकुचित कर दिया है या इसलिए अन्य फ़ील्ड/इंडेक्स का उपयोग कर - तो वहां बहुत कुछ नहीं है एक पर्फ मुद्दे से चिंतित होना चाहिए। मजबूत स्थैतिक डेटासेट्स बिटमैप किए गए फ़ील्ड के लिए, जैसा कि अन्य ने उल्लेख किया है, डेटा संपीड़न का एक अच्छा रूप है। (हम सप्ताह में एक नया दिन नहीं जोड़ेंगे और न ही किसी भी दिन किसी भी नए दिन उदाहरण के लिए जल्द ही ...) – Techmag

+1

@Techmag वास्तव में, नहीं। डीबीए आमतौर पर बिटमैप फ़ील्ड से नफरत करते हैं क्योंकि वे समस्याओं का * बहुत * कारण बनते हैं, उनमें से एक प्रदर्शन करते हैं। वे डेटा को अपठनीय बनाते हैं, बाधाओं के उपयोग को रोकते हैं और अधिक। जो सेल्को की [बीआईटी ऑफ़ प्रॉब्लम] की जांच करें (https://www.simple-talk.com/sql/t-sql-programming/bit-of-a-problem/)। जिसे आप संपीड़न कहते हैं, खासकर दिनों के लिए, एक साधारण प्रकार या enum मूल्य के साथ प्रतिस्थापित किया जाएगा। वास्तव में, आप केवल संपीड़न * के बारे में बहस कर सकते हैं * यदि आप बैकिंग फ़ील्ड पर सभी बिट्स का उपयोग कर सकते हैं। अन्यथा आप बर्बाद हो जाएंगे, उदाहरण के लिए 16-बिट बिल्ड –

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