Шаблон проектирования стола Dynamodb

Я не уверен, что это правильное место, чтобы задать этот вопрос.

Я новичок в Dynamodb и пытаюсь найти выход, чтобы создать небольшое веб-приложение. Я прочитал здесь лучшие практики http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/BestPractices.html

Мои таблицы будут:

  1. Здания
  2. Арендаторы (в здании может быть столько арендаторов, сколько определяется номером этажа)
  3. Получатели (на каждом этаже может быть столько получателей, как правило, псевдоним арендатора)
  4. Курьеры
  5. Доставка (курьер, привязанный к конкретному получателю)

В настоящее время мой подход к разработке схемы выглядит так:

// Tables
// PK: Building Id, SK: name
- Building ID : {
  name: <Building Name>
  Tenants: [
     { TenantId: { Receipients: [{Receipient Id 1, Receipient Id 2...}] }
  ] 
}

// PK: Courier Id, SK: createdAt
- CourierId :  {
 name: <Courier name>
 ...
}

//PK: Not Sure, SK: Not Sure <-- This is where I messed up, looks relational, defeats the purpose?
- Deliveries: {
  receipient id: Courier id
}

Чтобы перечислить все доставки вместе с данными получателя, мне понадобятся данные получателя по идентификатору получателя. Согласно документам LSI, получатель Id как ключ сортировки в таблице Building.

Поскольку у вас могут быть только элементы верхнего уровня в таблице (получатель не является тем), это кажется невозможным согласно руководству https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/GSI..html.

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

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

Поскольку доставка кажется взаимно однозначной связью курьеров с получателем, можно ли сохранять идентификаторы и перебирать всех получателей и курьеров во время перечисления всех доставок?


person ashutosh    schedule 04.10.2018    source источник


Ответы (1)


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

Я не знаю, есть ли у вас опыт в облачной разработке, но с помощью облачной инфраструктуры вы можете иметь одну базу данных для каждого типа структуры данных. Например:

  1. Вы можете поддерживать данные о зданиях и курьерах в DynamoDB и использовать их в основном для запросов по идентификаторам; может быть, даже в той же таблице. У вас могут быть разные документы / объекты с разной структурой;
  2. Вы можете сохранить информацию о доставках в реляционной базе данных с помощью RDS. В зависимости от вашего региона AWS вы можете попробовать Aurora Serverless. Это обойдется вам дешевле.
  3. Если ваша информация в объектах DynamoDB не становится большой (объекты / документы DynamoDB имеют ограничение в 400 КБ), вы можете сохранить все данные только в одном объекте и использовать поток DynamoDB для отправки информации в поисковое решение (CloudSearch или ElasticSearch) . Чем когда вам нужно запросить одну доставку, вы используете конечную точку поиска. Когда вам нужна история здания или арендатора, вы можете использовать конечную точку DynamoDB.

Есть много других решений, если вы расширите свое представление и будете использовать более одного ресурса вместе.

person Gustavo Tavares    schedule 04.10.2018