当前位置: 首页 > 知识库问答 >
问题:

Dynamodb中的3个字段复合主键(唯一项)

宗弘扬
2023-03-14

我试图创建一个表来存储DynamoDB中的发票行项目。假设该项由CompanyCodeInvoiceNumberLineItemID、amount和其他行项详细信息定义。

唯一项由前3个属性的组合定义。对于不同的项目,这些属性中的任何2个都可以是相同的。我应该选择什么作为哈希属性和范围属性?

共有1个答案

袁元明
2023-03-14

为了效率,我会提出完全不同的设计。对于NoSQL数据库(DynamoDB也没有什么不同),我们总是需要首先考虑访问模式。此外,如果可能的话,我们应该努力将所有的数据放在同一个表和几个索引中。从我们从OP和他的评论中获得的信息来看,这是两种访问模式:

  1. 对于公司X,获取完整的发票Y(包括所有项目或项目范围)[基于此注释]
  2. 获取X公司的所有发票[基于此注释]

我们现在想知道什么是好的主键?转化为问题,什么是好的分区键(PK),什么是好的排序键(SK),我们需要创建哪些辅助索引,以及哪些类型(局部或全局)?一些提醒:

    null
  • 公司与发票之间的关系总是1:多。
  • 发票与项目之间的关系始终为1:many。
  • 其中PK为CompanyCode和SK为InvoiceNumber可以存储该公司发票的所有属性。
  • 没有什么可以阻止我添加SK为customer的记录,这允许我存储关于公司的所有属性。
  • 使用GSI1,我们将创建反向查找,其中GSI1PK是我的表SK(InvoiceNumber),而my GSI1SK是我的表PK(CompanyCode)。
  • 我使用同一表存储行项,其中PK为LineItemID,SK为CompanyCode(仍然唯一)
  • 对于项目实体项目,我的GSI1PK仍然是InvoiceNumber,我的GSI1SK是LineItemID,这是表PK,因此与发票实体项目相同。

现在支持的访问模式如下:

    null
 类似资料:
  • 根据此链接: DynamoDB上支持的操作 “只能查询具有复合主键(分区键和排序键)的表。” 但这似乎并不正确。我在DynamoDB中有一个名为“users”的表,该表的主键只包含一个属性“username”。 而且我能够在NodeJS中仅使用“username”属性上的“KeyConditionExpression”查询该表。请参见以下内容: } 这段代码运行得很好。所以我想知道文档是否有误,或

  • 本文向大家介绍主键与唯一键,包括了主键与唯一键的使用技巧和注意事项,需要的朋友参考一下 首要的关键 主键是一列,用于唯一地标识表的每个元组。 它用于向表添加完整性约束。一个表中只能使用一个主键。在主键的情况下,重复和NULL(空)值无效。主键也可以用作其他表的外键。 让我们举个例子 我们有一个表名employee,用于存储公司员工的数据。下表显示了该表的内容。 Emp_id 名称 号码 位置 薪水

  • EmbeddedId或IdClass注释用于表示复合主键。如何在没有(EmbeddedId或IdClass)的情况下使用复合主键? 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么如何使用EntityManager.find(Entity Class,Object primaryKey)方法在复合主键(Multiple primaryKey)的情况下查找实体(因为没

  • 问题内容: 创建一个名为“ sqlite_autoindex_mytable_1”的索引。我在“ SQlite Expert”中看到了它。在“要索引的字段”框中,它同时显示col1和col2。 在这篇文章中:https : //dba.stackexchange.com/a/14260 它说如果我想在没有col1的JOIN查询中使用col2,则必须为col2创建单独的索引。 因此,我需要添加: 如

  • 问题内容: 我有一个具有复合主键的旧式数据库表。我认为我无法更改结构以包含代理键,因为编写了一些使用该表的代码。在django中,我无法使用该表,因为它没有主键(非复合键)。 Django模型是否支持复合主键?如果不是,是否有任何解决方法而不更改表的结构? PS我正在使用PostgreSQL。 问题答案: 试试下面类似的代码: 或者,如果你只想要唯一的混合字段: 编辑:我想指出,如果有3列,则此方