2010-05-26 14 views
10

उपयोगकर्ता संबंधों को स्टोर करने का सबसे अच्छा तरीका क्या है, उदा। दोस्ती, जो एक रिश्ते में बिडरेक्शनल होना चाहिए (आप मेरे दोस्त हैं, इस प्रकार मैं आपका मित्र हूं)। डेटाबेस, उदा। माई एसक्यूएल?संबंधपरक डेटाबेस में 1: 1 उपयोगकर्ता संबंधों को स्टोर करने का सबसे अच्छा तरीका

मैं दो तरीकों के बारे में सोच सकते हैं:

  1. हर एक उपयोगकर्ता मित्र किसी अन्य उपयोगकर्ता, मैं एक डेटाबेस के लिए दो पंक्तियों जोड़ना होगा, innitiating उपयोगकर्ता का उपयोगकर्ता आईडी की यूआईडी के बाद का एक मिलकर पंक्ति अगले कॉलम में स्वीकार्य उपयोगकर्ता। पंक्ति बी विपरीत होगा।
  2. आप यूआईडी (उपयोगकर्ता को स्वीकार करने) के बाद केवल एक पंक्ति, यूआईडी (उपयोगकर्ता शुरू करना) जोड़ देंगे; और उसके बाद यह पता लगाने की कोशिश करते समय दोनों कॉलम के माध्यम से खोजें कि क्या उपयोगकर्ता 1 उपयोगकर्ता का मित्र है 2.

निश्चित रूप से कुछ बेहतर है?

+0

लगता है जैसे आपके पास डिज़ाइन सही है। प्रत्येक तालिका और एसोसिएशन टेबल के बीच 0..1 या कई बनाने के लिए दो तालिकाओं के बीच एक संबंध है जो आपका प्रतिबिंब है। अंत में यह नेट कितने लोगों के लिए है। लेकिन मुझे इसे इस तरह से संभालने के साथ अपना अधिकार कहना चाहिए। –

उत्तर

8

मेरे पास दोस्तों के लिए एक लिंक टेबल होगा, या जो कुछ भी 2 कॉलम पीके के साथ होगा, और दोनों उपयोगकर्ता तालिका में एफके हैं।

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

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

+5

बस याद रखें कि MySQL में डिफ़ॉल्ट इंजन MyISAM विदेशी कुंजी का समर्थन नहीं करता है, InnoDB पर स्विच करें। –

+0

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

+2

के साथ चिपक गया है, मैं इस प्रणाली के साथ-साथ यह बहुत सरल बनाता हूं मित्रों को देखने के लिए चुनिंदा प्रश्न, विशेष रूप से जब आपको इस तालिका के खिलाफ शामिल होने की आवश्यकता होती है। हालांकि आपको यह सुनिश्चित करने के लिए लेनदेन और संग्रहीत प्रक्रियाओं का उपयोग करना चाहिए कि दोनों पंक्तियां हमेशा एक साथ डाली जाती हैं और एक साथ हटा दी जाती हैं (आप ** ** ** दो पंक्तियों में से किसी एक को गलती से हटाना नहीं चाहते हैं)। –

3

डबल पंक्तियों का उपयोग करते हुए, यह अतिरिक्त डेटा बनाता है, आपके प्रश्नों को बहुत सरल बना देगा और आपको स्मार्ट रूप से अनुक्रमित करने की अनुमति देगा। मुझे ट्विटर के कस्टम MySQL समाधान पर जानकारी देखने को भी याद है जिसमें उन्होंने स्वचालित सीमा और पेजिंग करने के लिए एक अतिरिक्त फ़ील्ड (दोस्त #, मूल रूप से) का उपयोग किया था। यह बहुत चिकनी लगता है: https://blog.twitter.com/2010/introducing-flockdb

-6

उदाहरण के लिए कैसंड्रा जैसे एक महत्वपूर्ण मूल्य स्टोर का उपयोग करें।

+0

अनुरोध विशेष रूप से एक MySQL समाधान के संबंध में था। – ethanpil

3

आप जांच सकते हैं कि इनमें से कौन से उपयोगकर्ता_आईडी सबसे कम हैं और उन्हें एक विशिष्ट क्रम में स्टोर करें। इस तरह आपको एक दोस्ती के लिए डबल पंक्तियों की आवश्यकता नहीं है और फिर भी अपने प्रश्नों को सरल रखें।

user_id_low | user_id_high

एक सरल प्रश्न की जांच करने के लिए यदि आप पहले से ही कर रहे हैं किसी के मित्र होगा:

<?php 
$my_id = 2999; 
$friend_id = 500; 

$lowest = min($my_id, $friend_id); 
$highest= max($my_id, $friend_id); 

query("SELECT * FROM friends WHERE user_id_low=$lowest AND user_id_high=$highest"); 
?> 

या आप mysql

<?php 
query("SELECT * FROM friends WHERE user_id_low=LEAST($my_id, $friend_id) AND user_id_high=GREATEST($my_id, $friend_id)"); 
?> 

का उपयोग कर न्यूनतम/उच्चतम उपयोगकर्ता आईडी मिल सकता है और यह सब पाने के लिए आपके मित्र आईडी

<?php 

query("SELECT IF(user_id_low=$my_id,user_id_high,user_id_low) AS friend_id FROM friends WHERE $my_id IN (user_id_low, user_id_high)"); 

?> 
+0

इसे आधे मिनट तक देखने के बाद और मुझे लगता है कि मैं एक अच्छे कारण के साथ आउंगा कि इसका उपयोग क्यों नहीं किया जाना चाहिए। लेकिन नहीं, मैंने नहीं किया। यह एक बुरा समाधान नहीं है - वास्तव में काफी सुरुचिपूर्ण :) वास्तव में यह एक सिस्टम का भी समर्थन करता है जहां आप उदाहरण के लिए 100 दोस्तों के समूह का एक समूह व्यवस्थित कर सकते हैं, बस उन्हें सभी को एसी/desc ऑर्डर में डाल दें –

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

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