Facebook σχεδιασμό βάσεων δεδομένων;

ψήφοι
120

Έχω πάντα αναρωτιόταν πώς το Facebook σχεδίασε το φίλο <-> σχέση με το χρήστη.

Μπορώ να καταλάβω το τραπέζι χρήστης είναι κάτι σαν αυτό:

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 ως PK, ενδεχομένως ως μοναδικό κλειδί όμως.

χρήστες (πίνακας)

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

Αυτό θα δείξει ότι ο Bob είναι φίλοι με τους δύο Jon και ο Joe και ο Jon είναι επίσης φίλος με τον Joe. Σε αυτό το παράδειγμα θα θεωρήσουμε ότι η φιλία είναι πάντα δύο τρόπους, έτσι δεν θα χρειαστεί μια σειρά στον πίνακα, όπως η (2,1) ή (3,2), γιατί ήδη εκπροσωπούνται στην άλλη κατεύθυνση. Για παραδείγματα όπου η φιλία ή άλλες σχέσεις που δεν είναι ρητά δύο τρόπο, θα πρέπει να έχετε επίσης αυτές τις γραμμές για να δείξει την αμφίδρομη σχέση.

Απαντήθηκε 17/06/2009 στις 20:21
πηγή χρήστη

ψήφοι
31

Ο καλύτερος τρόπος μου είναι ότι θα δημιουργήσει μια δομή γράφημα . Οι κόμβοι είναι οι χρήστες και «φιλίες» είναι άκρα.

Κρατήστε ένα τραπέζι των χρηστών, να κρατήσει έναν άλλο πίνακα των άκρων. Στη συνέχεια, μπορείτε να διατηρήσετε τα δεδομένα σχετικά με τις άκρες, σαν «ημέρα έγιναν φίλοι» και «εγκεκριμένο καθεστώς», κ.λπ.

Απαντήθηκε 17/06/2009 στις 20:21
πηγή χρήστη

ψήφοι
5

Ψάχνετε για ξένα κλειδιά. Βασικά δεν μπορείτε να έχετε μια σειρά σε μια βάση δεδομένων, εκτός αν έχει το δικό του πίνακα θα είναι.


Παράδειγμα σχήμα:

    Οι χρήστες Πίνακας
        ταυτότητα χρήστη PK
        άλλα δεδομένα
    Φίλοι Πίνακας
        ταυτότητα χρήστη - FK στο τραπέζι χρήστες που εκπροσωπούν το χρήστη ότι έχει ένα φίλο.
        friendID - FK στο τραπέζι των χρηστών που αντιπροσωπεύει την ταυτότητα του χρήστη του φίλου
Απαντήθηκε 17/06/2009 στις 20:22
πηγή χρήστη

ψήφοι
2

Λάβετε υπόψη ότι οι πίνακες της βάσης δεδομένων σχεδιαστεί για να αυξηθεί κατακόρυφα (πάνω γραμμές), δεν οριζόντια (περισσότερες στήλες)

Απαντήθηκε 17/06/2009 στις 20:40
πηγή χρήστη

ψήφοι
15

Ρίξτε μια ματιά σε αυτά τα άρθρα που περιγράφουν πώς χτίζονται LinkedIn και Digg:

