Моделирование сущностей и тегов в DynamoDB - PullRequest
0 голосов
/ 04 октября 2018

У меня есть приложение, которое содержит такие объекты, как «каталоги», «коллекции» и т. Д. Я хотел бы смоделировать отношения между объектами с помощью тегов.Так, например, у меня может быть каталог продаж и коллекция продаж.Я бы знал, что оба объекта связаны, потому что они оба имеют один и тот же тег: «продажи».

Вот запросы, которые мне нужно сделать:

1) Получить все объекты определенного типа, т.е.catalogs

2) Получить сущность по идентификатору

3) Получить все сущности с определенным тегом

4) Запросить список сущностей по определенному тегу и получить остальныетеги, связанные с этим объектом.

Мне интересно, как смоделировать это в DB Dynamo

Сначала я подумал, что смогу сделать это:

PK = entityType_id (e.g. catalog_1)
SK = Tag (e.g. sales)

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

Я подумал, может быть, я смогу сделать это:

PK = entityType (e.g. catalog)
SK = id_tag (e.g. 1_sales)

Я мог бы выполнить: 1,2 выше, используя BeginsWith и EndsWith на SK, и 3, используя GSI, где тег типаПК, но не смог выполнить 4.

В будущем я также хотел бы иметь возможность выполнять запросы по типу тега.Я не понимаю, как все это возможно в одной таблице, как рекомендует Amazon или без использования СУБД.

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

Спасибо!

1 Ответ

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

вы можете использовать это как схему

|    pk   |     sk               |     GSI1 PK          | 
|  uid1   |    metadata          |                      |   tags:["sales","purchase", "borrow"] | entityType:["catalogs"]
|  uid1   |entityType#catalogs   | entityType#catalogs
|  uid1   |    tag#sales         | tag#sales
|  uid1   |    tag#purchase      | tag#purchase
|  uid1   |    tag#borrow        | tag#borrow
|  uid2   |entityType#collection | entityType#collection
|  uid2   |    tag#borrow        | tag#borrow
|  uid2   |    metadata          |                      |   tags: ["borrow"] | entityType:["collection"]

, где PK - SK GSI1 (GSI1: глобальный вторичный индекс)

Это решит варианты использования, такие как

  1. Получить всю сущность продаж

    Select* where PK=entityType#sales in table GSI1

  2. Получить сущность по id

    Select * wehere PK=id and SK=metadata

  3. Получить все сущности с тегом Продажи

    Select* where PK=tag#sales in table GSI1

  4. Запросить список сущностей по определенному тегу и получить остальныетеги, связанные с этим объектом.

    Use 3rd query and get all list of uids and then do a get all tags, or duplicate tags data as well in every row.

...