如何在DynamoDB中处理多对多

时间:2018-01-31 08:02:09

标签: nosql amazon-dynamodb

我是NoSql和DynamoDb的新手,但是来自RDBMS .. 我的表正从MySql移动到DynamoDb。我有桌子:
客户(栏目:cid [PK],姓名,联系方式)
硬件(栏目:hid [PK],名称,类型)
租(列:摆脱[PK],cid,隐藏,时间)。 =>这是客户和硬件项目的关联。

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

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

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

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

3 个答案:

答案 0 :(得分:7)

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

在您的情况下,基于邻接列表设计模式,您的架构可以如下设计
分区键和排序键的前缀指示记录的类型。
如果记录类型是客户,则分区键和排序键都应带有前缀“客户-”。
如果记录是客户租用了硬件,则分区键的前缀应为“ 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      |
+------------+------------+----------+

客户和硬件应存储在同一表中。客户可以使用
来参考硬件 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只是伪代码,仅供您参考。

答案 1 :(得分:3)

请查看this answer,因为它涵盖了许多与您相关的基础知识。

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

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

  1. 对客户ID执行GetItem。或者根据您对客户的看法使用查询。
  2. 对于客户硬件属性中的每个硬件ID,请在硬件表上执行GetItem。
  3. 使用DynamoDB,您通常最终会在客户端应用程序中相对于RDBMS解决方案执行更多操作。它的优点是快速而简单。但是你会发现你可能会将大部分工作从数据库服务器转移到客户端服务器上。

答案 2 :(得分:1)

如果DynamoDB's Adjacency List Design Pattern doc对您来说不够清晰(不是我的意思),请查看this answer