दिलचस्प पोस्ट
Ninject समर्थन Func (ऑटो उत्पन्न कारखाने) करता है? क्यों "सच" == सचमुच जावास्क्रिप्ट में गलत दिखाता है? एक टेक्स्टरेआ इनपुट से न्यूलाइन प्राप्त करें आकार का आकार / फसल / पैड एक तस्वीर XML से डेटा पढ़ना LINQ से XML में नामस्थानों को अनदेखा करें jQuery: "संख्या" प्रतिबंधित करने का सबसे अच्छा तरीका क्या है पाठ बॉक्स के लिए केवल इनपुट? (दशमलव अंक की अनुमति दें) JUnit 4 में TestSuite सेटअप Java में sudo privileges के साथ बाश कमांड कैसे निष्पादित करें? अजगर: श्रेणी सूचकांक से बाहर की सीमा त्रुटि सी + + नामस्थान सलाह प्रोजेक्ट लक्ष्यीकरण 4.0 में मैं async कीवर्ड का उपयोग कैसे कर सकता हूं क्या एक एक्स-एक्स में स्थित एक गैर-निर्यातित फ़ंक्शन को कॉल करना संभव है? WKWebView को जावास्क्रिप्ट तुल्यकालिक मूल संचार सीएसएस के माध्यम से आदेश सूची में दूसरी पंक्ति के लिए इंडेंट कैसे रखा जाए?

फेसबुक डेटाबेस डिजाइन?

मैंने हमेशा सोचा है कि फेसबुक ने दोस्त कैसे बनाया <-> उपयोगकर्ता संबंध

मुझे लगता है कि उपयोगकर्ता तालिका इस तरह से कुछ है:

user_email PK user_id PK password 

मैं उपयोगकर्ता के डेटा (सेक्स, आयु इत्यादि के माध्यम से उपयोगकर्ता ईमेल के माध्यम से जुड़ा हुआ है, जो मैं ग्रहण करता हूं) के साथ तालिका को समझता हूं।

यह सभी मित्रों को इस उपयोगकर्ता से कैसे जुड़ता है?

कुछ इस तरह?

 user_id friend_id_1 friend_id_2 friend_id_3 friend_id_N 

शायद ऩही। क्योंकि उपयोगकर्ताओं की संख्या अज्ञात है और इसका विस्तार होगा।

वेब के समाधान से एकत्रित समाधान "फेसबुक डेटाबेस डिजाइन?"

एक मित्र तालिका रखें जो यूजरआईडी को रखती है और उसके बाद उपयोगकर्ता के यूजर आईडी (हम उसे मित्र आईडी कहते हैं)। दोनों कॉलम विदेशी कुंजी वापस उपयोगकर्ताओं की मेज पर होगी।

कुछ उपयोगी उदाहरण:

 Table Name: User Columns: UserID PK EmailAddress Password Gender DOB Location TableName: Friends Columns: UserID PK FK FriendID PK FK (This table features a composite primary key made up of the two foreign keys, both pointing back to the user table. One ID will point to the logged in user, the other ID will point to the individual friend of that user) 

उदाहरण उपयोग:

 Table User -------------- UserID EmailAddress Password Gender DOB Location ------------------------------------------------------ 1 bob@bob.com bobbie M 1/1/2009 New York City 2 jon@jon.com jonathan M 2/2/2008 Los Angeles 3 joe@joe.com joseph M 1/2/2007 Pittsburgh Table Friends --------------- UserID FriendID ---------------- 1 2 1 3 2 3 

यह दिखाएगा कि बॉब जॉन और जो दोनों के साथ दोस्त हैं और ये जॉन भी जो के साथ दोस्त हैं इस उदाहरण में हम मान लेंगे कि दोस्ती हमेशा दो तरीके हैं, इसलिए आपको तालिका में पंक्ति की आवश्यकता नहीं होगी, जैसे कि (2,1) या (3, 2) क्योंकि वे पहले से दूसरी दिशा में प्रतिनिधित्व करते हैं। ऐसे उदाहरणों के लिए जहां दोस्ती या अन्य संबंध स्पष्ट रूप से दो तरह से नहीं हैं, आपको उन पंक्तियों को भी दो-तरीकों से संबंधों को इंगित करने की आवश्यकता होगी

निम्नलिखित डेटाबेस स्कीमा पर नज़र डालें, अनातोली लुबर्सकी द्वारा इंजीनियर रिवर्स :

फेसबुक स्कीमा

मेरी सबसे अच्छी शर्त यह है कि उन्होंने एक ग्राफ संरचना बनाई। नोड्स उपयोगकर्ता हैं और "दोस्ती" किनारों हैं।

उपयोगकर्ताओं की एक तालिका रखें, किनारों की दूसरी तालिका रखें। फिर आप किनारों के बारे में डेटा रख सकते हैं, जैसे "दिन वे दोस्त बन गए" और "स्वीकृत स्थिति" आदि।

