代码之家  ›  专栏  ›  技术社区  ›  Long Nguyen

在DynamoDB(嵌套关系)中建模关系数据

  •  0
  • Long Nguyen  · 技术社区  · 7 年前

    实体模型:

    enter image description here

    Modeling Relational Data in DynamoDB . 我的访问模式太混乱了。

    访问模式

    +-------------------------------------------+------------+------------+
    | 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详细信息并验证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 |
    +------------+-------------------------+
    

    问:这个案子最好的解决方法是什么?如果你能给我一些建议,我将不胜感激(鞠躬)

    0 回复  |  直到 7 年前
        1
  •  5
  •   Rick Houlihan    7 年前

    我认为下面的模式符合您的要求。在“GSIPK”属性上只创建一个分区键GSI,并按如下所示进行查询:

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

    查询1和查询2返回1或2项。一个是细节项,另一个是测试套件或测试用例的用户权限。如果只有一个项目返回,那么它的细节项目和用户没有访问权限。

    enter image description here

    enter image description here

        2
  •  1
  •   Alex    7 年前

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

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

    假设你要去迪纳莫德。如果是这样,那么当涉及到NoSQL时,大多数适用于关系数据库的模式都是反模式。上一次重新发明的dynamodb设计模式中有一个有用的讨论,建议您关注它 https://youtu.be/HaEPXoXVf2k .

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

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

    推荐文章