복붙노트

[SQL] 페이스 북 데이터베이스 설계?

SQL

페이스 북 데이터베이스 설계?

<-> 사용자 관계 나는 항상 페이스 북이 친구를 설계하는 방법을 궁금해했다.

나는 사용자 표는이 같은 것입니다 도표 :

user_email PK
user_id PK
password 

나는 사용자의 데이터 (성별, 연령 등 내가 가정 할 사용자 이메일을 통해 연결)와 테이블을 그림.

어떻게이 사용자에 대한 모든 친구를 연결합니까?

이 같은?

user_id
friend_id_1
friend_id_2
friend_id_3
friend_id_N 

아마 아닙니다. 사용자의 수를 알 수없는 및 확장 때문이다.

해결법

  1. ==============================

    1.다음 사용자 ID와 친구의 아이디를 보유하고 친구 테이블을 유지 (우리는 FriendID 호출합니다). 두 열은 사용자 테이블에 대한 외래 키에 돌아올 것입니다.

    다음 사용자 ID와 친구의 아이디를 보유하고 친구 테이블을 유지 (우리는 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)가 필요하지 않을 수 있도록이 예에서 우리는 우정은 항상 두 가지 방법입니다 가정합니다. 우정이나 다른 관계가 명시 적으로 두 가지 방법이 없습니다 예를 들어, 당신은 또한 양방향 관계를 나타 내기 위해 해당 행을해야합니다.

  2. ==============================

    2., 아나톨리 Lubarsky에 의해 리버스 엔지니어링 다음과 같은 데이터베이스 스키마에서보세요 :

    , 아나톨리 Lubarsky에 의해 리버스 엔지니어링 다음과 같은 데이터베이스 스키마에서보세요 :

  3. ==============================

    3.TL; DR :

    TL; DR :

    그들은 스택의 MySQL의 아래 위 모두를위한 캐시 그래프를 스택 아키텍처를 사용합니다.

    긴 답변 :

    나는 그들이 데이터를 자신의 엄청난 금액을 처리하고 빠른 방법으로 검색하는 방법 궁금했기 때문에 나는이에 자신을 몇 가지 조사를했다. 나는 정의에 대해 불평 사람들이 사용자 기반이 성장하면 느린되는 소셜 네트워크 스크립트를 만들어 보았다. 심지어 그룹 권한과 좋아하는 벽 게시물에 대해 걱정하는 것을 시도하지 - - 신속이 방법은 결함이 밝혀졌다 좀 그냥 10K 사용자와 250 만로 친구와 자신을 벤치마킹 한 후. 나는 더 나은 작업을 수행하는 방법에 대한 웹 검색 시간을 보냈다이 공식 페이스 북 기사를 건너 왔어요했습니다 그래서 :

    난 정말 전에 계속 읽고 위의 첫 번째 링크의 프레젠테이션을보고 당신을 추천합니다. 아마 FB 당신이 찾을 수있는 무대 뒤에서 작동하는 방법의 최선의 설명이다.

    비디오 및 문서에서는 몇 가지를 알려줍니다 :

    하자가 친구 연결이 왼쪽 상단에있는 이것 좀보세요 :

    음,이 그래프이다. : 그것은 어떻게 SQL에 구축하는 방법을 알려하지 않는, 거기에 그것을 할 수있는 방법은 여러 가지가 있지만이 사이트는 다른 접근 방식의 좋은 금액을 가지고있다. 주의 : 관계형 DB 그것이 무엇이라고 생각해 그것의 생각은 정규화 된 데이터가 아닌 그래프 구조를 저장합니다. 그것은 전문 그래프 데이터베이스로 좋은으로 수행하지 않습니다 그래서.

    또한 좌표 주어진 주변의 모든 위치를 필터링 할 때, 예를 들어 친구의 그냥 친구보다 더 복잡한 쿼리를 할 필요가 있다고 생각 당신과 같은 친구의 친구. 그래프는 여기에 완벽한 솔루션입니다.

    나는 어떻게 잘 수행하도록을 구축하는 방법을 말할 수 있지만 분명 시행 착오 및 벤치마킹 몇 가지가 필요합니다.

    여기에 친구의 단지 결과 친구에 대한 내 실망 시험은 다음과 같습니다

    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로 친구를 가지고 다음이 쿼리를 실행합니다. 내 컴퓨터에 (SSD, 16 기가 바이트 RAM은 I7 4770k) 결과는 ~ 그 쿼리에 대한 0.18 초였다. 어쩌면 그것은 내가는 DB 천재 (제안 환영합니다) 아니에요 최적화 할 수 있습니다. 이 저울은 선형 경우, 당신은 단지 100,000 사용자, 100 만 사용자를 18 초 동안 1.8 초에 이미있어.

    ~ 100,000 사용자를위한이 여전히 힘 사운드 OKish하지만 당신 친구의 방금 가져온 친구와 친구의 친구 만 게시물 나를 표시 "와 같은 더 복잡한 쿼리를하지 않았다고 생각 + I 허용 또는 NOT 허용하고있어 경우 권한 확인을 그 중 일부를 볼 + 나는 "그 (것)들의 무엇이든을 좋아하는지 확인하기 위해 서브 쿼리를 수행합니다. 당신은 DB가 이미 여부 게시물을 좋아하거나 코드를해야 할 것이다 경우에 검사를 할 수 있도록합니다. 또한이 실행할 수있는 유일한 쿼리가 아니라고 생각과는 다소 인기있는 사이트에 동시에 둘 활성 사용자 이상이 있는지 확인하십시오.

    내 대답은 페이스 북이 아주 잘 자신의 친구 관계를 설계하는 방법을 질문에 대한 대답 생각하지만 난 어떻게 빨리 작동하는 방식을 구현하는 방법을 말할 수 죄송합니다. 쉽게 소셜 네트워크입니다 구현하지만, 만드는 확실히 그것을 잘 수행 명확하지 않습니다 - 이럴.

    나는 그래프 - 쿼리를 수행 할 OrientDB 실험 및 기본 SQL DB에 내 가장자리를 매핑 시작했습니다. 내가 얻을 경우 내가 그것에 대해 기사를 쓸 것이다 다.

  4. ==============================

    4.나의 가장 좋은 방법은 그래프 구조를 만든 것입니다. 노드는 사용자와 "우정"입니다 가장자리입니다.

    나의 가장 좋은 방법은 그래프 구조를 만든 것입니다. 노드는 사용자와 "우정"입니다 가장자리입니다.

    사용자의 하나 개의 테이블을 유지 가장자리의 다른 테이블을 유지한다. 그럼 당신은 등 "승인 상태를" "하루가 친구가되었다"처럼 가장자리에 대한 데이터를 유지하고 있습니다

  5. ==============================

    5.그것은 가장 가능성이 많은 관계로 많은입니다 :

    그것은 가장 가능성이 많은 관계로 많은입니다 :

    FriendList (테이블)

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

    편집하다

    사용자 테이블은 아마 가능하지만 고유 키와 같은 PK로 USER_EMAIL가 없습니다.

    사용자 (테이블)

    user_id PK
    user_email
    password
    
  6. ==============================

    6.링크드 인 디그 (Digg)가 내장하는 방법을 설명하는이 기사를 살펴 보자 :

    링크드 인 디그 (Digg)가 내장하는 방법을 설명하는이 기사를 살펴 보자 :

    또한 "빅 데이터 : 페이스 북 데이터 팀의 관점"거기에 도움이 될 수 있습니다 :

    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

    당신은이 회사가 우리의 대부분은 매일 처리하지보다 데이터웨어 하우스, 분할 된 데이터베이스, 데이터 캐싱 및 다른 높은 수준의 개념을 다루고있는 것을 볼 수 있습니다. 또는 적어도, 어쩌면 우리는 우리가 알고하지 않습니다.

    당신에게 좀 더 통찰력을 제공한다 처음 두 기사의 링크가 많이 있습니다.

    UPDATE 2014년 10월 20일

    무라트 Demirbas는에 요약을 썼다

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

    HTH

  7. ==============================

    7.그것은 더 억 절반 이상 일정한 시간에 교차 데이터에 대한 사용자의 친구 데이터에 대한 RDBMS에서 데이터를 검색 할 수 없습니다 페이스 북이 해시 데이터베이스 (NO SQL)를 사용하여이 구현 그래서 그들은 카산드라라는 데이터베이스를 opensourced.

    그것은 더 억 절반 이상 일정한 시간에 교차 데이터에 대한 사용자의 친구 데이터에 대한 RDBMS에서 데이터를 검색 할 수 없습니다 페이스 북이 해시 데이터베이스 (NO SQL)를 사용하여이 구현 그래서 그들은 카산드라라는 데이터베이스를 opensourced.

    모든 사용자는 자신의 키와 큐의 친구 정보를 가지고 그래서; 카산드라의 작품이 보는 방법을 알고 :

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

  8. ==============================

    8.이 최근 2013년 6월 포스트는 일부 데이터 유형에 대해 협회와 객체 관계 데이터베이스의 전환을 설명에 몇 가지 세부 사항으로 간다.

    이 최근 2013년 6월 포스트는 일부 데이터 유형에 대해 협회와 객체 관계 데이터베이스의 전환을 설명에 몇 가지 세부 사항으로 간다.

    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에있다

  9. ==============================

    9.당신은 외래 키 찾고 있습니다. 그것은 자신의 테이블을하지 않는 한 기본적으로 당신은 데이터베이스의 배열을 가질 수 없습니다.

    당신은 외래 키 찾고 있습니다. 그것은 자신의 테이블을하지 않는 한 기본적으로 당신은 데이터베이스의 배열을 가질 수 없습니다.

        Users Table
            userID PK
            other data
        Friends Table
            userID   -- FK to users's table representing the user that has a friend.
            friendID -- FK to Users' table representing the user id of the friend
  10. ==============================

    10.그래프 데이터베이스의 그것의 유형 : http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

    그래프 데이터베이스의 그것의 유형 : http://components.neo4j.org/neo4j-examples/1.2-SNAPSHOT/social-network.html

    그것은 관계형 데이터베이스 관련이 없습니다.

    그래프 데이터베이스에 대한 구글.

  11. ==============================

    11.데이터베이스 테이블이 수직 (더 행) 성장하도록 설계되어 있다는 사실을 숙지하지 수평 (더 열)

    데이터베이스 테이블이 수직 (더 행) 성장하도록 설계되어 있다는 사실을 숙지하지 수평 (더 열)

  12. ==============================

    12.당신은 사용자 ID를 연결하는이 32 비트의 int이있는 경우, 다 대다 테이블의 성능에 대해서는, 200 친구 평균 200,000,000 사용자를위한 기본적인 데이터 저장 씩 단지 300기가바이트을 받고있다.

    당신은 사용자 ID를 연결하는이 32 비트의 int이있는 경우, 다 대다 테이블의 성능에 대해서는, 200 친구 평균 200,000,000 사용자를위한 기본적인 데이터 저장 씩 단지 300기가바이트을 받고있다.

    물론, 일부 분할 및 색인을 필요 당신은 모든 사용자에 대해 메모리에 그것을 유지하지 않을거야.

  13. ==============================

    13.<-> 사용자의 관계는, "frnd_list"필드 'USER_ID'을 가진 말, 'frnd_id'아마 친구를 저장하는 테이블이있다.

    <-> 사용자의 관계는, "frnd_list"필드 'USER_ID'을 가진 말, 'frnd_id'아마 친구를 저장하는 테이블이있다.

    사용자가 친구로 다른 사용자를 추가 할 때마다 두 개의 새로운 행이 만들어집니다.

    예를 들어, 내 ID가 'deep9c'내가이 다음 두 개의 새로운 행이 값으로 테이블 "frnd_list"에 생성됩니다 ( 'deep9c', 'akash3b')와 내 친구와 같은 ID 'akash3b'을 갖는 사용자를 추가 ( 'akash3b을 가정 ','deep9c ').

    이제 특정 사용자의 친구 목록을 표시 할 때, 간단한 SQL 그렇게 할 것 "frnd_list에서 frnd_id 선택할 경우 USER_ID =" 여기서, 로그인 한 사용자 (a 세션 속성으로 저장)의 ID이다.

  14. from https://stackoverflow.com/questions/1009025/facebook-database-design by cc-by-sa and MIT license