2012-06-06 23 views
11

में कई लोगों के साथ संबंध कैसे हैं, मेरे पास एक उपयोगकर्ता तालिका, एक श्रेणी तालिका और उपयोगकर्ता-श्रेणी तालिका है जो कई रिश्तों को कई करती है। इस संरचना को रेडिस में रखने का बेहतर रूप क्या है? है दोस्तों के साथ एक सूची, एक महत्वपूर्ण और डेटा के रूप में user_id के साथ एक "तालिका" बनाने के उदाहरण के लिए:एक रिलेशनल डेटाबेस में रेडिस

उत्तर

27

रेडिस के साथ, संबंध आमतौर पर सेट द्वारा दर्शाए जाते हैं। एक सेट का उपयोग एक तरफा रिश्ते का प्रतिनिधित्व करने के लिए किया जा सकता है, इसलिए आपको कई से अधिक रिश्तों का प्रतिनिधित्व करने के लिए प्रति ऑब्जेक्ट की एक सेट की आवश्यकता है।

रेडिस डेटा संरचनाओं के लिए एक संबंधपरक डेटाबेस मॉडल की तुलना करने की कोशिश करने के लिए यह बहुत बेकार है। रेडिस के साथ, सब कुछ एक असामान्य तरीके से संग्रहीत किया जाता है।

उदाहरण:

# Here are my categories 
> hmset category:1 name cinema ... more fields ... 
> hmset category:2 name music ... more fields ... 
> hmset category:3 name sports ... more fields ... 
> hmset category:4 name nature ... more fields ... 

# Here are my users 
> hmset user:1 name Jack ... more fields ... 
> hmset user:2 name John ... more fields ... 
> hmset user:3 name Julia ... more fields ... 

# Let's establish the many-to-many relationship 
# Jack likes cinema and sports 
# John likes music and nature 
# Julia likes cinema, music and nature 

# For each category, we keep a set of reference on the users 
> sadd category:1:users 1 3 
> sadd category:2:users 2 3 
> sadd category:3:users 1 
> sadd category:4:users 2 3 

# For each user, we keep a set of reference on the categories 
> sadd user:1:categories 1 3 
> sadd user:2:categories 2 4 
> sadd user:3:categories 1 2 4 

एक बार जब हम इस डेटा संरचना है, यह यह सेट बीजगणित का उपयोग कर क्वेरी करने के लिए आसान है:

# Categories of Julia 
> smembers user:3:categories 
1) "1" 
2) "2" 
3) "4" 

# Users interested by music 
> smembers category:2:users 
1) "2" 
2) "3" 

# Users interested by both music and cinema 
> sinter category:1:users category:2:users 
1) "3" 
+0

धन्यवाद! मैं रेडिस के लिए नया हूं और यह बहुत दिलचस्प है :) – starikovs

+0

हम श्रेणी स्मेम्बर श्रेणी का नाम कैसे प्राप्त करेंगे: 2: इसके साथ उपयोगकर्ता क्योंकि यह श्रेणी संख्या देता है – vaibhav

4

IMHO Redis संरचित querys (SQL) लेकिन तेजी से नहीं पहुंच डेटा के लिए, क्या तुम कर सकते हो यह है बनाने के लिए नहीं है । फिर आप user_id के लिए पूछताछ करते हैं और आपको जो चाहिए उसे संसाधित करते हैं। यह सामान्यीकरण के विपरीत है। यदि डेटा का क्रम महत्वपूर्ण है, उदाहरण के लिए स्थिति अपडेट, आप जो करते हैं वह सूचियों में पुश और पॉप डेटा है। उदाहरण के लिए, तालिका "स्थिति" में user_id कुंजी के रूप में है और डेटा एक सूची है। आप डेटा lpush और फिर उदाहरण के लिए पिछले 20 तत्वों से पूछताछ करें।

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