MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да обработвам кръгови документи в MongoDB/DynamoDB?

Докато NoSQL обикновено препоръчва денормализиране на моделите на данни, най-добре е да нямате неограничен списък в един запис в базата данни. За да моделирате тези данни в DynamoDB, трябва да използвате списък на съседство за моделиране на връзката много към много . Няма рентабилно начин за моделиране на данните, за който знам, за да ви позволи да получите всички данни, които искате, в едно обаждане. Вие обаче казахте, че скоростта е най-важна (без да давам изискване за забавяне), така че ще се опитам да ви дам представа колко бързо можете да получите данните, ако се съхраняват в DynamoDB.

Вашите схеми ще станат нещо подобно:

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
}

За да посочите, че даден актьор е играл във филм, трябва само да извършите едно записване (което е постоянно едноцифрени милисекунди, използвайки DynamoDB според моя опит), за да добавите ActedIn елемент към вашата таблица.

За да получите всички филми за актьор, ще трябва да направите заявка веднъж, за да получите всички актьори в отношенията, и след това да прочетете партида, за да получите всички филми. Типичните закъснения за заявка (според моя опит) са под 10 ms, в зависимост от скоростите на мрежата и количеството данни, изпращани по мрежата. Тъй като връзката ActedIn е толкова малък обект, мисля, че можете да очаквате среден случай от 5 ms за заявка, ако вашата заявка произхожда от нещо, което също се изпълнява в AWS център за данни (EC2, Lambda и т.н.).

Получаването на един елемент ще бъде под 5 ms и можете да правите това паралелно. Има и BatchGetItems API, но нямам статистика за вас за него.

И така, ~10ms достатъчно бързо ли е за вас?

Ако не, можете да използвате DAX , който добавя кеширащ слой към DynamoDB и обещава забавяне на заявката от <1ms.

Кой е неподдържаният, нерентабилен начин да направите това с едно обаждане?

За всяка връзка ActedIn съхранявайте данните си по този начин:

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

Трябва само да направите една заявка за всеки даден актьор, за да получите всички подробности за неговия филм, и само една заявка, за да получите всички подробности за актьора за даден филм. Всъщност не правете това. Дублираните данни означават, че всеки път, когато трябва да актуализирате подробностите за даден актьор, трябва да го актуализирате за всеки филм, в който е участвал, и по подобен начин за подробности за филма. Това ще бъде оперативен кошмар.

Не съм убеден; изглежда, че NoSQL е ужасен за това.

Трябва да запомните, че NoSQL се предлага в много разновидности (NoSQL =не само SQL) и така дори ако едно NoSQL решение не работи за вас, не трябва да го изключвате напълно. Ако абсолютно се нуждаете от това в едно извикване, трябва да обмислите използването на база данни на Graph (което е друг тип NoSQL база данни).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Създайте d3.js графика от данни на mongodb сървър

  2. Агрегиране и намаляване на вложен масив въз основа на ObjectId

  3. MongoDB $pop

  4. Mongoose Query:Намерете елемент в масив

  5. Заявка за документи, при които размерът на масива е по-голям от 1