amazon-web-services - DynamoDB 物化图模式示例

标签 amazon-web-services graph database-design nosql amazon-dynamodb

我开始研究 DynamoDB,但在阅读有关物化图模式的这一部分时卡住了:Best Practices for Managing Many-to-Many Relationships .

我想我有一些想法,但还不明白整个事情。
据我了解主表存储边的模式,每条边都可以具有属性(数据属性)。

例如(取自显示的表格):
节点 1 (PK 1) 与节点 2 有一条 DATE 类型的边,该边的类型是 BIRTH (SK DATE|2|BIRTH)。

我想这与 Cipher 中的 ()-[:BIRTH]->(:DATE { id: 2 }) 有点相同,对吧?

但在此之后,一切如何组合在一起就变得不清楚了。
例如:

  • 数据属性可以是 map 吗?
  • 数据属性是否必须在写入时写入两个位置?例如。在 (1, DATE|2|BIRTH) 和 (2, DATE|2) 下?
  • 如果我想添加一个1980-12-19出生的新人,我必须先查找相应的节点吗?
  • 如何获取与节点关联的所有属性?如何获取与边缘关联的所有属性?
  • 如何查询相邻节点?
  • ...

  • 有人可以通过几个用例向我解释一切是如何组合在一起的吗?

    提前致谢。

    最佳答案

    希望这能回答你所有的问题。这里有一些介绍性的东西。我将为所有示例使用通用表。哈希键是 node_a排序键是node_b .有一个反向查找 GSI,其中 node_b是哈希键和 node_a是排序键。

    1、data属性可以是map吗?

    数据属性可以是 supported data types in DynamoDB 中的任何一个,包括 map 。

    2. 数据属性是否必须在写入时写入两个位置?

    数据属性应该只写入一个地方。对于生日的示例,您可以执行以下任一 DynamoDB 条目:

    node_a    | node_b    | data
    ----------|-----------|---------------
    user-1    | user-1    | {"birthdate":"2000-01-01", "firstname": "Bob", ...}
    user-1    | birthdate | 2000-01-01
    

    在第一行,我们从 user-1 创建了一条边。循环返回自身的节点。在第二行,我们从 user-1 创建了一条边。至birthdate .无论哪种方式都可以,最佳选择取决于您将如何访问数据。如果您需要能够找到生日在给定范围内的用户,那么您应该创建一个 birthdate节点。如果您只需要从用户 ID 中查找用户的信息,那么您可以使用任一策略,但第一行通常会更有效地使用表的吞吐量。

    3.如果我想添加一个1980-12-19出生的新人,我必须先查找相应的节点吗?

    不,只需插入上面示例中的行之一。

    如果存在更复杂的访问模式,例如“更新出生于 1980 年 12 月 19 日的人的姓名”,则只需查找该节点。在这种情况下,您需要按生日查找以获取人员节点,然后修改与人员节点相关的内容。但是,该用例实际上是两种不同的操作。您可以将那句话改写为“查找出生于 1980-12-19 的人,并更新姓名”,这使得这两个操作更加明显。

    4.(a) 如何获取与节点关联的所有属性?

    假设您想找到“myNode”的所有边。您将使用 key condition expression 查询主表的 node_a="myNode"并使用 node_b="myNode" 的关键条件表达式查询反向查找 GSI .这相当于 SELECT * FROM my_table WHERE node_a="myNode" OR node_b="myNode" .

    4.(b) 如何获取与边相关的所有属性?

    边的所有属性都直接存储在边的属性中,但您仍然可能会遇到不知道数据确切位置的情况。例如:
    node_a    | node_b    | data
    ----------|-----------|---------------
    thing-1   | thing-2   | Is the data here?
    thing-2   | thing-1   | Or here?
    

    如果您知道边缘节点的顺序(即哪个节点是 node_anode_b ),那么您只需要一个 GetItem 操作来检索数据。如果不知道节点的顺序,可以使用 BatchGetItems 查找表中的两行(除非您正在做一些涉及有向图的特别复杂的事情,否则应该只存在其中一行)。

    5、如何查询相邻节点?

    相邻节点只是两个节点,它们有一条边连接它们。您将使用与 4a 相同的查询,只是对 data 不感兴趣。属性,您对其他节点的 ID 感兴趣。

    更多示例
  • Using a graph pattern to model a simple social network
  • Using a graph pattern to model user-owned resources
  • How to model a circular relationship between actors and films in DynamoDB (answer uses a graph pattern)
  • Modeling many-to-many relationships in DynamoDB
  • From relational DB to single DynamoDB table: a step-by-step exploration .这是一个杀手锏。它嵌入了一个 AWS re:Invent 演讲,这篇博文的作者在上面添加了他自己的进一步解释。
  • 关于amazon-web-services - DynamoDB 物化图模式示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51055657/

    相关文章:

    python - 带有悬停事件的网络图表

    数据库设计一对多,其中多至少是一

    php - 根据查询类型和表将流量路由到特定的 MySQL 连接

    java - 用于存储图像的 AWS S3 和 Cloudfront

    javascript - 如何使用:not selector in Cytoscape. js? (选择没有属性的节点)

    javascript - 点击echart条形图时如何突出显示条形?

    mysql - 数据库架构,1 个表或 2 个表

    postgresql - 允许您在 SELECT 语句中引用别名列的 PostgreSQL 函数叫什么?

    amazon-web-services - 创建新策略以在 AWS 资源中强制执行标记是否会影响已创建的资源

    amazon-web-services - 如何在 EC2 上设置 ElasticSearch 节点以便它们具有一致的 DNS 条目?