我正在使用Java使用DynamoDB。我有两张桌子,Table1和Table2说。
Table1具有如下属性的项:<attr1、attr2、attr3>
Table2具有如下属性的项:<attr3、attr4、attr5>
在上面的2行中,粗体的属性是分区键,斜体的属性是范围键。
我的API获得attr1作为输入,使用它我必须从Table1访问一个项,然后从返回的项中使用attr3,我必须从Table2访问一个项(我有attr3 4E 221值)。
我希望这两个步骤作为一个事务来完成。
在DynamoDB中可以执行这种类型的事务吗?
TransactionLoad,看起来很有希望,但是我找不到一种方法来指定我想要从Table1中获得特定的项,使用attr1值,然后使用获得的attr3值,从Table2获取项目。
发布于 2021-05-31 08:52:12
首先,我想指出,DynamoDB (或任何非SQL)不适合于那种操作和多个表:基于NoSQL的DynamoDB设计
关于您的问题,DynamoDB的事务性读取能力是TransactGetItems,在这里您可以从多个表读取,但是不可能创建一个读取一个表的事务,如果结果读取另一个表,实际上,根据定义,这是两个事务。
发布于 2021-06-01 19:43:05
为了扩展可接受的答案,您似乎正在尝试使用NoSQL数据库实现联接。
SQL和NoSQL解决方案之间定义的区别之一是数据的规范化。在SQL中,我们经常对数据进行规范化,并使用SQL将数据组合到应用程序需要的结构中。这在规模上可能会出现问题,因为执行复杂联接(或其他无限制的SQL查询)会使在规模上难以预测性能。
另一方面,NoSQL数据库通常对数据进行去denormalize,以满足我们应用程序的特定需求。这种方法消除了跨表连接数据的需要,并提高了性能。
您在问题中描述的方法是这两种方法的混合。您正在使用NoSQL以规范化的方式存储数据,并在应用程序代码中模拟连接(因为DDB没有给出联接)。虽然这种方法在某些情况下可能是有意义的,但它表明您可能不是在为NoSQL数据库优化数据建模。
实现目标的"NoSQL“方法是将数据存储在同一个分区(在同一个表中)中的Table1和Table2中。
https://stackoverflow.com/questions/67768048
复制相似问题