2015-07-19 4 views
0

Исходя из фона реляционной базы данных, я обнаружил, что иногда найти правильный способ структурирования баз данных NoSQL - это вызов (да, я понимаю, что заявление звучит глупо). Я работаю с DynamoDB.NoSQL Структурирование данных

Если у меня есть 3 объекта - пользователь, отчет и здание, и многие пользователи могут подать много отчетов о здании, будет ли приемлема следующая структура?

User - index on userId 
Building - index on buildingId 
Report - index on reportId, userId and buildingId 

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

ответ

1

При использовании DynamoDB a global secondary indexes предоставляет альтернативные методы для запроса данных из таблицы.

На основе таблиц, описанных здесь, является структурой, которая может работать:

Таблица Пользователь

  • Hash Ключ: идентификатор пользователя

Строительство Таблица

  • Hash Ключ: buildingId

Report Таблица

  • Hash Ключ: ReportID
  • ReportUser GSI
    • Hash Ключ: идентификатор пользователя
  • BuildingUser GSI
    • Hash Ключ: buildingId

Ключа к выше конструкциям являются глобальными вторичными индексами по отчету о таблице. В отличие от хеш-ключа (и дополнительного ключа диапазона) в основной таблице хэш-ключ (и дополнительный ключ диапазона) в GSI не должен быть уникальным. Это означает, что вы можете запросить все отчеты, представленные конкретным пользователем или всеми отчетами для определенного файла buildId.

В реальной жизни эти GSI, вероятно, захотят включить ключ диапазона (например, дату), чтобы можно было упорядочить записи при их запросе.

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

Смежные вопросы