首页 文章

如何在DynamoDB中处理多对多

提问于
浏览
3

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

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

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

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

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

3 回答

  • 1

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

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

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

    • 对客户ID执行GetItem . 或者根据您对客户的看法使用查询 .

    • 对于客户硬件属性中的每个硬件ID,请在硬件表上执行GetItem .

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

  • 6

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

    在您的情况下,基于邻接列表设计模式,您的模式可以设计如下
    分区键和排序键的前缀表示记录的类型 .
    如果记录类型是customer,则分区键和排序键都应具有前缀'customer-' .
    如果记录是客户租用硬件,则分区键's prefix should be ' customer- ' and the sort key'的前缀应为'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只是伪代码,只为你提供一个想法 .

  • 3

    如果DynamoDB's Adjacency List Design Pattern doc不够清晰(不适合我),请查看this answer .

相关问题