टी एल; डॉ:

वे अपने ढेर के MySQL तल के ऊपर सब कुछ के लिए कैश्ड ग्राफ़ के साथ स्टैक आर्किटेक्चर का उपयोग करते हैं।

लंबा जवाब:

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

  • टीएओ: सोशल ग्राफ़ के लिए फेसबुक का डिस्ट्रिब्यूटेड डेटा स्टोर
  • TAO: ग्राफ की शक्ति

मैं सचमुच सुझाव देता हूं कि आप पढ़ना जारी रखने से पहले ऊपर दिए गए पहले लिंक की प्रस्तुति देखने के लिए। शायद यह संभवतः सबसे अच्छा विवरण है कि एफबी आपको पर्दे के पीछे क्या काम करता है।

वीडियो और लेख आपको कुछ चीजों को बताता है:

  • वे अपने स्टैक के बहुत नीचे MySQL का उपयोग कर रहे हैं
  • एसक्यूएल डीबी के ऊपर TAO स्तर होता है जिसमें कम से कम दो स्तर कैशिंग होता है और कनेक्शन का वर्णन करने के लिए ग्राफ़ का उपयोग कर रहा है।
  • मैं क्या सॉफ्टवेयर / डीबी वे वास्तव में अपने कैश्ड ग्राफ के लिए उपयोग के बारे में कुछ भी नहीं मिल सकता है

आइए इस पर एक नज़र डालें, मित्र कनेक्शन शीर्ष बाएं हैं:

यहां छवि विवरण दर्ज करें

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

यह भी विचार करें कि आपको मित्रों के मित्रों के मुकाबले अधिक जटिल प्रश्न करना है, उदाहरण के लिए जब आप किसी दिए गए समन्वय के आस-पास सभी स्थानों को फ़िल्टर करना चाहते हैं, तो आप और आपके दोस्तों के मित्र जैसे ही एक ग्राफ सही समाधान है यहाँ।

मैं आपको यह नहीं बता सकता कि कैसे इसे बनाने के लिए यह अच्छी तरह से प्रदर्शन करेगा, लेकिन स्पष्ट रूप से कुछ परीक्षण और त्रुटि और बेंचमार्किंग की आवश्यकता है

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

