2013-03-09 14 views
28

Potrzebuję pomocy w modelowaniu moich danych w Mongo. Większość moich doświadczeń dotyczyła relacyjnych baz danych, dopiero zaczynam od mongo. Modeluję dane dla różnych zdarzeń.Mongodb: wiele kolekcji lub jedna duża kolekcja z indeksem

  1. Każde "zdarzenie" z tymi samymi polami.
  2. Każde "zdarzenie" będzie zawierać setki do milionów dokumentów/wierszy.
  3. Zdarzenia są dynamiczne, tzn. Nowe będą tworzone w razie potrzeby. np. może utworzyć nowe wydarzenie "Letnie Igrzyska Olimpijskie 2016".

Prawdopodobnie najważniejsze przy obsłudze zdarzeń (operacje CRUD) użytkownicy będą musieli podać nazwę zdarzenia.

Widzę kilka sposobów, aby to zrobić do tej pory i nie chcę popełnić poważnego błędu w konfiguracji mojego modelu danych "w niewłaściwy" sposób.

1) Jeden zbiór "zdarzeń" zawierający dane dla wszystkich zdarzeń. Indeks nazwy "zdarzenia". Kwerenda będzie wyglądać następująco:

db.events.find({event: 'Summer Olympics 2012'); 
{event: 'Summer Olympics 2012', attributes: [{name: 'joe smith', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'jane doe', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'john avery', .... } 
{event: 'Summer Olympics 2012', attributes: [{name: 'ted williams', .... } 

db.events.find({event: 'Summer Olympics 2013'}) 
{event: 'Summer Olympics 2016', attributes: [{name: 'steve smith', .... } 
{event: 'Summer Olympics 2016', attributes: [{name: 'amy jones', .... } 

2) Kolekcja dla każdego nowego wydarzenia, które się pojawi, w/collection, aby śledzić wszystkie nazwy zdarzeń. Brak indeksu nazwy wydarzenia, ponieważ każde zdarzenie jest przechowywane w innej kolekcji.

// multiple collections, create new as needed 
db.summer2012.find() // get summer 2012 docs 

db.summer2016.find() // get summer 2016 docs 

//'events' collection 
db.events.find() // get all events that I would have collections for 
{name: 'summer2012', title: 'Summer Olympics 2012}; 
{name: 'summer2016', title: 'Summer Olympics 2016}; 

Dla # 1 Jestem trochę zaniepokojony, że kiedyś osiągnie 100 zdarzeń każdy z milionami rekordów wyszukiwań za „zdarzenie” będzie powolny, nawet jeśli jedno z wydarzeń ma tylko 500 dokumentów.

Dla # 2 Czy "omijam" model mongo tutaj, tworząc nową kolekcję za każdym razem, gdy wydarzenie przychodzi?

Wszelkie komentarze/pomysły są mile widziane, ponieważ nie mam pojęcia, który z nich osiągnie lepsze wyniki, a który z nich sprawi, że będę miał więcej problemów w drodze. Rozejrzałem się (strona mongo zawiera) i nie mogę znaleźć konkretnej odpowiedzi.

+0

Co to za atrybuty? Ludzie? Czy masz wydarzenia x osoby, które biorą udział w wydarzeniu? Czy te osoby są zarejestrowane w twoim systemie? Jeśli dopiero zaczynasz od MongoDB, spójrz na to: https://code.google.com/p/morphia/wiki/QuickStart – rbento

+0

Niestety zły przykład :(. Naprawdę jest to jego dane geoprzestrzenne. , y dla każdego dokumentu Użytkownicy mogą łatwo dodać/upuścić pinezkę na mapie dla swojej bieżącej lokalizacji i dołączyć pewne metadane dotyczące tej lokalizacji, np. zdjęcia/wideo, tytuł, pogoda itp. Wyobraźcie sobie grupę ludzi na olimpiadzie, dodając nowe dane.Ludzie/lokalizacje same różnice.Kwestia jest taka, że ​​każde "zdarzenie" może mieć miliony dokumentów, jeśli każde oddzielne wydarzenie będzie żyło we własnym zbiorze, lub wyrzucić wszystkie zdarzenia do tej samej kolekcji? Jedna kolekcja z 10 milionami dokumentów, lub 10 kolekcje, z których każda ma ~ 1 milion dokumentów. – lostintranslation

+0

Także zaczyna się w Mongo, myślę, że ta część instrukcji jest ważna: http://docs.mongodb.org/manual/applications/indexes/. To prowadzi mnie do tej imprpessji ten projekt db MongoDb, może i powinien być bardzo podobny do projektowania db, i tak bym pulmp for yr first option, szczególnie jeśli zamierzasz robić zapytania "cross-event" –

Odpowiedz

38

Od docs Mongo tutaj: data modeling

W niektórych sytuacjach, można wybrać do przechowywania informacji w kilku kolekcjach zamiast w jednej kolekcji.

Rozważ dzienniki pobierania próbek przechowujące dokumenty dziennika dla różnych środowisk i aplikacji. Zbiór dzienników zawiera: dokumenty w następującym formacie:

{log: "dev", ts: ..., info: ...} {log: "debug", ts: ..., info:. ..}

Jeśli łączna liczba dokumentów jest niska, możesz grupować dokumenty według kolekcji według . W przypadku dzienników należy rozważyć przechowywanie odrębnych kolekcji , takich jak logs.dev i logs.debug. Kolekcja logs.dev zawierałaby tylko dokumenty związane ze środowiskiem deweloperów.

Ogólnie rzecz biorąc, posiadanie dużej liczby kolekcji nie ma znaczącej kary za wydajność i skutkuje bardzo dobrą wydajnością. Wyraźne kolekcje są bardzo ważne dla wysokowydajnego przetwarzania wsadowego.

Mówił również w/facet 10gen. W przypadku naprawdę dużych kolekcji wymienił wiele korzyści, które można podzielić na mniejsze, bardziej szczegółowe kolekcje. Jego komentarz do korzystania z jednej kolekcji dla wszystkich danych i korzystania z indeksu był:

To, że możesz coś zrobić, nie znaczy, że powinieneś. Model Twoje dane odpowiednio. może być łatwo przechowywać w jednej dużej kolekcji i indeksie, ale nie zawsze jest to najlepsze podejście.

Powiązane problemy