Υπάρχει, επίσης, «Big Data: Απόψεις από την ομάδα του Facebook δεδομένων» που θα μπορούσαν να είναι χρήσιμες:

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 Ντεμιρμπάς έγραψε μια περίληψη

  • ΤΑΟ: διανεμηθεί αποθήκευσης δεδομένων του Facebook για το κοινωνικό γράφημα (ATC'13)
  • F4: Σύστημα ζεστό αποθήκευσης BLOB του Facebook (OSDI'14)

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

HTH

Απαντήθηκε 17/06/2009 στις 22:38
πηγή χρήστη

ψήφοι
0

Όσον αφορά την απόδοση του πολλά-προς-πολλά πίνακα, αν έχετε 2 ints 32-bit που συνδέει τα αναγνωριστικά χρήστη, βασική αποθήκευσης δεδομένων για 200.000.000 χρήστες κατά μέσο όρο 200 φίλους ο καθένας είναι λίγο κάτω από 300GB.

Προφανώς, θα χρειαστεί κάποια στεγανοποίηση και την ευρετηρίαση και δεν πρόκειται να κρατήσει ότι στη μνήμη για όλους τους χρήστες.

Απαντήθηκε 18/06/2009 στις 01:17
πηγή χρήστη

ψήφοι
44

Ρίξτε μια ματιά στο παρακάτω σχήμα βάσης δεδομένων, αντίστροφη μηχανική από Anatoly Lubarsky :

Facebook Schema

Απαντήθηκε 13/07/2009 στις 17:18
πηγή χρήστη

ψήφοι
9

Δεν είναι δυνατή η ανάκτηση δεδομένων από RDBMS για τους φίλους του χρήστη δεδομένων για τα δεδομένα που διασχίζουν περισσότερα από μισό δισεκατομμύριο σε σταθερό χρόνο, έτσι Facebook υλοποιηθεί αυτό χρησιμοποιώντας μια βάση δεδομένων hash (χωρίς SQL) και 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

Της που δεν σχετίζονται με σχεσιακές βάσεις δεδομένων.

Το Google για τις βάσεις δεδομένων του γραφήματος.

Απαντήθηκε 12/04/2011 στις 13:06
πηγή χρήστη

ψήφοι
1

Πιθανώς υπάρχει ένας πίνακας, ο οποίος αποθηκεύει το φίλο <-> σχέση με το χρήστη, λένε «frnd_list», που έχει πεδία «user_id», «frnd_id».

Κάθε φορά που ένας χρήστης προσθέτει έναν άλλο χρήστη ως φίλο, οι δύο νέες σειρές που δημιουργήθηκαν.

Για παράδειγμα, ας υποθέσουμε ότι id μου είναι «deep9c και μπορώ να προσθέσω ένα χρήστη με id«akash3b», όπως ο φίλος μου, τότε οι δύο νέες σειρές που δημιουργήθηκαν στον πίνακα«frnd_list»με τιμές («deep9c»,«akash3b») και (« akash3b », 'deep9c').

Τώρα, όταν δείχνει την φίλους-λίστα σε ένα συγκεκριμένο χρήστη, μια απλή SQL θα το κάνουμε αυτό: «επιλέξτε frnd_id από frnd_list όπου 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

TL? DR:

Χρησιμοποιούν μια αρχιτεκτονική στοίβα με προσωρινά αποθηκευμένες γραφήματα για τα πάντα πάνω από τον πυθμένα της MySQL του stack τους.

Long Απάντηση:

Έκανα κάποια έρευνα για αυτό τον εαυτό μου γιατί ήμουν περίεργος πώς χειρίζονται τεράστιο ποσό των δεδομένων και την αναζήτηση σε ένα γρήγορο τρόπο. Έχω δει ανθρώπους να διαμαρτύρονται για custom made σενάρια κοινωνικό δίκτυο να γίνει αργά, όταν η βάση χρηστών μεγαλώνει. Μετά έκανα κάποια συγκριτική αξιολόγηση εαυτό μου με μόνο 10k χρήστες και 2,5 εκατομμύρια φίλος συνδέσεις - ούτε καν προσπαθεί να ενοχλεί σχετικά με τα δικαιώματα της ομάδας και συμπαθεί και θέσεις τοίχο - γρήγορα αποδείχθηκε ότι αυτή η προσέγγιση είναι λανθασμένη. Έτσι έχω περάσει κάποιο χρόνο ψάχνοντας στο διαδίκτυο για το πώς να το κάνουμε καλύτερα και τέθηκε σε όλη αυτή την επίσημη άρθρου Facebook:

Έχω πραγματικά σας προτείνουμε να παρακολουθήσετε την παρουσίαση του πρώτου παραπάνω σύνδεσμο πριν συνεχίσετε την ανάγνωση. Είναι ίσως η καλύτερη εξήγηση για το πώς λειτουργεί FB πίσω από τις σκηνές που μπορείτε να βρείτε.

Το βίντεο και το άρθρο σας λέει μερικά πράγματα:

  • Είναι χρησιμοποιώντας MySQL στο πολύ κάτω μέρος του stack τους
  • Πάνω από το SQL DB υπάρχει το στρώμα ΤΑΟ που περιέχει τουλάχιστον δύο επίπεδα προσωρινή αποθήκευση και τη χρήση γραφημάτων για να περιγράψει τις συνδέσεις.
  • Δεν μπόρεσα να βρω τίποτα για το τι λογισμικό / DB που πραγματικά χρησιμοποιούν για προσωρινά αποθηκευμένες γραφικές παραστάσεις τους

Ας ρίξουμε μια ματιά σε αυτό, συνδέσεις φίλος είναι πάνω αριστερά:

εισάγετε περιγραφή της εικόνας εδώ

Λοιπόν, αυτό είναι ένα γράφημα. :) Δεν σας πω πώς να το χτίσει σε SQL, υπάρχουν διάφοροι τρόποι για να το κάνουμε, αλλά αυτό το site έχει ένα καλό ποσό των διαφορετικών προσεγγίσεων. Προσοχή: Σκεφτείτε ότι μια σχεσιακή ΒΔ είναι αυτό που είναι: Είναι σκέψης για την αποθήκευση κανονικοποιημένα δεδομένα, δεν είναι μια δομή γράφημα. Έτσι δεν θα εκτελέσει τόσο καλή όσο μια εξειδικευμένη βάση δεδομένων γράφημα.

Επίσης, θεωρούν ότι θα πρέπει να κάνει περισσότερα σύνθετα ερωτήματα από ό, τι ακριβώς τους φίλους των φίλων, για παράδειγμα, όταν θέλετε να φιλτράρει όλες τις θέσεις γύρω από ένα δεδομένο συντονίζουν ότι εσείς και οι φίλοι των φίλων σας αρέσει. Ένα γράφημα είναι η τέλεια λύση εδώ.

Δεν μπορώ να σας πω πώς να το φτιάξεις έτσι ώστε να έχουν καλές επιδόσεις, αλλά απαιτεί σαφώς κάποια δοκιμή και λάθος και συγκριτικής αξιολόγησης.

Εδώ είναι μου απογοητευτικό τεστ για λίγο τα ευρήματα τους φίλους των φίλων:

DB Schema:

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, SSD, 16GB RAM), το αποτέλεσμα ήταν ~ 0,18 δευτερόλεπτα για το συγκεκριμένο ερώτημα. Ίσως μπορεί να βελτιστοποιηθεί, δεν είμαι μια ιδιοφυΐα DB (προτάσεις είναι ευπρόσδεκτες). Ωστόσο, αν αυτή η ζυγαριά γραμμική είστε ήδη σε 1,8 δευτερόλεπτα μόνο 100k χρήστες, 18 δευτερόλεπτα 1 εκατομμύριο χρήστες.

