【问题标题】:Modeling N-to-N with DynamoDB使用 DynamoDB 建模 N 对 N
【发布时间】:2018-01-03 18:36:39
【问题描述】:

我正在使用 DynamoDB 处理大多数持久数据的项目。我现在正在尝试对一个更类似于在传统 SQL 数据库中建模的数据结构进行建模,但我想探索为此类数据也进行良好 NoSQL 设计的可能性。 例如,考虑一个简单的 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 = ?

有没有希望以一种相当有效的方式(不需要大量(N,甚至?)单独的操作)为一个简单的 NoSQL 数据库,特别是 DynamoDB 建模这样的关系?像上面那样的用例 - 当没有 JOINs 的等价物时?

或者我应该直接选择 RDS 吗?

我考虑过的事情:

  1. 内联类别作为项目内的数组。这使得查找项目的类别变得容易,但不能解决获取类别中的所有项目的问题。而且我需要在每个项目中复制所需的属性,例如类别名称等。类别更新会很尴尬。

  2. 为每个类别复制每个项目并使用category_id 作为范围键,并添加一个反向的 GSI(category_id 作为哈希,item_id 作为范围)。反规范化在 NoSQL 中很常见,但我仍然有疑问。可能将项目拆分为 itemsitem_details,并且只复制列表等中所需的最常见属性。

  3. 查找将项目映射到类别的连接表,反之亦然。使用[item_id, category_id] 作为键,[category_id, item_id] 作为 GSI,以支持这两种查询。在此处复制最常见的属性(名称等)。要获得一个类别的所有完整项目,我仍然需要执行一个query,然后执行 N 个get 操作,这会消耗大量 CU:s。更新项目或类别名称需要多次update 操作,但不会太难。

我的困境是数据本身的格式完全适合文档数据库,而我需要的关系适合 SQL 数据库。如果可能的话,我想继续使用 DynamoDB,但显然不会不惜一切代价......

【问题讨论】:

    标签: sql nosql amazon-dynamodb


    【解决方案1】:

    你已经在寻找正确的方向了!

    为了做出明智的决定,您还需要考虑数据的基数:

    您是否期望只有几个(少于十个?)类别?或相当多(即数百、数千、数万等)

    每个类别的项目怎么样:您希望有很多类别,每个类别中有几个项目,还是几个类别中有很多项目?

    然后,您需要考虑总数据集的基数和各类查询的频率。您是否经常只需要检索单个类别中的项目?或者您是否会主要查询以单独检索项目,而您只需要保持每个类别的项目数量等。

    最后,考虑您的数据集随时间的预期增长。只要您的查询分区良好,DynamoDB 通常会在规模上胜过 RDBMS。

    还要考虑您希望执行的每种查询类型的可接受延迟,尤其是在大规模时。例如,如果您希望有数百个类别,每个类别有数十万个项目,那么检索一个类别中的所有项目意味着什么?当然,您不会一次将它们全部显示给用户。

    如果您需要数据统计信息,我鼓励您也考虑使用另一种类型的数据存储来配合 DynamoDB,例如 ElasticSearch 或 Redis 集群。

    最后,如果聚合查询或连接对您的用例至关重要,或者如果大规模数据集通常可以在单个 RDBMS 实例上轻松处理,请不要尝试在圆孔中安装方形钉。像 Aurora 这样的托管 RDBMS 解决方案可能更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2011-08-19
      • 2011-11-05
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      相关资源
      最近更新 更多