2011-09-20 22 views
26

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

लेकिन फेसबुक पर सैकड़ों अलग-अलग टेबल हो सकते हैं जिन्हें आप "पसंद" कर सकते हैं। वे पसंद कैसे स्टोर करते हैं?

उत्तर

24

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

फेसबुक उदाहरण का उपयोग करना, आप कुछ इस तरह हो सकता है:

User 
------------ 
UserId (PK) 

Item 
------------- 
ItemId (PK) 
ItemType (discriminator column) 
OwnerId (FK to User) 

Status 
------------ 
ItemId (PK, FK to Item) 
StatusText 

RelationshipUpdate 
------------------ 
ItemId (PK, FK to Item) 
RelationshipStatus 
RelationTo (FK to User) 

Like 
------------ 
OwnerId (FK to User) 
ItemId (FK to Item) 
Compound PK of OwnerId, ItemId 

ब्याज पूर्णता में, यह ध्यान देने योग्य बात है कि फेसबुक बात की इस तरह के लिए एक RDBMS का उपयोग नहीं करता लायक है। उन्होंने इस तरह के भंडारण के लिए नोएसक्यूएल समाधान का चयन किया है। हालांकि, यह आरडीबीएमएस के भीतर ऐसी कमजोर-युग्मित जानकारी को संग्रहीत करने का एक तरीका है।

+0

यह एक समाधान हो सकता है, मुझे लगता है कि समस्या यह है कि "हर चीज" एक "वस्तु" होनी चाहिए क्योंकि यदि आपके पास कोई सारणी नहीं है जो कोई आइटम नहीं है और किसी दिन आप भी इसके लिए चाहते हैं? मुझे लगता है कि कभी-कभी सरल बेहतर होता है, विपरीत विरासत क्यों नहीं बनाते? जैसे माता-पिता है और आपके पास एक एफके के साथ एक like_for_status तालिका है, और like_for_photo, आदि। आप इसे किसी भी तालिका में आसानी से बढ़ा सकते हैं, और आपके प्रश्न भी तेज़ हैं। – Enrique

+0

+1, हालांकि मुझे लगता है कि आपका मतलब है ** तालिका प्रति प्रकार ** या टीपीटी। – Yuck

+0

@ यक: हां, टीपीटी (टेबल-पे-पदानुक्रम के बजाए), हालांकि टीपीटी और टीपीएच, जहां तक ​​मुझे पता है, एंटीटी फ्रेमवर्क लेक्सिकॉन का हिस्सा अधिक सामान्य रूप से एसक्यूएल होने के बजाय। –

0

आपके पास आईडी, विदेशी आईडी और प्रकार के साथ एक टेबल हो सकती है। टाइप फोटो, स्टेटस, इवेंट इत्यादि जैसे कुछ भी हो सकता है ... विदेशी आईडी तालिका में रिकॉर्ड का आईडी होगा। यह दोनों टिप्पणियों और पसंदों के लिए संभव बनाता है। आपको केवल सभी पसंदों के लिए एक टेबल की आवश्यकता है, एक टिप्पणी के लिए एक और जिसे मैंने वर्णित किया है।

उदाहरण:

Items 
Id | Foreign Id | Type 
----+-------------+-------- 
    1 |   322 | Photo 
    4 |   346 | Status 

Likes 
Id | User Id  | Item Id 
----+-------------+-------- 
    1 |   111 | 1 

इधर, ईद 111 के साथ उपयोगकर्ता आईडी 322.


नोट के साथ तस्वीर पसंद करती है: मैं आपको एक RDBMS का उपयोग कर रहे मान, लेकिन Adron के जवाब देखें। फेसबुक नहीं अपने अधिकांश डेटा के लिए आरडीबीएमएस का उपयोग करता है।

+0

लेकिन तब आप "विदेशी आईडी" – Enrique

+0

@Enrique में कमी का उपयोग नहीं कर सकते हैं विस्तृत कर सकते हैं? आरआई बाधाओं का उपयोग करके टेबल विरासत पैटर्न में केवल क्या किया जा सकता है और इसे लागू नहीं किया जा सकता है, लेकिन यह स्पष्ट नहीं है कि आप किस बारे में बात कर रहे हैं। –

+0

@ एडम रॉबिन्सन "आइटम" तालिका में "विदेशी_आईडी" कॉलम वास्तविक एफके नहीं है, क्योंकि आप इसे किसी भी तालिका में इंगित नहीं कर सकते हैं, क्योंकि यह वास्तव में कई टेबलों को इंगित करता है ("प्रकार" कॉलम के आधार पर) इसलिए आप वहां एफके (और इसलिए एक बाधा नहीं डाल सकते)। इससे आपका डेटा असंगत हो सकता है। – Enrique

