2013-09-04 8 views
5

मेरे पास उपयोगकर्ता की एक तालिका है जहां 1 कॉलम उपयोगकर्ता की "भूमिकाएं" संग्रहीत करता है। हम विशेष उपयोगकर्ता को एकाधिक भूमिका असाइन कर सकते हैं।एकल कॉलम में एकाधिक मानों को कैसे स्टोर करें जहां कम स्मृति का उपयोग करें?

फिर मैं "भूमिकाएं" कॉलम में भूमिका आईडी स्टोर करना चाहता हूं।

लेकिन स्मृति का उपयोग करने के लिए आसान तरीके से सहेजने के लिए मैं एकाधिक मानों को एक कॉलम में कैसे स्टोर कर सकता हूं? उदाहरण के लिए, अल्पविराम-सीमित क्षेत्र का उपयोग करके संग्रहीत करना आसान नहीं है और स्मृति का उपयोग करता है।

कोई विचार?

+1

क्या स्मृति को बचाने करता है आप के लिए क्या मतलब? –

+0

mysql की स्मृति को बचाने का मतलब आकार में है और उपयोग करने में आसान – harsh4u

+1

इसका उपयोग करना आसान नहीं होगा, और यह किसी भी स्मृति को सहेज नहीं पाएगा। बस कई कॉलम का उपयोग करें। –

उत्तर

0

आप इसे FIND_IN_SET

+4

यह प्रदर्शन में सुधार नहीं करता है, डीबी को अभी भी मिलान खोजने के लिए पूरी तालिका को स्कैन करना होगा। – DCoder

+0

सेशन एकल कॉलम/एक ही टेबल चाहता था, इसलिए यह एक अच्छा जवाब आईएमओ है। बहु-तालिका की अतिरिक्त जटिलता के बिना ओप बेहतर हो सकता है .. कौन जानता है :) – akostadinov

+2