डीबी स्कीमा:

 CREATE TABLE IF NOT EXISTS `friends` ( `id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `friend_id` int(11) NOT NULL ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

दोस्तों के मित्र प्रश्न:

 ( select friend_id from friends where user_id = 1 ) union ( select distinct ff.friend_id from friends f join friends ff on ff.user_id = f.friend_id where f.user_id = 1 ) 

मैं वास्तव में आपको कम से कम 10k उपयोगकर्ता रिकॉर्ड के साथ कुछ नमूना डेटा बनाने के लिए सलाह देता हूं और उनमें से प्रत्येक के पास कम से कम 250 मित्र कनेक्शन हैं और फिर इस क्वेरी को चलाते हैं। मेरी मशीन पर (i7 4770k, एसएसडी, 16 जीबी रैम) परिणाम उस क्वेरी के लिए ~ 0.18 सेकंड था। शायद यह अनुकूलित किया जा सकता है, मैं डीबी प्रतिभाशाली नहीं हूं (सुझाव स्वागत है)। हालांकि, यदि यह तराजू रैखिक आप पहले से ही 1.8 सेकंड में सिर्फ 100k उपयोगकर्ताओं के लिए, 1 करोड़ उपयोगकर्ताओं के लिए 18 सेकंड हैं।

यह अभी ~ ~ 100 के उपयोगकर्ताओं के लिए ओकेश को ध्वनि दे सकता है परन्तु इस बात पर ध्यान रखें कि आपने मित्रों के मित्रों को सिर्फ गाया है और किसी भी अधिक जटिल प्रश्न की तरह नहीं है जैसे कि " मित्रों के मित्रों से मुझे केवल पद दिखाएं + अनुमति चेक की अनुमति दें अगर मुझे अनुमति है या नहीं उनमें से कुछ देखने के लिए + एक उप क्वेरी करें यह जांचने के लिए कि मुझे उनमें से कोई भी पसंद है "। आप डीबी को जांचना चाहते हैं कि क्या आपको पहले ही पोस्ट पसंद है या आपको कोड में करना होगा यह भी विचार करें कि यह आपके द्वारा चलाए जाने वाली एकमात्र क्वेरी नहीं है और आपके सक्रिय उपयोगकर्ता से अधिक या कम लोकप्रिय साइट पर एक ही समय में है।

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

मैंने ओरिएंटेड डीबी के साथ ग्राफ़-प्रश्नों को करने और अपने किनारों को मूल एसक्यूएल डीबी में मैप करने के लिए प्रयोग करना शुरू कर दिया है। अगर मैंने कभी इसे किया है, तो मैं इसके बारे में एक लेख लिखूंगा।

यह कई संबंधों के लिए बहुत अधिक संभावना है:

फ्रेंडलिस्ट (तालिका)

 user_id -> users.user_id friend_id -> users.user_id friendVisibilityLevel 

संपादित करें

उपयोगकर्ता तालिका में संभवतः user_email को पीके के रूप में नहीं है, संभवतः संभवतः एक अनन्य कुंजी के रूप में।

उपयोगकर्ता (तालिका)

 user_id PK user_email password 

इन लेखों पर एक नज़र डालें, जिसमें लिंक्डइन और डिग बनाया गया है:

यहां "बिग डेटा: फेसबुक डेटा टीम से दृष्टिकोण देखें" भी सहायक हो सकता है:

http://developer.yahoo.net/blogs/theater/archives/2008/01/nextyahoonet_big_data_viewpoints_from_the_fac.html

इसके अलावा, यह लेख है जो गैर-रिलेशनल डेटाबेस के बारे में बात करता है और कुछ कंपनियों द्वारा इसका उपयोग कैसे किया जाता है:

http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php

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

पहले दो लेखों पर बहुत सारे लिंक्स हैं जो आपको कुछ और जानकारी देनी चाहिए।

10/20/2014 को अपडेट करें

Murat Demirbas पर एक सारांश लिखा था

  • टीएओ: सोशल ग्राफ के लिए फेसबुक का वितरित डेटा स्टोर (एटीसी'13)
  • एफ 4: फेसबुक का गर्म ब्लॉब स्टोरेज सिस्टम (ओएसडीआई 14)

http://muratbuffalo.blogspot.com/2014/10/facebooks-software-architecture.html

HTH

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

इसलिए प्रत्येक उपयोगकर्ता की अपनी कुंजी है और मित्र कतार में विवरण का विवरण देते हैं; यह जानने के लिए कि कैसन्द्र कैसे काम करता है:

http://prasath.posterous.com/cassandra-55

यह हालिया जून 2013 पोस्ट कुछ डेटा प्रकारों के लिए संघों के साथ वस्तुओं के रिश्ते डेटाबेस से संक्रमण को समझाते हुए कुछ विस्तार में आता है।

https://www.facebook.com/notes/facebook-engineering/tao-the-power-of-the-graph/10151525983993920

https://www.usenix.org/conference/atc13/tao-facebook-s-distributed-data-store-social-graph पर एक लंबा कागज उपलब्ध है

आप विदेशी कुंजी के लिए देख रहे हैं असल में आपके पास कोई डेटाबेस में कोई सरणी नहीं हो सकती है, जब तक कि इसमें अपनी तालिका न हो।


उदाहरण स्कीमा:

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

इसका एक ग्राफ डाटाबेस है: http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

इसका संबंधपरक डेटाबेस से संबंधित नहीं है

ग्राफ डेटाबेस के लिए Google

ध्यान रखें कि डेटाबेस तालिकाओं को खड़ी (अधिक पंक्तियां) विकसित करने के लिए डिज़ाइन की जाती है, क्षैतिज नहीं (अधिक स्तंभ)

शायद एक मेज है, जो मित्र को सहेजता है <-> उपयोगकर्ता संबंध, "frnd_list" कहें, फ़ील्ड 'user_id', 'frnd_id' हो।

जब भी कोई उपयोगकर्ता दूसरे उपयोगकर्ता को एक मित्र के रूप में जोड़ता है, तो दो नई पंक्तियां बनाई जाती हैं

उदाहरण के लिए, मान लीजिए कि मेरा आईडी 'डॉट 9 सी' है और मैं अपने दोस्त के रूप में आईडी 'आकाश 3 बी' वाला उपयोगकर्ता जोड़ूंगा, फिर दो नई पंक्तियां मूल्यों ('डीएम 9 सी', 'आकाश -2 बी') और '' आकाश -2 बी ' ',' deep9c ')।

अब जब किसी विशिष्ट उपयोगकर्ता को मित्र-सूची दिखाते हुए, एक साधारण एसक्यूएल ऐसा करता है: "frnd_id से frnd_id चुनें जहां user_id =" लॉग-इन उपयोगकर्ता का आईडी (सत्र-विशेषता के रूप में संग्रहीत) है।

कई-से-कई टेबल के प्रदर्शन के संबंध में, अगर आपके पास 2 32-बिट आईट्स उपयोगकर्ता आईडी से जुड़ते हैं, तो आपके पास 200 मित्रों के औसत से 200,000,000 उपयोगकर्ताओं के लिए आपका बुनियादी डेटा संग्रहण 300GB के अंतर्गत है

जाहिर है, आपको कुछ विभाजन और अनुक्रमण की आवश्यकता होगी और आप सभी उपयोगकर्ताओं के लिए मेमोरी में नहीं रखेंगे।