2011-02-07 12 views
5

मैं अपने सीएमएस के लिए अपने उपयोगकर्ता मॉड्यूल में एक नई सुविधा जोड़ रहा हूं और मैंने सड़क ब्लॉक मारा है ... या मुझे लगता है, सड़क में एक कांटा, और मैं स्टेक ओवरफ्लो से कुछ राय प्राप्त करना चाहता था इससे पहले कि मैं प्रतिबद्ध हूं कुछ भी।
असल में मैं व्यवस्थापक को नए, 'अतिरिक्त' उपयोगकर्ता फ़ील्ड जोड़ने की अनुमति देना चाहता हूं जो उपयोगकर्ता पंजीकरण पर भर सकते हैं, अपनी प्रोफ़ाइल में संपादित कर सकते हैं, और/या अन्य मॉड्यूल द्वारा नियंत्रित किए जा सकते हैं। इसका एक उदाहरण जन्मदिन का क्षेत्र होगा, स्वयं का एक लंबा विवरण होगा, या शायद उपयोगकर्ता द्वारा साइट पर अर्जित अंक हो सकता है। कहने की जरूरत नहीं है, संग्रहीत डेटा अलग-अलग होगा और बड़ी मात्रा में पाठ से, एक छोटे पूर्णांक मूल्य तक हो सकता है। मामलों को और खराब बनाने के लिए - मैं चाहता हूं कि इस डेटा को खोजने का विकल्प हो।MySQL में 'अतिरिक्त' उपयोगकर्ता डेटा स्टोर करने का सबसे अच्छा तरीका?

इस तरह से - यह करने का सबसे अच्छा तरीका क्या होगा? अभी मैं निम्नलिखित कॉलम के साथ एक टेबल रखने की ओर झुका रहा हूँ।

userid, refFieldID, varchar, tinyint, smallint, int, text, date, datetime, etc. 

मैं इस पसंद के रूप में यह काफी तेजी से खोज करने के होगा, और संदर्भ तालिका (जो इस तरह के क्षेत्र के रूप में क्षेत्र के डेटा की सभी या रखती है, चाहे वह खोजा है नहीं, आदि) कर सकते हैं संदर्भ उस क्षेत्र के लिए डेटा संग्रहीत करते समय किस कॉलम का उपयोग किया जाना चाहिए।

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

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

उत्तर

3

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

  • 1 मध्यम/LongText या मध्यम/मनमाने ढंग से पाठ के लिए longblob क्षेत्र/बाइनरी स्टोरेज (स्ट्रिंग लम्बाई के लिए 3-4 बाइट्स के ओवरहेड को संग्रहीत किया जाता है)। मध्यम से अधिक समय चुनने का एकमात्र कारण 2^24 बाइट्स (16.7 एमबी) बनाम 2^32 बाइट्स (2 जीबी) में संग्रहीत किया जा सकता है।
  • 1 पूर्णांक (4 बाइट्स) या bigint (8 बाइट्स)
  • 1 datetime (8 बाइट्स)
  • शायद 1 नाव या डबल (4-8 बाइट्स) चल बिन्दु भंडारण

इन क्षेत्रों के लिए आपको तालिका में लगभग किसी भी प्रकार के डेटा को स्टोर करने की अनुमति देगा, लेकिन तालिका की चौड़ाई को बढ़ाए बिना ** (एक वक्रार की तरह) और किसी भी अनावश्यक भंडारण से बचें (जैसे टिनिंट और मॉडिंट इत्यादि)। लांगटेक्स्ट फ़ील्ड में संग्रहीत पाठ को अभी भी पूर्ण टेक्स्ट इंडेक्स या नियमित सीमित लंबाई सूचकांक (उदा। index longtext_storage(8)) का उपयोग करके उचित रूप से खोजा जा सकता है।

** सभी ब्लॉब मान, जैसे कि लांगटेक्स्ट, मुख्य तालिका से स्वतंत्र रूप से संग्रहीत किए जाते हैं।

+0

वाह धन्यवाद, मैं वास्तव में # 1 से सहमत पहले व्यक्ति को जवाब देने जा रहा था, कौन से कॉलम चुनने के लिए - लेकिन मुझे लगता है कि मुझे अब और नहीं करना है :)। आपकी पोस्ट के बारे में - क्या आपका मतलब टेक्स्ट और ब्लॉब, int और bigint है? या एक या दूसरे? इसके अलावा आप 'बूल' (टिनिंट (1)) कॉलम जोड़ने के बारे में कैसा महसूस करते हैं? मैं देख सकता था कि बहुत उपयोगी और संभवतः बहुत उपयोग किया जा रहा है - क्या आपकी राय में 3 बाइट बचाए जाएंगे? इसके अलावा, कॉलम की संख्या डिस्क पर एक पंक्ति के आकार को बढ़ाती है? बेशक खाली कॉलम। मैं आपके (कमाल) टेबल लेआउट पर संदेह नहीं कर रहा हूं, बस उत्सुक हूं। – Jon

+0

मेरी सूची में प्रत्येक आइटम के लिए प्रत्येक 1, इसलिए 3 या 4 कुल कॉलम, इस पर निर्भर करता है कि आप फ्लोट समर्थन चाहते हैं या नहीं। टिनिंट (1) के लिए - पूर्णांक कॉलम में उन्हें स्टोर करें। आप tinyint (1) जोड़कर एक बाइट बर्बाद कर रहे हैं, बचत नहीं 3. आपकी तालिका में प्रत्येक पंक्ति हमेशा MySQL में एक ही चौड़ाई है - यह अन्य आरडीबीएमएस में समान काम करती है। (कैसे वर्चर्स इसे प्रभावित करते हैं थोड़ा जटिल हो जाता है।) "चौड़ाई" को "पंक्ति आकार" भी कहा जाता है। – wuputah

0

एक तकनीक जो आपके लिए काम कर सकती है वह इस मनमानी डेटा को टेक्स्ट के रूप में स्टोर करना है, जेएसओएन, एक्सएमएल, या वाईएएमएल जैसे कुछ नोटेशन में। यह निर्णय इस बात पर निर्भर करता है कि आपको डेटा तक पहुंचने की आवश्यकता होगी: यदि आप केवल उपयोगकर्ता डेटा के प्रत्येक उपयोगकर्ता के पूर्ण हिस्से को देखते हैं, तो यह आदर्श हो सकता है। यदि आपको उपयोगकर्ता डेटा में विशिष्ट फ़ील्ड पर SQL क्वेरी चलाने की आवश्यकता है, तो आपको शुद्ध SQL या हाइब्रिड दृष्टिकोण का उपयोग करने की आवश्यकता होगी।

कई नए, उच्च स्केलेबल "नोएसक्यूएल" सिस्टम जेएसओएन डेटा (उदाहरण के लिए, मोंगोडीबी, कॉच डीबी, और प्रोजेक्ट वोल्डमॉर्ट) का पक्ष लेते हैं। यह अच्छा और terse है, और आप मनमाने ढंग से जटिल संरचनाएं बना सकते हैं जिसमें मानचित्र (JSON ऑब्जेक्ट्स) और सूचियां (JSON arrays) शामिल हैं।

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