Дизайн таблицы индексов DynamodB Глобальный индекс или локальный - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть 3 таблицы DynamodB, например:

  companies:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: ${self:provider.region}.${opt:stage}.companies
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      Tags:
        - Key: Name
          Value: ${self:provider.region}.${opt:stage}.${self:custom.customDomain.domainName}
  addresses:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: ${self:provider.region}.${opt:stage}.addresses
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      Tags:
        - Key: Name
          Value: ${self:provider.region}.${opt:stage}.${self:custom.customDomain.domainName}
  users:
    Type: AWS::DynamoDB::Table
    DependsOn: companies
    Properties:
      TableName: ${self:provider.region}.${opt:stage}.users
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
        - AttributeName: email
          AttributeType: S
        - AttributeName: upload_id
          AttributeType: S
        - AttributeName: company
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
        - AttributeName: email
          KeyType: RANGE
      LocalSecondaryIndexes:
        - IndexName: LSI-${self:provider.region}-${opt:stage}-companyId-by-userId-index
          KeySchema:
            - AttributeName: company
              KeyType: HASH
            - AttributeName: id
              KeyType: RANGE
          Projection:
            ProjectionType: ALL
      GlobalSecondaryIndexes:
        - IndexName: GSI-${self:provider.region}-${opt:stage}-uploadId-by-userId-index
          KeySchema:
            - AttributeName: upload_id
              KeyType: HASH
            - AttributeName: id
              KeyType: RANGE
          Projection:
            ProjectionType: ALL
      Tags:
        - Key: Name
          Value: ${self:provider.region}.${opt:stage}.${self:custom.customDomain.domainName}

в основном запись компании будет иметь много адресов, и пользователь будет принадлежать только одной компании, этот пользователь был загружен с использованием уникального upload_id, который мог загрузитьмного пользователей, поэтому:

если я хочу получить всех пользователей, у которых есть определенный upload_id, лучше ли Глобальный индекс?

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

1 Ответ

0 голосов
/ 03 апреля 2019

Вы должны использовать только локальный вторичный индекс (LSI), если вам требуется, чтобы индекс был строго согласованным.Если вы в порядке с в конечном итоге непротиворечивым индексом, то вам следует использовать глобальный вторичный индекс (GSI), потому что у БИС есть много ограничений.

  • БИС нельзя изменить или удалить без удаления и повторного создания всей таблицы.GSI могут быть созданы / удалены в любое время без влияния на основную таблицу.
  • Для LSI у вас есть ограничение в 10 ГБ данных на ключ раздела .Без LSI существует ограничение в 10 ГБ на раздел, но вы не заметите этого, потому что DynamoDB может разделить ваши данные для одного ключа раздела на несколько разделов, если это необходимо.
  • При использовании БИС ограничение размера элемента в 400 КБ применяется к элементу плюс все его проекции БИС.Предмет в GSI учитывается отдельно от предмета в основной таблице.
  • Предоставленная емкость GSI может масштабироваться независимо от основной таблицы, тогда как LSI разделяют ту же емкость, что и базовая таблица.

Подробнее см. Улучшение доступа к данным с помощью вторичных индексов .

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