在 DynamoDB 中建模关系数据(嵌套关系)
Modeling Relational Data in DynamoDB (nested relationship)
-
hierarchical-data
-
amazon-dynamodb
-
dynamodb-queries
-
amazon-dynamodb-index
-
amazon-dynamodb-data-modeling
实体模型:
我已阅读有关创建 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 |
+------------+-------------------------+
问题:这种情况下最好的方法是什么?如果你能给我一些关于这种方法的建议,我将不胜感激(鞠躬)
您应该问的第一个问题是:当我的数据中显然有很强的关系时,为什么我要使用键值文档数据库而不是关系数据库?
答案可能是:我需要任何规模(数百万条记录)的个位数毫秒查询。或者,我想按需使用 dynamodb 来省钱。如果不是这种情况,那么使用关系数据库可能会更好。
假设您必须使用 dynamodb。如果是这样,那么当涉及到 NoSQL 时,大多数适用于关系数据库的模式都是反模式。上次 re-invent 中有一个关于 dynamodb 设计模式的有用演讲和观看它的建议 https://youtu.be/HaEPXoXVf2k。
对于您的数据,我会考虑采用类似的方法,并有两个表:用户和项目。
项目应将测试套件的子集存储为对象数组的映射,将测试用例存储为对象数组的映射。另外,您可以在字符串映射中添加用户 ID 列表。当然,当用户加入或离开 project/s 时,您将需要维护此列表。
这应该能满足您的访问模式。
我认为下面的架构可以满足您的需求。在 "GSIPK" 属性上创建仅分区键 GSI,并按如下方式查询:
获取测试套件详细信息并验证用户:查询 GSI - PK == ProjectId、FilterCondition [SK == TestSuiteId || PK == UserId]
获取测试用例详细信息并验证用户:查询 GSI - PK == TestCaseId、FilterCondition [SK = TestSuiteId:TestCaseId || PK = UserId]
删除项目:查询 GSI - PK == ProjectId,删除所有返回的项目。
查询 1 和 2 返回 1 或 2 个项目。一个是详细信息项,另一个是测试套件或测试用例的用户权限。如果只有一项 returns 则它是详细信息项,用户无权访问。
hierarchical-data
amazon-dynamodb
dynamodb-queries
amazon-dynamodb-index
amazon-dynamodb-data-modeling
实体模型:
我已阅读有关创建 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 |
+------------+-------------------------+
问题:这种情况下最好的方法是什么?如果你能给我一些关于这种方法的建议,我将不胜感激(鞠躬)
您应该问的第一个问题是:当我的数据中显然有很强的关系时,为什么我要使用键值文档数据库而不是关系数据库?
答案可能是:我需要任何规模(数百万条记录)的个位数毫秒查询。或者,我想按需使用 dynamodb 来省钱。如果不是这种情况,那么使用关系数据库可能会更好。
假设您必须使用 dynamodb。如果是这样,那么当涉及到 NoSQL 时,大多数适用于关系数据库的模式都是反模式。上次 re-invent 中有一个关于 dynamodb 设计模式的有用演讲和观看它的建议 https://youtu.be/HaEPXoXVf2k。
对于您的数据,我会考虑采用类似的方法,并有两个表:用户和项目。
项目应将测试套件的子集存储为对象数组的映射,将测试用例存储为对象数组的映射。另外,您可以在字符串映射中添加用户 ID 列表。当然,当用户加入或离开 project/s 时,您将需要维护此列表。
这应该能满足您的访问模式。
我认为下面的架构可以满足您的需求。在 "GSIPK" 属性上创建仅分区键 GSI,并按如下方式查询:
获取测试套件详细信息并验证用户:查询 GSI - PK == ProjectId、FilterCondition [SK == TestSuiteId || PK == UserId]
获取测试用例详细信息并验证用户:查询 GSI - PK == TestCaseId、FilterCondition [SK = TestSuiteId:TestCaseId || PK = UserId]
删除项目:查询 GSI - PK == ProjectId,删除所有返回的项目。
查询 1 和 2 返回 1 或 2 个项目。一个是详细信息项,另一个是测试套件或测试用例的用户权限。如果只有一项 returns 则它是详细信息项,用户无权访问。