如何在DynamoDB中处理多对多

Déb*_*ora 5 nosql amazon-dynamodb

我是NoSql和DynamoDb的新手,但是来自RDBMS ..我的表正从MySql移动到DynamoDb.我有表:
customer(列:cid [PK],名称,联系人)
硬件(列:hid [PK],名称,类型)
租(列:rid [PK],cid,hid,time).=>这是客户与硬件项的关联.

一个客户可以拥有许多硬件项,一个硬件项可以在许多客户之间共享.

要求:单独的客户列表和hadware项目应该能够检索.
租赁细节 - 哪个客户借用哪个Hardeware Item.

我提到了这个 - 二级索引表.这是关于将所有列保留在一个表中.
我想有2个DynamoDb表:
Customer - 它具有类似于列和一组硬件项哈希键的所有属性.(然后我的问题是,当查询客户表以仅检索客户时,也会加载所有硬件密钥.)

请问表格结构的任何指导?如何保存,加载甚至更新?
请问任何java样本?(找不到任何类似于我的场景的有用资源)

Yu *_*ang 11

查看DynamoDB的邻接列表设计模式 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html

在您的情况下,基于邻接列表设计模式,您的模式可以设计如下
:分区键和排序键的前缀表示记录的类型.
如果记录类型是customer,则分区键和排序键都应具有前缀"customer-".
如果记录是客户租用硬件,则分区密钥的前缀应为"customer-",排序密钥的前缀应为"hardware-"

base table
+------------+------------+-------------+
|PK          |SK          |Attributes   |
|------------|------------|-------------|
|customer-cid|customer-cid|name, contact|
|hardware-hid|hardware-hid|name, type   |
|customer-cid|hardware-hid|time         |
+------------+------------+-------------+

Global Secondary Index Table

+------------+------------+----------+
|GSI-1-PK    |GSI-1-SK    |Attributes|
|------------|------------|----------|
|hardware-hid|customer-cid|time      |
+------------+------------+----------+
Run Code Online (Sandbox Code Playgroud)

客户和硬件应存储在同一个表中.客户可以参考硬件,
SELECT * FROM base_table WHERE PK=customer-123 AND SK.startsWith('hardware-')
如果你的硬件想要回顾客户,你应该使用GSI表
SELECT * FROM GSI_table WHERE PK=hardware-333 AND SK.startsWith('customer-')

注意:我写的SQL只是伪代码,只为你提供一个想法.

  • 主要原因是DynamoDB本机不支持外键。为了获得更好的性能,DynamoDB应该收到的请求尽可能少。因此,要处理多对多关系,DynamoDB无法充当设置多个表和外键的关系数据库。最佳实践是使用一个表来处理所有这些关系,并通过一个请求完成它。PK和SK中的前缀用于模拟RDBMS的表和外键。如果PK和SK相同,则它们与RDBMS的表匹配,如果它们不同,则它们与RDBMS的外键匹配。 (2认同)

F_S*_*O_K 5

看看这个答案,因为它涵盖了许多与您相关的基础知识。

DynamoDB 本身不支持外键。每个表都是独立的,没有特殊的工具来保持两个表同步。

您的客户表中可能有一个名为硬件的属性。该属性是客户拥有的硬件 ID 列表。如果您想查看属于客户的所有硬件项目,您将:

  1. 对客户 ID 执行 GetItem。或者根据您查找客户的方式使用查询。
  2. 对于客户硬件属性中的每个硬件 ID,对硬件表执行 GetItem。

使用 DynamoDB,您通常最终会在客户端应用程序中执行比 RDBMS 解决方案更多的操作。优点是快速且简单。但您会发现您可能将大量工作从数据库服务器转移到客户端服务器。