【问题标题】:Modeling Relational Data in DynamoDB (nested relationship)在 DynamoDB 中建模关系数据(嵌套关系)
【发布时间】:2019-04-17 16:25:40
【问题描述】:

实体模型:

我已阅读有关创建 Modeling Relational Data in DynamoDB 的 AWS 指南。我的访问模式太混乱了。

访问模式

+-------------------------------------------+------------+------------+
| Access Pattern                            | Params     | Conditions |
+-------------------------------------------+------------+------------+
| Get TEST SUITE detail and check that      |TestSuiteID |            |
| USER_ID belongs to project has test suite |   &UserId  |            |
+-------------------------------------------+------------+------------+
| Get TEST CASE detail and check that       | TestCaseID |            |
| USER_ID belongs to project has test case  |   &UserId  |            |
+-------------------------------------------+------------+------------+
| Remove PROJECT ID, all TEST SUITE         | ProjectID  |            |
| AND TEST CASE also removed                |   &UserId  |            |
+-------------------------------------------+------------+------------+

因此,我将关系实体数据建模为指导。

+-------------------------+---------------------------------+
|       Primary Key       |            Attributes           |
+-------------------------+                                 +
|     PK     |     SK     |                                 |
+------------+------------+---------------------------------+
|   user_1   |    USER    |    FullName    |                |
+            +            +----------------+----------------+
|            |            | John Doe       |                |
+            +------------+----------------+----------------+
|            |   prj_01   |   JoinedDate   |                |
+            +            +----------------+----------------+
|            |            | 2019-04-22     |                |
+            +------------+----------------+----------------+
|            |   prj_02   |   JoinedDate   |                |
+            +            +----------------+----------------+
|            |            | 2019-05-26     |                |
+------------+------------+----------------+----------------+
|   user_2   |    USER    |    FullName    |                |
+            +            +----------------+----------------+
|            |            | Harry Potter   |                |
+            +------------+----------------+----------------+
|            | prj_01     |   JoinedDate   |                |
+            +            +----------------+----------------+
|            |            | 2019-04-25     |                |
+------------+------------+----------------+----------------+
| prj_01     | PROJECT    |      Name      |   Description  |
+            +            +----------------+----------------+
|            |            | Facebook Test  | Do some stuffs |
+            +------------+----------------+----------------+
|            | t_suite_01 |                |                |
+            +            +----------------+----------------+
|            |            |                |                |
+------------+------------+----------------+----------------+
| prj_02     | PROJECT    |      Name      |   Description  |
+            +            +----------------+----------------+
|            |            | Instagram Test | ...            |
+------------+------------+----------------+----------------+
| t_suite_01 | TEST_SUITE |      Name      |                |
+            +            +----------------+----------------+
|            |            | Test Suite 1   |                |
+            +------------+----------------+----------------+
|            | t_case_1   |                |                |
+            +            +----------------+----------------+
|            |            |                |                |
+------------+------------+----------------+----------------+
| t_case_1   | TEST_CASE  |      Name      |                |
+            +            +----------------+----------------+
|            |            | Test Case 1    |                |
+------------+------------+----------------+----------------+

如果我只有 UserID 和 TestCaseId 作为参数,我如何获取 TestCase Detail 并验证 UserId 是否具有权限。

我曾考虑将复杂的分层数据存储在单个项目中。像这样的东西

+------------+-------------------------+
| t_suite_01 | user_1#prj_1            |
+------------+-------------------------+
| t_suite_02 | user_1#prj_2            |
+------------+-------------------------+
| t_case_01  | user_1#prj_1#t_suite_01 |
+------------+-------------------------+
| t_case_02  | user_2#prj_1#t_suite_01 |
+------------+-------------------------+

问题:这种情况下最好的方法是什么?如果您能给我一些关于这种方法的建议,我将不胜感激(鞠躬)

【问题讨论】:

    标签: amazon-dynamodb hierarchical-data dynamodb-queries amazon-dynamodb-index amazon-dynamodb-data-modeling


    【解决方案1】:

    我认为下面的架构可以满足您的需求。在“GSIPK”属性上创建一个Partition Key only GSI,查询如下:

    1. 获取测试套件详细信息并验证用户:查询 GSI - PK == ProjectId、FilterCondition [SK == TestSuiteId || PK == 用户 ID]

    2. 获取测试用例详细信息并验证用户:查询 GSI - PK == TestCaseId, FilterCondition [SK = TestSuiteId:TestCaseId || PK = 用户 ID]

    3. 移除项目:查询 GSI - PK == ProjectId,移除所有返回的项目。

    查询 1 和 2 返回 1 或 2 个项目。一个是详细项,另一个是测试套件或测试用例的用户权限。如果只有一项返回,则它是详细信息项,用户无权访问。

    【讨论】:

    • 感谢@Rick Houlihan。这就是我在等待的。我不知道我们可以在 GSI 表中使用 PK 和 SK 进行过滤。这真的很有帮助。顺便说一句,你救了我的工作?
    • 顺便说一句,如果我想创建一个像你创建的表,我可以在哪里找到它。谢谢你。
    • 我用来生成这些视图的建模器可以在这里找到:rh-web-bucket.s3-website-us-east-1.amazonaws.com 它缺乏一些流控制和错误处理,当它没有得到正确的输入时往往会静默失败,但它很有用工具。您可以从 JSON 文件、DynamoDB 表、MySQL 和 MS-SQL 加载数据。要加载 JSON 以外的任何内容,请使用 jar 并按照页面上的说明进行操作。这是一个下载我用于上述表格的 JSON 文件的链接:s3-us-west-2.amazonaws.com/rh-public/Users.json
    • 太棒了。我想知道为什么 AWS 不为用户推出这样的东西
    • 我这里复制json文件,防止文件被删除
    【解决方案2】:

    您应该问的第一个问题是:当我的数据中明显有强关系时,为什么要使用键值文档数据库而不是关系数据库?

    答案可能是:我需要任何规模(数百万条记录)的个位数毫秒查询。或者,我想按需使用 dynamodb 来省钱。如果不是这种情况,那么使用关系数据库可能会更好。

    假设您必须选择 dynamodb。如果是这样,当涉及到 NoSQL 时,大多数适用于关系数据库的模式都是反模式。上次 re-invent 有一个关于 dynamodb 设计模式的有用演讲,并建议观看它https://youtu.be/HaEPXoXVf2k

    对于您的数据,我会考虑采用类似的方法,并有两个表:用户和项目。

    项目应将测试套件的子集存储为对象数组的映射,并将测试用例存储为对象数组的映射。另外,您可以在字符串映射中添加用户 ID 列表。当然,当用户加入或离开项目时,您需要维护此列表。

    这应该满足您的访问模式。

    【讨论】:

    • 谢谢亚历克斯。在 StackOverFlow 上制作这张票之前,我已经多次观看 re:invent 2018。首先,他们的建议是一个应用程序服务 = 一个表。其次,为了解释清楚,我做了用户记录,我的应用程序的用户表是 AWS Cognito。他们的例子在我的例子中似乎不清楚,他们建议存储一对分区键 - 排序键,而不是子集。
    • 嗨龙,我明白了。这确实不是那么直截了当。
    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多