希望这能回答您的所有问题。这里有一些介绍性的东西。我将为所有示例使用通用表。哈希键是node_a,排序键是node_b。有一个反向查找 GSI,其中 node_b 是哈希键,node_a 是排序键。
1.数据属性可以是地图吗?
数据属性可以是任何supported data types in DynamoDB,包括地图。
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”的所有边。您将使用node_a="myNode" 的key condition expression 查询主表,并使用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_a 和node_b),那么您只需要一个GetItem 操作来检索数据。如果您不知道节点的顺序,那么您可以使用BatchGetItems 来查找表中的两行(除非您正在做一些涉及有向图的特别复杂的事情,否则应该只存在其中一行)。
5.如何查询相邻节点?
相邻节点只是有一条边连接它们的两个节点。您将使用与 4a 相同的查询,只是您对其他节点的 ID 感兴趣,而不是对 data 属性感兴趣。
更多示例