我正在参与一个项目,其中使用DynamoDB作为大部分持久数据的存储。我现在正试图对数据结构进行建模,使其更像传统SQL数据库中的建模方式,但我也希望探讨好的NoSQL设计方案,以适应这种类型的数据。
例如,考虑一种简单的N到N关系,比如将物品分组到类别中。在SQL中,可能会使用连接表来建模,例如:
要列出一个类别中的所有项目,可以执行如下连接操作:
在一般情况下,以及在像DynamoDB这样的NoSQL数据库中,是否有希望以相当高效的方式(不需要很多(
还是应该选择RDS?
我考虑过以下几点:
1. 将类别作为项目内的数组。这使得查找项目的类别变得容易,但无法解决获取类别内所有项目的问题。而且我需要在每个项目中复制所需的属性,例如类别名称等。更新类别会很麻烦。
2. 为每个类别重复每个项目,并使用
3. 使用连接表将项目与类别相互映射。使用
我的困境是数据本身的格式非常适合文档数据库,而我需要的关系适合SQL数据库。如果可能的话,我想继续使用DynamoDB,但显然不是任何代价...
例如,考虑一种简单的N到N关系,比如将物品分组到类别中。在SQL中,可能会使用连接表来建模,例如:
items
-----
item_id (PK)
name
categories
----------
category_id (PK)
name
item_categories
---------------
item_id (PK)
category_id (PK)
要列出一个类别中的所有项目,可以执行如下连接操作:
SELECT items.name from items
JOIN item_categories ON items.item_id = item_categories.item_id
WHERE item_categories.category_id = ?
要列出一个项目所属的所有类别,可以进行相应的查询:
SELECT categories.name from categories
JOIN item_categories ON categories.category_id = item_categories.category_id
WHERE item_categories.item_id = ?
在一般情况下,以及在像DynamoDB这样的NoSQL数据库中,是否有希望以相当高效的方式(不需要很多(
N
,甚至?)单独操作)对这样的关系进行建模,特别是针对像上面那样的简单用例 - 当没有等价于JOIN
时?还是应该选择RDS?
我考虑过以下几点:
1. 将类别作为项目内的数组。这使得查找项目的类别变得容易,但无法解决获取类别内所有项目的问题。而且我需要在每个项目中复制所需的属性,例如类别名称等。更新类别会很麻烦。
2. 为每个类别重复每个项目,并使用
category_id
作为范围键,并添加一个反向的GSI(category_id
作为哈希,item_id
作为范围)。虽然去规范化对于NoSQL来说很常见,但我仍然有些疑虑。可能将项目分成items
和item_details
,只复制列表等中需要的最常见的属性。3. 使用连接表将项目与类别相互映射。使用
[item_id, category_id]
作为键,[category_id, item_id]
作为GSI,以支持两个查询。在这里复制最常见的属性(名称等)。要获取类别的所有完整项目,仍需要执行一个query
,然后进行N个get
操作,这会消耗大量CU。更新项目或类别名称将需要多个update
操作,但并不太困难。我的困境是数据本身的格式非常适合文档数据库,而我需要的关系适合SQL数据库。如果可能的话,我想继续使用DynamoDB,但显然不是任何代价...