Αυτό μπορεί να εξακολουθεί να ακούγεται OKish για ~ 100k χρήστες, αλλά θεωρούν ότι το μόνο που παρατραβηγμένο οι φίλοι των φίλων και δεν κάνει πια σύνθετο ερώτημα όπως " εμφάνιση με μόνο δημοσιεύσεις από τους φίλους των φίλων + κάνει τον έλεγχο άδεια, αν μου επιτρέπεται ή δεν επιτρέπεται για να δείτε μερικά από αυτά + κάνετε μια υπο ερώτημα για να ελέγξετε αν μου άρεσε κάποια από αυτές ». Θέλετε να αφήσετε το DB κάνει τον έλεγχο για αν σας άρεσε μια θέση που έχουν ήδη ή όχι ή αν θα πρέπει να κάνετε στον κώδικα. Επίσης, θεωρούν ότι αυτό δεν είναι το μόνο ερώτημα που τρέχει και ότι σας έχει περισσότερες από ενεργοί χρήστες ταυτόχρονα σε μια περισσότερο ή λιγότερο δημοφιλές site.

Νομίζω ότι η απάντησή μου απαντά στο ερώτημα πώς Facebook σχεδιαστεί για τη σχέση τους φίλους τους πολύ καλά, αλλά λυπάμαι που δεν μπορώ να σας πω πώς να την εφαρμόσουν κατά τρόπο που θα λειτουργήσει γρήγορα. Η εφαρμογή ενός κοινωνικού δικτύου είναι εύκολο, αλλά φροντίζοντας να αποδίδει καλά, δεν είναι σαφές - IMHO.

Έχω αρχίσει να πειραματίζεται με OrientDB να κάνει το γράφημα-ερωτήματα και χαρτογράφηση άκρες μου με την υποκείμενη SQL DB. Αν ποτέ να το κάνει εγώ θα γράψω ένα άρθρο σχετικά με αυτό.

Απαντήθηκε 26/02/2015 στις 00:34
πηγή χρήστη

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