2013-08-30 11 views
7

Używam PHP i MySQL dla społecznego systemu pracy nettoco jest najlepszym sposobem na utworzenie dokumentu wewnątrz kolekcji w MongoDB

mam MySQL tabela o nazwie member_feed, w tym stół zapisać pasze dla każdego członka, moja struktura tabeli jest:

|member_feed_id | member_id | content_id | activity_id | 

w tej tabeli mam więcej niż 120 milionów rekordów, a każdy członek ma zestaw rekordów.

Obecnie pracuję do migracji z MySQL do MongoDB i jestem nowy na MongoDB. , więc muszę przekonwertować ten tabeli na kolekcja w MongoDB. myślę budować mój kolekcję dla member_feed stole jak:

1- każdym rzędzie od member_feed tabeli jako dokumentu, jak:

{ "member_id: 1" , "content_id: 10" , "activity_id: 1" }, 
{ "member_id: 1" , "content_id: 11" , "activity_id: 2" }, 
{ "member_id: 1" , "content_id: 12" , "activity_id: 3" }, 
{ "member_id: 2" , "content_id: 9" , "activity_id: 4" }, 
{ "member_id: 2" , "content_id: 11" , "activity_id: 5" }, 
{ "member_id: 2" , "content_id: 14" , "activity_id: 6" } 

więc ta kolekcja będzie miała 120 mln rekord

2- wszystkie kanały członkowskie dla jednego dokumentu o numerze, które mają identyfikator członka i wszystkie kanały dla tego członka.

{ 
     member_id: '1', 
     feeds: [ 
      { content_id: '10', 'activity_id' : 1 }, 
      { content_id: '11', 'activity_id' : 2 }, 
      { content_id: '12', 'activity_id' : 3 } 
     ] 

     member_id: '2', 
     feeds: [ 
      { content_id: '9', 'activity_id' : 4 }, 
      { content_id: '11', 'activity_id' : 2 }, 
      { content_id: '14', 'activity_id' : 6 } 
     ] 
    } 

więc kiedy muszę zobaczyć kanał użytkownika na jego desce rozdzielczej zrobię:

1-dostać wszystko IDS z dokumentu wewnątrz MongoDB jak $contentIdsFromMongo przez member_id

2- zapytania wykonywania w MySQL aby uzyskać zawartość jak

select * from content where content_id in($contentIdsFromMongo); 

i $ contentIdsFromMongo moi mają być 10000 ids, więc ma to wpływ na wydajność MySQL.

i mam MongoDB na serwerze i MySQL na innym serwerze

aw co drugim układzie włożyć dużo rekord dla każdego członka, więc muszę dokument, aby móc wykonać całą operację jak (insert , aktualizacja, wybierz, ..)

co jest najlepszym sposobem, aby stworzyć dokumenty w kolekcji dla każdego członka, i to w ten sposób dobre lub złe dla pracy z MongoDB

Dzięki.

Odpowiedz

3

Dwa główne rozważania w modelowaniu danych dla sklepów dokumentu:

  1. w jaki sposób dane będą rosnąć i zmieniać się w czasie, a
  2. rodzaje zapytań aplikacja będzie wykonywać.

Podałeś informacje o tym, jak powinny rosnąć dane. Na tej podstawie sugerowałbym opcję nr 1.

{ "member_id: 1" , "content_id: 10" , "activity_id: 1" } 

Ale ważne jest również, aby zrozumieć, jakiego rodzaju zapytań będzie wykonywanie i jak zamierzają wykorzystać te dane w aplikacji.

Dodatkowe opcje są możliwe:

  • jeden dokument za członka z tablicą pasz w każdej grupie
  • dokumentów przez treść lub działalności id, jeśli jest to w jaki sposób aplikacja będzie wyszukiwać dane.

Podsumowując, aby uzyskać optymalny model, ważne jest również udzielenie odpowiedzi na pytanie 2 powyżej.

PS: Opcja 2 w pytaniu zdecydowanie brzmi jak zły pomysł, biorąc pod uwagę, jak opisywane dane będą rosły.

Można także zapoznać się z tym linkiem do niektórych dodatkowych wytycznych: http://docs.mongodb.org/manual/core/data-modeling/

+0

Dzięki za odpowiedź Anuraga, –

+0

Dzięki za odpowiedź Anurag, w moim systemie używam beanstalkd do buszu paszy dla moich członków, więc mam wiele rekordów insertów w każdej sekundzie do mojej tabeli, więc to samo będzie w tabeli MongoDB, więc dane będą rosły obficie iw profilu użytkownika wyświetlam wszystko dla elementu, więc mam zapytanie wyboru i mam również aktualizację zapytania, czy myślisz korzystać z pierwszej opcji. Jeszcze raz dziękuję –

+0

Ok, więc pytania będą wyglądać podobnie - uzyskać wszystkie kanały dla członka, aby można było go wyświetlić na stronie profilu? Jaka jest przybliżona szybkość, z jaką wkładki zdarzają się dla tego samego członka? Na koniec, jak duży jest twój zdaniem dokument, gdybyś miał go na jednego członka? –

Powiązane problemy