8

To pytanie może być istotne dla dowolnej bazy danych opartej na dokumencie NoSQL.Projektowanie "kanału społecznościowego" w DynamoDB

Robię interesującą sieć społecznościową i zdecydowałem się pójść z DynamoDB ze względu na skalowalność i brak czynników związanych z bólem. W bazie danych znajdują się tylko dwie główne jednostki: użytkowników i wpisów.

Wymóg wspólnego odpytuje są bardzo proste:

  • feed Home (RSS ludzi Obserwuję)
  • mojego kanału/użytkownika (paszy kopalni lub konkretnego kanału użytkownika)
  • Lista użytkownika I/user następnie
  • Lista zwolenników

Tutaj jest baza danych Schemat I wymyślić tej pory (legenda: __thisIsHashKey i _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]" 
} 

Jak widać doszedłem-up przechowywania wszystkich mój post bezpośrednio w kolekcji osi czasu. W ten sposób mogę wyszukiwać posty z użyciem daty i nazwy użytkownika (klawisze skrótu i ​​zakresu). Wszystko wydaje się być w porządku, , ale tutaj jest problem::

Nie mogę wykonać zapytania o oś czasu użytkownika za jednym razem. Będzie to jedno z najbardziej poszukiwanych przez system zapytań i nie mogę zapewnić wydajnego sposobu na to. Proszę pomóż. Dzięki.

+0

To jest dla mnie ciągłe pytanie, podczas gdy planuję moją sieć społecznościową – MCKapur

+0

Chcesz mieć możliwość uzyskania wszystkich danych użytkownika z tabeli osi czasu? Możesz po prostu zapytać tylko o skrót do tej nazwy użytkownika? Jeśli tak nie jest, daj mi nieco bardziej szczegółowy przykład zapytania, może w prostej składni podobnej do SQL. tj. 'WYBIERZ wszystko z osi czasu, gdzie USERNAME = totacaster' – greg

Odpowiedz

1

Chciałbym sprawdzić bazę danych Titan (http://thinkaurelius.github.com/titan/) i Neo4j (http://www.neo4j.org/).

Wiem, że Titan twierdzi, że skaluje się całkiem dobrze z dużymi zbiorami danych.

Ostatecznie myślę, że twój model jest dobrze odwzorowany na wykres. Użytkownicy i posty będą węzłami, a następnie możesz łączyć je dowolnie za pomocą krawędzi. Użytkownik (węzeł) jest przyjacielem (krawędzią) innego użytkownika (węzła).

Użytkownik (węzeł) ma wiele postów (węzłów) na swojej osi czasu. Następnie możesz uruchomić interesujące traversale za pośrednictwem wykresu.

+0

OP dotyczy jednak DynamoDB, czy uważasz, że nie jest to dobry wybór dla SN? – SuperUberDuper

0

Codziennie pracuję z kanałami informacyjnymi. (Autor Stream-Ram i założył getstream.io)

Najczęstsze rozwiązania widzę to:

  • Cassandra (Instagram)
  • Redis (drogie, ale łatwe)
  • MongoDB
  • DynamoDB
  • RocksDB (Linkedin)

Większość ludzie używają fanoutów podczas pisania lub fanoutów podczas czytania. Ułatwia to zbudowanie działającego rozwiązania, ale może szybko stać się drogie. Najlepiej jest użyć kombinacji tych dwóch podejść. Tak więc w większości przypadków pisz w napędzie, ale w przypadku bardzo popularnych kanałów przechowuj je w pamięci.

Stream-Framework jest open source i wspiera Cassandrę/Redis & Python

getstream.io jest hostowane rozwiązanie zbudować na szczycie Go & Rocksdb.

Jeśli nie kończy się przy użyciu DynamoDB należy skonfigurować prawy klawisz partycji: https://shinesolutions.com/2016/06/27/a-deep-dive-into-dynamodb-partitions/

Należy również pamiętać, że rozwiązanie Redis lub DynamoDB oparta będzie drogie dość szybko. Otrzymasz najniższy koszt na użytkownika, wykorzystując Cassandrę lub RocksDB.