8

이 질문은 NoSQL 데이터베이스를 기반으로하는 모든 문서와 관련이있을 수 있습니다.DynamoDB에서 "social-feed"설계

저는 확장 성 및 통증 - 관리 요인 때문에 DynamoDB에 관심을 기울이고 있습니다. 데이터베이스에는 두 개의 주요 엔터티가 있습니다 : 사용자게시물. 일반적인 에 대한

요구 사항은은 매우 간단 조회 :

  • 내/사용자 피드 (내 공급, 또는 특정 사용자 피드) (사람의 공급은 내가 다음과 같은거야)

    • 홈 피드
    • 사용자의
    • 목록 나는/사용자는 여기에

  • 데이터베이스입니다 추종자의
  • 목록을 따라 내가 지금까지 가지고 올 계획 (전설 : __thisIsHashKey_thisIsRangeKey) :

    timeline = { // post 
        __usarname:"totocaster", 
        _date:"1245678901345", 
        record_type:"collection", 
        items: ["2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594","2d931510-d99f-494a-8c67-87feb05e1594"], 
        number_of_likes:123, 
        description:"Hello, this is cool" 
    } 
    
    timeline = { // new follower 
        __usarname:"totocaster", 
        _date:"1245678901345", 
        type:"follow", 
        follower:"tamuna123" 
    } 
    
    timeline = { // new like 
        __usarname:"totocaster", 
        _date:"1245678901345", 
        record_type:"like", 
        liker:"tamuna123", 
        like_date:"123255634567456" 
    } 
    
    users = { 
        __username:"totocaster", 
        avatar_url:"2d931510-d99f-494a-8c67-87feb05e1594", 
        followers:["don_gio","tamuna123","barbie","mikecsharp","bassman"], 
        following:["tamuna123","barbie","mikecsharp"], 
        likes:[ 
        { 
         username:'barbie', 
         date:"123255634567456" 
        }, 
        { 
         username:"mikecsharp", 
         date:"123255634567456" 
        }], 
        full_name:"Toto Tvalavadze", 
        password:"Hashed Key", 
        email:"[email protected]" 
    } 
    

    당신은 내가 온 - 업 타임 라인 컬렉션 직접 내 모든 게시물을 저장 볼 수 있듯이. 이렇게하면 날짜와 사용자 이름 (해시 및 범위 키)을 사용하여 게시물을 쿼리 할 수 ​​있습니다. 모든 것이 잘 보입니다. 여기에 문제가 있습니다. :

    한 번에 사용자 시간대를 쿼리 할 수 ​​없습니다. 이것은 시스템에 의해 가장 많이 요구되는 쿼리 중 하나가 될 것이고 효율적인 방법을 제공 할 수는 없습니다. 도와주세요. 감사.

  • +0

    내 소셜 네트워크를 계획하는 동안 이것은 지속적인 질문입니다 – MCKapur

    +0

    타임 라인 테이블에서 모든 사용자 데이터를 가져올 수 있기를 원하십니까? 해당 사용자 이름의 hashkey에 대해서만 쿼리 할 수 ​​있습니까? 그게 아니라면 간단한 SQL과 비슷한 문법으로 약간 더 자세한 쿼리 예제를 제공하십시오. 즉, 'USERNAME = totacaster 인 타임 라인에서 모두 선택' – greg

    답변

    1

    타이탄 그래프 데이터베이스 (http://thinkaurelius.github.com/titan/)와 Neo4j (http://www.neo4j.org/)를 확인해 보겠습니다.

    나는 대륙간 탄도탄이 큰 데이터 세트로 꽤 잘 확장한다고 주장한다.

    궁극적으로 나는 당신의 모델이 그래프와 잘 맵핑된다고 생각합니다. 사용자와 게시물은 노드 일 수 있으며 가장자리를 통해 임의로 연결할 수 있습니다. 사용자 (노드)는 다른 사용자 (노드)의 친구 (가장자리)입니다.

    사용자 (노드)의 타임 라인에 많은 게시물 (노드)이 있습니다. 그런 다음 그래프를 통해 흥미로운 트래버스를 실행할 수 있습니다.

    +0

    OP는 DynamoDB에 관한 것이지만 SN에 대한 좋은 선택이 아니라고 말하는가? – SuperUberDuper

    0

    나는 매일 뉴스 피드를 사용합니다. (스트림 - 프레임 워크의 저자와 설립 getstream.io)

    내가 보는 가장 일반적인 해결 방법은 다음과 같습니다

    • 카산드라 (인스 타 그램)
    • MongoDB를
    • 레디 스 (비싸지 만 쉬운)
    • DynamoDB의
    • RocksDB (링크드 인)

    대부분의 사람들은 쓰기에 팬 아웃을 사용하거나 읽기에 팬 아웃을 사용합니다. 따라서 작업 솔루션을 쉽게 구축 할 수 있지만 비용이 많이 듭니다. 최선의 방법은 두 가지 방법을 조합하여 사용하는 것입니다. 대부분의 경우 쓰기에 팬 아웃을하지만, 매우 인기있는 피드의 경우 메모리에 보관하십시오.

    Stream-Framework 오픈 소스이며, 카산드라를 지원/레디 스 & 파이썬

    getstream.io은 호스팅 솔루션은 이동 & Rocksdb 위에 구축입니다. https://shinesolutions.com/2016/06/27/a-deep-dive-into-dynamodb-partitions/

    는 또한 레디 스 또는 DynamoDB의 기반 솔루션은 꽤 빨리 비싼 얻을 것이다 참고 :

    당신이 DynamoDB의 오른쪽 파티션 키 설정을 반드시 사용하게 할 경우

    . Cassandra 또는 RocksDB를 활용하면 사용자 당 비용을 가장 낮출 수 있습니다.

    관련 문제