Я проектирую слой базы данных для DynamoDB в nodejs.Просто интересно, как подходить к дизайну ключей хеша / диапазона, учитывая предложение Amazon о том, что среднестатистическому веб-приложению следует использовать только одну таблицу базы данных.
Итак, предположим, что программисты, использующие этот слой базы данных, могут определять типы объектов данных и каждый типсможет иметь а) первичный идентификатор и б) различные поля, специфичные для типа объекта.Данные будут запрашиваться по а) первичному идентификатору сущности вместе с типом сущности (первичный идентификатор должен быть уникальным для типа сущности) или б) по значениям поля (с различными операторами сравнения).
Давайте рассмотрим примертип сущности, пользователи.Типичный объект пользователя может выглядеть следующим образом:
{
username: 'Bob',
email: 'bob@bob.com',
password: 'asdfadsfasdf',
history: {
added: 1538716051,
donations: 1000,
orders: [
{
time: 1538714556,
items: [
{ SKU: 'adfasdfas', qty: 2 },
{ SKU: 'bhhrdsgf', qty: 1 },
],
},
{
time: 1538344765,
items: [
{ SKU: 'vfgsre', qty: 3 },
{ SKU: 'nnns', qty: 2 },
],
},
],
},
}
В этом примере user
будет типом сущности, username
будет уникальным идентификатором, а email
, password
и history
- это все специфичные для типа поля для типа объекта пользователя.И скажем, мы знаем, что мы будем делать запросы чаще всего по имени пользователя (точное совпадение), иногда мы будем искать пользователей, которые имеют самые высокие или самые низкие цифры для пожертвований, или иногда мы будем искать пользователей, которые сделали заказы после определенногоdate (или которые не сделали заказ в последнее время).
Программисты смогут указывать в приложении другие типы сущностей, например, статьи блога, которые будут иметь совершенно другой набор полей (title
,body
, tags
и т. Д.), Но, очевидно, в DynamoDB нам не следует создавать новые таблицы для каждой, как в MYSQL.Также нам нужен способ разработки базы данных, которая позволит различным объектам типов, определенных в будущем, запрашивать значения полей различными способами, а также их первичные идентификаторы.И поля могут быть сложными и вложенными.Средний запрос страницы для веб-приложения будет запрашивать несколько разных сущностей из разных типов сущностей, поэтому я думаю, что это может помочь распределить нагрузку запроса по разделам;Кроме того, может ли это помочь каким-либо образом при указании, как данные будут запрашиваться?Поможет ли это ускорить запросы, если мы знаем, что несколько типов сущностей будут запрашиваться одновременно?
Что такое хорошая стратегия хеширования / диапазона ключей для достижения этой цели?Меняется ли модель, если мы, скажем, начинаем считать заказы новым типом сущности и храним ссылки на них в пользовательском объекте вместо полных значений заказов?Можно ли это сделать только с одной таблицей, как предлагает Amazon?