2

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

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

वे एक एओपी (आस्पेक्ट ओरिएंटेड प्रोग्रामिंग) स्टाइल प्रोसेसिंग मैकेनिज्म का उपयोग भी कर सकते हैं जो "पसंद" करने के लिए "पसंद" करने के लिए कुछ भी हो सकता है जिसे पृष्ठ प्रतिपादन समय पर किसी की आवश्यकता हो सकती है, लेकिन मुझे लगता है कि यह जावास्क्रिप्ट के माध्यम से असीमित प्रक्रिया है एक एसओए शैली वेब सेवा या अन्य वितरण तंत्र के खिलाफ।

किसी भी तरह से, मुझे यह जानना अच्छा लगेगा कि उनके पास एक आर्किटेक्चर परिप्रेक्ष्य से यह सेटअप कैसे है। उनकी मात्रा को ध्यान में रखते हुए, यहां तक ​​कि सरल "पसंद" बटन भी प्रौद्योगिकी का एक महत्वपूर्ण कार्यान्वयन बन जाता है।

+0

-1। "वे इसके लिए कटौती नहीं करते हैं" राय और अधिक अटकलें का मामला है। इस उत्तर का एकमात्र हिस्सा वास्तव में प्रश्न को संबोधित करता है (ऐसी चीजें कैसे संग्रहीत की जा सकती हैं) आपका दूसरा पैराग्राफ है। –

+0

+1 @adam, सरल तकनीकी तथ्य, कोई राय शामिल नहीं है। आरडीबीएमएस एक अलग उपयोग मॉडल के लिए डिजाइन किए गए हैं। –

+0

@StephanEggermont राज्यों की तरह एडम वे एक अलग मॉडल के लिए हैं, एक अलग उद्देश्य, फेसबुक और अधिक चाहिए। मैं अनुमान लगा रहा हूं और सामान्य डेटाबेस समुदाय, और वैज्ञानिक समुदाय, सहमत हैं। यही कारण है कि अन्य समाधान मौजूद हैं। #justsayin ऊपर दिए गए आपके दावे के लिए, चाबियाँ इस तरह से गठबंधन नहीं हैं। यह एक तरीका है जो आरडीबीएमएस के लिए काम करता है, लेकिन आरडीबीएमएस डेटा फेसबुक सौदों की आपूर्ति या संभाल नहीं कर सका। फेसबुक ने आरडीबीएमएस को बस कोशिश नहीं की और छोड़ दिया क्योंकि वे कुछ और लिखना चाहते थे। – Adron

-5

मुझे पूरा यकीन है कि फेसबुक "जैसे" जानकारी संग्रहीत नहीं करता है, जैसा कि कुछ अन्य ने आरडीबीएमएस का उपयोग करके इसका सुझाव दिया है। लाखों उपयोगकर्ताओं और संभवतः हजारों लोगों के साथ, हम यहां शामिल होने के लिए हजारों पंक्तियों को देख रहे हैं जो प्रदर्शन को प्रभावित करेंगे।

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

संपादित करें: मैं हाल ही में इस साइट पर नहीं रहा हूं और मुझे पता चला कि यह उत्तर कम हो गया है। खैर, यहां एक example post with like count and their avatars है। यह मेरा डिज़ाइन है जहां मैंने अभी लागू किया है जिसके बारे में मैं बात कर रहा हूं।

यहां दो घटक हैं 1.) एक्सआरईएफ तालिका और 2.) JSON ऑब्जेक्ट।

पसंद अभी भी एक एक्सआरईएफ तालिका पर संग्रहीत हैं। लेकिन साथ ही, डेटा JSON ऑब्जेक्ट पर जोड़ा गया है और पोस्ट टेबल पर टेक्स्ट कॉलम पर संग्रहीत किया गया है।

मैंने जेएसओएन के रूप में टेक्स्ट कॉलम पर पसंद की जानकारी क्यों संग्रहीत की? इसलिए पसंद के लिए डीबी लुकअप/जॉइन करने की कोई ज़रूरत नहीं है। अगर कोई पोस्ट के विपरीत है, तो JSON ऑब्जेक्ट अभी अपडेट किया गया है।

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

और यहां वह तालिका है जो पसंद रखती है। यह उपयोगकर्ता और आइटम तालिका के बीच बस एक साधारण एक्सआरईएफ मैपिंग है।

enter image description here

+0

तो आप कैसे जानते हैं कि 'कितने लोगों को यह पसंद आया'? उपयोगकर्ता तालिका में सभी पंक्तियों से पूछताछ? – Wint

+0

सबसे खराब समाधान;) – Pars

+0

@Pars सबसे खराब जवाब;) – Ross

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