Реляционная таблица к Динамодб - PullRequest
0 голосов
/ 14 марта 2019

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

Текущие таблицы:

Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description

Я думал объединить эти таблицы в DynamoDB и использовать SchoolId в качестве ключа раздела, StudentId в качестве ключа сортировки. Тем не менее, я видел несколько похожих примеров использования StudentId в качестве ключа раздела.

И тогда я понял, что мы используем «имя пользователя» в каждой функции входа в систему, поэтому приложение будет часто запрашивать «имя пользователя» (иногда с паролем или токеном аутентификации). Эта ситуация заставляет меня задуматься; SchoolId в качестве ключа раздела и имя пользователя в качестве ключа сортировки.

Мне нужны некоторые идеи о том, что было бы наилучшей практикой в ​​этом случае, и некоторые предложения, чтобы дать мне лучшее понимание концепций NoSQL и DynamoDb.

1 Ответ

3 голосов
/ 15 марта 2019

В NoSql вы должны сначала попытаться перечислить все ваши варианты использования, а затем попытаться смоделировать схему таблицы.

Ниже приведены примеры использования, которые я вижу в вашем приложении

  1. Получение информации о пользователе для одного пользователя с идентификатором пользователя (пароль, возраст, имя, ...)

  2. Получение информации о школе для пользователя с userId (className, schoolName)

  3. Получить всех учеников в одной школе.

  4. Получить всех учеников в одном классе одной школы.

Основываясь на данных шаблонах доступа, я разработал схему

.
|    pk     |     sk        |   GSI1 PK          |  GSI1 SK            |  
|  12345    |    metadata   |                    |                     | Age:13 | Last name: Singh | Name:Rohan | ...
|  12345    |    schoolMeta |  SchoolName: DPS   | DPS#class5          | className:5 | 

С помощью приведенной выше схемы вы можете решить идентифицированные варианты использования как

  1. Получение информации о пользователе для одного пользователя с идентификатором пользователя

    Select * where pk=userId and sk=metadata

  2. Получить информацию о школе для пользователя с userId

    Select * where pk=userId and sk=schoolMeta

  3. Получить всех учеников в одной школе.

    Select * where pk=SchoolId from table=GSI1

  4. Получите всех учеников в одном классе.

    Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1

Но данная схема страдает тем недостатком, что

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