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

वोट
120

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

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

user_email PK
user_id PK
password 

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

यह कैसे इस उपयोगकर्ता के लिए सभी दोस्तों से कनेक्ट करता है?

कुछ इस तरह?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

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

17/06/2009 को 20:17
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


13 जवाब

वोट
21

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

Friendlist (टेबल)

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

संपादित करें

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

उपयोगकर्ताओं (टेबल)

user_id PK
user_email
password
17/06/2009 को 20:20
का स्रोत उपयोगकर्ता

वोट
86

एक दोस्त तालिका UserID और फिर दोस्त की UserID रखती रखें (हम इसे FriendID कॉल करेंगे)। दोनों स्तंभों विदेशी चाबियाँ वापस उपयोगकर्ता मेज पर होगा।

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

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) जरूरत नहीं होगी। उदाहरण हैं, जहां दोस्ती या अन्य संबंधों को स्पष्ट रूप से दो तरह से नहीं कर रहे हैं के लिए, आप भी उन पंक्तियों को दो तरह से संबंध का संकेत करने के लिए की आवश्यकता होगी।

17/06/2009 को 20:21
का स्रोत उपयोगकर्ता

वोट
31

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

, उन में से एक टेबल रखें किनारों का एक और टेबल रखने के लिए। तो फिर तुम, "अनुमोदित स्थिति," किनारों के बारे में डेटा रख सकते की तरह "दिन वे दोस्त बन गए" और आदि

17/06/2009 को 20:21
का स्रोत उपयोगकर्ता

वोट
5

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


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

    उपयोगकर्ता टेबल
        userID पी
        अन्य आंकड़ा
    दोस्तो टेबल
        userID - एक दोस्त है उस उपयोगकर्ता को दर्शाने उपयोगकर्ताओं की मेज के लिए FK।
        friendID - उपयोगकर्ता 'तालिका दोस्त की प्रयोक्ता आईडी का प्रतिनिधित्व करने के लिए FK
17/06/2009 को 20:22
का स्रोत उपयोगकर्ता

वोट
2

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

17/06/2009 को 20:40
का स्रोत उपयोगकर्ता

वोट
15

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

वहाँ भी है "बिग डाटा: फेसबुक डाटा टीम की ओर से दृष्टिकोण" है कि उपयोगी हो सकता है:

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

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

वहाँ पहले दो लेख है कि आप कुछ ज्यादा समझ प्रदान करेगा पर लिंक का एक बहुत कुछ कर रहे हैं।

अद्यतन 2014/10/20

मूरत Demirbas पर एक सारांश लिखा था

  • टीएओ: सामाजिक ग्राफ के लिए फेसबुक के वितरित डेटा संग्रह (ATC'13)
  • F4: फेसबुक के गर्म ब्लॉब भंडारण प्रणाली (OSDI'14)

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

HTH

17/06/2009 को 22:38
का स्रोत उपयोगकर्ता

वोट
0

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

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

18/06/2009 को 01:17
का स्रोत उपयोगकर्ता

वोट
44

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

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

13/07/2009 को 17:18
का स्रोत उपयोगकर्ता

वोट
9

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

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

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

20/08/2010 को 06:51
का स्रोत उपयोगकर्ता

वोट
4

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

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

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

12/04/2011 को 13:06
का स्रोत उपयोगकर्ता

वोट
1

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

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

उदाहरण के लिए, मेरे आईडी लगता है 'deep9c' है और मैं अपने दोस्त के रूप में एक उपयोगकर्ता होने आईडी 'akash3b' जोड़ने, तो दो नई पंक्तियाँ मूल्यों ( 'deep9c', 'akash3b') और ( 'akash3b साथ तालिका "frnd_list" में बनाए जाते हैं ',' deep9c ')।

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

29/10/2011 को 17:59
का स्रोत उपयोगकर्ता

वोट
6

यह हाल ही में जून 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 पर एक लंबे समय तक कागज उपलब्ध है

28/06/2013 को 19:07
का स्रोत उपयोगकर्ता

वोट
31

टी एल; डॉ:

वे अपने ढेर के MySQL नीचे से ऊपर सब कुछ के लिए कैश की गई रेखांकन के साथ एक ढेर वास्तुकला का उपयोग करें।

लंबा जवाब:

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

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

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

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

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

यहाँ छवि विवरण दर्ज

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

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

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

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

डीबी स्कीमा:

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, एसएसडी, 16GB RAM) पर परिणाम था ~ 0.18 सेकंड उस क्वेरी के लिए। शायद यह अनुकूलित किया जा सकता है, मैं कर रहा हूँ नहीं एक डीबी प्रतिभा (सुझाव का स्वागत है)। हालांकि, अगर इस तराजू रैखिक तुम सिर्फ 100k उपयोगकर्ताओं, 1 लाख उपयोगकर्ताओं के लिए 18 सेकंड के लिए 1.8 सेकंड में पहले से ही कर रहे हैं।

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

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

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

26/02/2015 को 00:34
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more