DynamoDB — Как «разорвать» иерархию без использования связей?

#amazon-web-services #nosql #amazon-dynamodb

#amazon-web-services #nosql #amazon-dynamodb

Вопрос:

Рассмотрим следующее представление JSON DynamoDB для программного обеспечения для управления проектами.

 Application = {
  "Users" : [
    "user1" : {"name" : "john"},
    "user2" : {"name" : "jack"}
  ]
  "Projects" : [
    "project1" : {
      "users" : [
        "user1",
        "user2"
      ]
    }
  ]
}
  

В проекте может быть много пользователей, а у пользователя может быть много проектов.

Рекомендуется ли использовать пользовательский ключ / идентификатор в Projects> project1> users? Я вижу, что я имитирую традиционные отношения и на самом деле не использую DynamoDB правильно.

Я прочитал руководство по отношениям «многие ко многим» здесь, но, честно говоря, я просто не могу понять их визуальную схему или объяснения.

Ответ №1:

Это сложная тема, и я не смог бы объяснить все это в этом ответе, но я могу указать вам на несколько отличных ресурсов, которые должны предоставить вам ответы, поскольку они подробно рассматривают эту тему.

AWS re: Invent 2018: видео с глубоким погружением в Amazon DynamoDB : — Я предлагаю посмотреть все целиком, чтобы полностью понять концепцию, но вы можете пропустить 45:42, чтобы сразу перейти к части об иерархическом формировании данных.

Ответ №2:

Если вы используете базу данных для представления связей, например, между пользователями и проектами, особенно когда у вас отношения «многие ко многим», вы можете рассмотреть возможность использования графической базы данных, такой как AWS Neptune. По общему признанию, графические базы данных могут показаться немного пугающими и теоретическими для начала.

Вы правы в том, что в DynamoDB вы будете использовать идентификатор пользователя в таблице projects, а затем выполнять поиск в таблице Users, чтобы получить пользователей для данного проекта. Причина, по которой кажется, что при этом неправильно используется DynamoDB, заключается в том, что DynamoDB по сути является только хранилищем значений ключей. Предоставленные значения могут быть довольно сложными, но вы не можете изначально моделировать какие-либо отношения между ключами.

DynamoDB теперь поддерживает транзакции, поэтому при необходимости вы можете запрашивать несколько таблиц в одной атомной транзакции.

Если вы обнаружите, что у вас много подобных отношений, вам следует вместо этого использовать реляционную или графическую базу данных.

Комментарии:

1. Ну, единственная причина, по которой я использую DynamoDB, заключается в том, насколько он дешев по сравнению с реляционной базой данных в AWS, за которую вы платите, как за машину EC2. И на самом деле это не несколько таблиц, моя идея состоит в том, чтобы поместить их в одну и ту же таблицу DynamoDB, просто рядом друг с другом.

2. Да, я понимаю. Возможно, вы можете посмотреть на Aurora Serverless , где вы платите только за хранение и транзакции, но, по общему признанию, цены будет немного сложно определить.