2008-10-16 17 views
11

मेरे पास एक वेब-आधारित एप्लिकेशन है जो ईमेल के माध्यम से साइट पर गतिविधि के उपयोगकर्ताओं को सूचित करता है। उपयोगकर्ता चुन सकते हैं कि वे किस प्रकार के अधिसूचनाएं प्राप्त करना चाहते हैं। अब तक लगभग 10 अलग-अलग विकल्प हैं (प्रत्येक एक सत्य/झूठा है)।डाटाबेस में एकाधिक ध्वज स्टोर करने का सबसे अच्छा तरीका

मैं वर्तमान में इसे एक वर्चर फ़ील्ड में 0 या 1 को अल्पविराम से अलग कर रहा हूं। उदाहरण के लिए: 1,0,0,0,1,1,1,1,0,0

यह काम करता है लेकिन नई अधिसूचना झंडे को जोड़ना मुश्किल है और कौन सा ध्वज किस अधिसूचना से संबंधित है इसका ट्रैक रखना मुश्किल है। क्या ऐसा करने के लिए कोई स्वीकार्य मानक है? मैं प्रत्येक अधिसूचना प्रकार के लिए एक कॉलम के साथ एक और तालिका जोड़ने की सोच रहा था। तो अगर मुझे ज़रूरत है तो मैं नए कॉलम जोड़ सकता हूं, लेकिन मुझे यकीन नहीं है कि यह कितना कुशल है।

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

उत्तर

20

मैं दो टेबल का उपयोग करूंगा। एक तालिका उपयोगकर्ता डेटा और दूसरी सूचनाओं को संग्रहीत करेगी जो उन्होंने सदस्यता ली थी। दूसरी तालिका कुछ इस तरह दिखेगा:

create table notifications (
    user_id int, 
    notification_type int 
); 

मैं user_id और हटाने पर एक झरना के साथ उपयोगकर्ताओं को तालिका में उपयोगकर्ता की पहचान के बीच एक FK संबंध बनाने चाहते हैं। प्राथमिक कुंजी के रूप में user_id और अधिसूचना_ टाइप दोनों का प्रयोग करें। यह जांचने के लिए कि कोई उपयोगकर्ता एक विशेष अधिसूचना चाहता है, बस दो तालिकाओं के बीच जुड़ें और पंक्तियों का चयन करें जहां अधिसूचना_ प्रकार एक प्रश्न में मेल खाता है। यदि परिणाम सेट खाली नहीं है तो उपयोगकर्ता अधिसूचना चाहता है।

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

+0

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

+0

अच्छी तरह से काम करेगा, खासकर यदि आप अधिसूचना प्रकारों को स्कैन करने में सक्षम होना चाहते हैं। – BCS

+0

सामान्यीकरण एक्स्टेंसिबिलिटी के लिए बहुत अच्छा है, लेकिन यह प्रदर्शन पर थोड़ा सा पीड़ित है। – stephenbayer

0

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

(मैं नहीं डीबीए हूँ)

संपादित करें: थप्पड़ सिर "मैं सिर्फ सुझाव दिया कि वास्तव में क्या आप की बात कर रहे हैं": ख

2

मैं 10 विभिन्न बिट या bool क्षेत्रों का प्रयोग करेंगे। लेकिन यदि आप इसे एक फ़ील्ड में करने जा रहे हैं, तो आप बिटमैप 0x1111111111 को कॉमा के बिना एक बड़े पूर्णांक या टेक्स्ट फ़ील्ड के रूप में उपयोग कर सकते हैं। मैंने उन सभी तकनीकों का उपयोग करके विभिन्न अनुप्रयोगों पर काम किया है। लेकिन मैं वास्तव में कई क्षेत्रों के साथ जाना होगा। चुनिंदा वक्तव्य करना बहुत आसान होगा।

2

MySQL का उपयोग करना?

फिर, एसईटी डाटाटाइप जवाब है।

"MySQL SET डेटाटाइप MySQL तालिकाओं के भीतर एक पूर्णांक मान के रूप में संग्रहीत किया जाता है, और उपलब्ध तत्वों की संख्या के आधार पर एक से आठ बाइट्स पर कब्जा करता है।" -। http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html "

+1

एसईटी 64 झंडे तक सीमित है। – epochwolf

0

आप @stephenbayer की तरह उल्लेख आप हमेशा यह आसान डेवलपर्स का उपयोग करने के लिए बनाने के लिए मेज पर एक दृश्य का उपयोग कर सकते हैं एक सा क्षेत्र का उपयोग करने का फैसला किया है, तो यह तो मतलब है कि आप अभी भी की अंतरिक्ष बचत है बिट फ़ील्ड और प्रति फ़ील्ड अलग-अलग कॉलम के उपयोग की आसानी और कॉलम को पार्स करने से बचने के दौरान।

जैसा कि बताया गया है कि अलग-अलग तालिका एक उत्कृष्ट विकल्प है यदि आप अपना समाधान अधिक एक्स्टेंसिबल होना चाहते हैं।एकमात्र नकारात्मकता जटिलता में थोड़ी वृद्धि हुई है।

यह व्यापार बंद है। यदि आप ऐसा कुछ चाहते हैं जो कार्यान्वित करना वास्तव में आसान है और तेजी से थोड़ा सा क्षेत्र मानता है। यदि आप कुछ और जटिलता की लागत पर विस्तार करना और बनाए रखना आसान है तो हर तरह से अलग तालिका के लिए जाएं। यदि वोट आपको कुछ भी बताते हैं तो आप शायद अलग तालिका कार्यान्वयन का पालन करना चाहते हैं।

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

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