@akostadinov यह एक क्लासिक [XY समस्या] है (http://meta.stackexchange.com/q/66377/226333)। जबकि उपयोगकर्ता एक चीज़ मांग रहा है, इस मामले में यह निश्चित रूप से वह नहीं है जो वे चाहते हैं। एक मल्टी-टेबल समाधान भविष्य में बनाए रखने के लिए क्लीनर, तेज़ और अधिक आसान होगा। –

10

का प्रयोग कर एक उपयोगकर्ता अधिक भूमिकाएं हो सकते हैं खोजने के लिए इस

INSERT INTO table (id, roles) VALUES ('', '2,3,4'); 

तब की तरह कुछ कर सकता है, यह शायद एक user_role मेज है कि इस जानकारी का भंडार है करने के लिए बेहतर है। यह सामान्यीकृत है, और पूछताछ करना बहुत आसान होगा।

एक टेबल की तरह:

user_id | role 
--------+----------------- 
     1 | Admin 
     2 | User 
     2 | Admin 
     3 | User 
     3 | Author 

आप बल्कि एक स्तंभ से बाहर जानकारी पाने के लिए पार्स करने स्ट्रिंग का उपयोग किए की तुलना में इस तरह के SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' के रूप में एक विशेष भूमिका के साथ सभी उपयोगकर्ताओं के लिए क्वेरी करने के लिए अनुमति देते हैं जाएगा।

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

कारण यह संग्रहीत नहीं किया जाना चाहिए कि यह अक्षम है, क्योंकि डीसीओडर comment to this answer पर बताता है। यह जांचने के लिए कि क्या उपयोगकर्ता की भूमिका है, उपयोगकर्ता तालिका की प्रत्येक पंक्ति को स्कैन करने की आवश्यकता होगी, और उसके बाद स्ट्रिंग मिलान का उपयोग करके "भूमिकाएं" कॉलम स्कैन किया जाना चाहिए - इस कार्रवाई के प्रकटीकरण के बावजूद, आरएमडीबीएस को सामग्री को पार्स करने के लिए स्ट्रिंग ऑपरेशंस करें। ये बहुत महंगा संचालन हैं, न कि सभी अच्छे डेटाबेस डिज़ाइन पर।

आप जरूरत एकल स्तंभ होनी चाहिए, तो मैं दृढ़ता से सुझाव है कि तुम अब एक तकनीकी समस्या है, लेकिन एक लोगों के प्रबंधन एक। विकास के तहत मौजूद मौजूदा डेटाबेस में अतिरिक्त तालिकाओं को जोड़ना मुश्किल नहीं होना चाहिए। यदि यह ऐसा कुछ नहीं है जिसे आप करने के लिए अधिकृत हैं, तो स्पष्ट करें कि सही व्यक्ति को अतिरिक्त तालिका की आवश्यकता क्यों है - क्योंकि munging एकल कॉलम में एकाधिक मान खराब हैं, खराब विचार

+0

ठीक है .. लेकिन मेरे प्रश्न – harsh4u

+0

@ harsh4u में वर्णित एक कॉलम में स्टोर होना चाहिए। कोई तकनीकी कारण नहीं है कि इसे एक कॉलम होने की आवश्यकता है, इसलिए मैंने कुछ और विवरण जोड़ा है। –

1

अपने प्रश्न मैं क्या मिला से,

मान लीजिए, आप तालिका करने के लिए है। एक "भोजन" तालिका है और दूसरा एक "combo_meal" तालिका है। अब मुझे लगता है कि आप कोमा [!] को अलग किए बिना एक combo_meal_id के अंदर एकाधिक food_id स्टोर करना चाहते हैं। और आपने कहा कि यह आपके डीबी को अधिक मानक बना देगा।

यदि मुझे आपके प्रश्न से गलत नहीं मिल रहा है तो कृपया ध्यान से मेरे सुझाव को पढ़ें। यह आपकी मदद कर सकता है।

सबसे पहले सोचें कि आपकी अवधारणा सही है। निश्चित रूप से यह आपको अधिक मानक डीबी देगा।

इसके लिए आपको उन दो तालिका डेटा को संदर्भित करने के लिए एक और तालिका [उदाहरण तालिका: combo_meal_relation] बनाना होगा। एक दृश्य उदाहरण हो सकता है इसे साफ़ कर देगा।

meal table 

+------+--------+-----------+---------+ 
| id | name | serving | price | 
+------+--------+-----------+---------+ 
| 1 | soup1 | 2 person | 12.50 | 
+------+--------+-----------+---------+ 
| 2 | soup2 | 2 person | 15.50 | 
+------+--------+-----------+---------+ 
| 3 | soup3 | 2 person | 23.00 | 
+------+--------+-----------+---------+ 
| 4 | drink1 | 2 person | 4.50 | 
+------+--------+-----------+---------+ 
| 5 | drink2 | 2 person | 3.50 | 
+------+--------+-----------+---------+ 
| 6 | drink3 | 2 person | 5.50 | 
+------+--------+-----------+---------+ 
| 7 | frui1 | 2 person | 3.00 | 
+------+--------+-----------+---------+ 
| 8 | fruit2 | 2 person | 3.50 | 
+------+--------+-----------+---------+ 
| 9 | fruit3 | 2 person | 4.50 | 
+------+--------+-----------+---------+ 

combo_meal table 

+------+--------------+-----------+ 
| id | combo_name | serving | 
+------+--------------+-----------+ 
| 1 | combo1  | 2 person | 
+------+--------------+-----------+ 
| 2 | combo2  | 2 person | 
+------+--------------+-----------+ 
| 4 | combo3  | 2 person | 
+------+--------------+-----------+ 

combo_meal_relation 

+------+--------------+-----------+ 
| id | combo_meal_id| meal_id | 
+------+--------------+-----------+ 
| 1 |  1  |  1 | 
+------+--------------+-----------+ 
| 2 |  1  |  2 | 
+------+--------------+-----------+ 
| 3 |  1  |  3 | 
+------+--------------+-----------+ 
| 4 |  2  |  4 | 
+------+--------------+-----------+ 
| 5 |  2  |  2 | 
+------+--------------+-----------+ 
| 6 |  2  |  7 | 
+------+--------------+-----------+ 

जब आप तालिका के अंदर खोज करते हैं तो यह तेज़ परिणाम उत्पन्न करेगा।

खोज क्वेरी:

SELECT m.* 
FROM combo_meal cm 
JOIN meal m 
ON  m.id = cm.meal_id 
WHERE cm.combo_id = 1 

उम्मीद है कि आप समझते हैं :)

2

तुम भी MySQL के साथ बिटवाइज़ तर्क का उपयोग कर सकते हैं। role_id आधार 2 में होना चाहिए (0, 1, 2, 4, 8, 16, 32 ...)

role_id | label 
--------+----------------- 
     1 | Admin 
     2 | User 
     4 | Author 

user_id | name | role 
--------+----------------- 
     1 | John | 1 
     2 | Steve | 3 
     3 | Jack | 6 

बिटवाइस तर्क आप सभी उपयोगकर्ता भूमिकाओं का चयन करने के लिए अनुमति देता है

SELECT * FROM users WHERE role & 1 
-- returns all Admin users 

SELECT * FROM users WHERE role & 5 
-- returns all users who are admin or Author because 5 = 1 + 4 

SELECT * FROM users WHERE role & 6 
-- returns all users who are User or Author because 6 = 2 + 4 
संबंधित मुद्दे