MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak obsługiwać dokumenty cyrkularne w MongoDB/DynamoDB?

Chociaż NoSQL generalnie zaleca denormalizację modeli danych najlepiej jest nie umieszczać nieograniczonej listy w pojedynczym wpisie bazy danych. Aby modelować te dane w DynamoDB, należy użyć lista sąsiedztwa do modelowania relacji wiele-do-wielu . Nie ma opłacalności sposób modelowania danych, który znam, aby umożliwić Ci uzyskanie wszystkich potrzebnych danych w jednym połączeniu. Powiedziałeś jednak, że najważniejsza jest prędkość (bez podawania wymogu opóźnień), więc postaram się dać ci wyobrażenie, jak szybko możesz uzyskać dane przechowywane w DynamoDB.

Twoje schematy wyglądałyby mniej więcej tak:

Actor {
    ActorId, <-- This is the application/database id, not the actor's actual ID
    Name,
    Age,
    Bio
}

Film {
    FilmId, <-- This is the application/database id for the film
    Title,
    Description,
    ReleaseDate
}

ActedIn {
    ActorId,
    FilmId
}

Aby wskazać, że aktor zagrał w filmie, wystarczy wykonać tylko jeden zapis (co z mojego doświadczenia wynika z jednocyfrowych milisekund przy użyciu DynamoDB), aby dodać element ActedIn do tabeli.

Aby uzyskać wszystkie filmy dla aktora, musiałbyś zadać jedno zapytanie, aby uzyskać wszystkie zagrane w związkach, a następnie odczytać partię, aby uzyskać wszystkie filmy. Typowe opóźnienia dla zapytania (z mojego doświadczenia) wynoszą poniżej 10 ms, w zależności od szybkości sieci i ilości danych przesyłanych przez sieć. Ponieważ relacja ActedIn jest tak małym obiektem, myślę, że można spodziewać się średnio 5 ms dla zapytania, jeśli zapytanie pochodzi z czegoś, co działa również w centrum danych AWS (EC2, Lambda itp.).

Otrzymanie pojedynczego elementu będzie trwało mniej niż 5 ms i możesz to robić równolegle. Istnieje również interfejs API BatchGetItems, ale nie mam dla Ciebie żadnych statystyk na ten temat.

Czy wystarczy ci ok. 10 ms?

Jeśli nie, możesz użyć DAX , który dodaje warstwę pamięci podręcznej do DynamoDB i obiecuje opóźnienie żądania <1ms.

Jaki jest niemożliwy do utrzymania, nieopłacalny sposób, aby to zrobić w jednym połączeniu?

Dla każdej relacji ActedIn przechowuj swoje dane w następujący sposób:

ActedIn {
    ActorId,
    ActorName,
    ActorAge,
    ActorBio,
    FilmId,
    FilmTitle,
    FilmDescription,
    FilmReleaseDate
}

Wystarczy wykonać tylko jedno zapytanie dla dowolnego aktora, aby uzyskać wszystkie szczegóły dotyczące jego filmu, i tylko jedno zapytanie, aby uzyskać wszystkie szczegóły dotyczące aktora dla danego filmu. Nie rób tego. Zduplikowane dane oznaczają, że za każdym razem, gdy musisz zaktualizować szczegóły dotyczące aktora, musisz zaktualizować je dla każdego filmu, w którym był, i podobnie dla szczegółów filmu. To będzie koszmar operacyjny.

Nie jestem przekonany; wygląda na to, że NoSQL jest do tego straszny.

Należy pamiętać, że NoSQL występuje w wielu odmianach (NoSQL =Nie tylko SQL), więc nawet jeśli jedno rozwiązanie NoSQL nie działa dla Ciebie, nie należy go całkowicie wykluczać. Jeśli absolutnie potrzebujesz tego w jednym wywołaniu, powinieneś rozważyć użycie bazy danych wykresów (który jest innym typem bazy danych NoSQL).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Złożone rzadkie indeksy MongoDB

  2. Mangusta - indeks 2dsphere - howto

  3. MongoDB- Pobieranie dokładnego elementu tablicy, z wyłączeniem innych

  4. Eval MongoDB Query z NodeJS

  5. Jak utworzyć nową bazę danych w MongoDB za pomocą sterownika c#?