在DynamoDB中建模实体和标签

时间:2018-10-04 00:20:40

标签: nosql amazon-dynamodb dynamodb-queries

我有一个包含诸如“目录”,“集合”等实体的应用程序。我想使用标记来建模实体之间的关系。因此,例如,我可能有一个销售目录和一个销售集合。我会知道两个实体都是相连的,因为它们都有相同的标签:“ sales”。

这是我需要做的查询:

1)获取特定类型的所有实体,即目录

2)通过ID获取实体

3)获取带有特定标签的所有实体

4)通过某个标签查询实体列表,并检索与该实体关联的其余标签。

我想知道如何在Dynamo DB中建模

我首先以为我可以这样做:

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在SK上使用BeginsWith和EndsWith,在GSI上使用3,类型标签是PK,但不能完成4。

将来,我还希望能够按标签类型进行查询。我看不到像亚马逊建议的那样在一个表中或不使用RDBMS的情况下如何实现所有这些功能。

我真的很感激我能得到的任何意见或指导。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将其用作架构

|    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是GSI1的SK(GSI1:全球二级指数)

这将解决诸如以下的用例

  1. 获取所有销售实体

    Select* where PK=entityType#sales in table GSI1

  2. 通过ID获取实体

    Select * wehere PK=id and SK=metadata

  3. 获取所有带有标签Sales的实体

    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.