Шаблон дизайна таблицы Dynamodb - PullRequest
0 голосов
/ 04 октября 2018

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

Я новичок в 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 , будет означать создание идентификатора получателя в качестве ключа сортировки в таблице Building.

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

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

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

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

1 Ответ

0 голосов
/ 05 октября 2018

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

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

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

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

...