DynamoDB 优化搜索常见 parent
DynamoDB optimized search for common parent
所以我目前正在设计三个 table,一个组织,organization_relationships,成员。
Organization
OrgID PK
Metdata..
Org_Relationships
ParentOrgID PK
ChildOrgID Range/GSI
Member
OrgID PK
MemberID Range/GSI
我需要访问数据的一种方法是确定两个成员是否共享一个 parent 组织。按照现在的方式,我基本上必须对 table 进行奇怪的搜索,这需要多次调用 table 以确定两个成员是否属于同一个 parent 组织。话虽如此,是否有一种更有效的方法来设计 table 来执行此操作,而无需多次调用 table.
您必须执行多个查询的原因是因为您已经为多个 table 之间的关系建模。这是使用传统关系数据库时的常见方法,但可以被视为 NoSQL 数据库的反模式。
请记住,DynamoDB 没有像 SQL 数据库那样的连接操作。因此,最好的做法是将相关数据存储在同一个 DynamoDB table 中。如果您习惯于使用关系数据库,这可能是违反直觉的。
有多种方法可以在 DynamoDB 中对数据进行建模。您选择的方法取决于您的访问模式。换句话说,您以一种可以更轻松地获取应用程序所需数据的方式存储数据。
例如,这是对用户和组织建模的一种方法:
主键由用户id(例如USER#)和META的排序键组成。 DynamoDB 中的这条记录(称为“项目”)是我定义各种用户属性的地方。在此示例中,我提供了一个名称和一个 org 属性。
为了便于说明,我还创建了一个全局二级索引 (GSI),用于交换您的基础 table 中的分区 key/sort 键模式。您的 GSI 将如下所示:
这样您就可以按组织获取所有用户。
如果我想检查两个用户是否在同一个组织中,我可以查询 GSI,或者获取两个用户记录并比较组织字段。
这只是一个示例,旨在为您提供 NoSQL 设计的起点。这里的要点是:
- 否SQL(或非关系)数据建模不同于SQL(关系)数据建模。
- 您想将相关数据存储在同一个 table.
- 您如何存储数据完全取决于您打算如何使用数据。
所以我目前正在设计三个 table,一个组织,organization_relationships,成员。
Organization |
---|
OrgID PK |
Metdata.. |
Org_Relationships |
---|
ParentOrgID PK |
ChildOrgID Range/GSI |
Member |
---|
OrgID PK |
MemberID Range/GSI |
我需要访问数据的一种方法是确定两个成员是否共享一个 parent 组织。按照现在的方式,我基本上必须对 table 进行奇怪的搜索,这需要多次调用 table 以确定两个成员是否属于同一个 parent 组织。话虽如此,是否有一种更有效的方法来设计 table 来执行此操作,而无需多次调用 table.
您必须执行多个查询的原因是因为您已经为多个 table 之间的关系建模。这是使用传统关系数据库时的常见方法,但可以被视为 NoSQL 数据库的反模式。
请记住,DynamoDB 没有像 SQL 数据库那样的连接操作。因此,最好的做法是将相关数据存储在同一个 DynamoDB table 中。如果您习惯于使用关系数据库,这可能是违反直觉的。
有多种方法可以在 DynamoDB 中对数据进行建模。您选择的方法取决于您的访问模式。换句话说,您以一种可以更轻松地获取应用程序所需数据的方式存储数据。
例如,这是对用户和组织建模的一种方法:
主键由用户id(例如USER#)和META的排序键组成。 DynamoDB 中的这条记录(称为“项目”)是我定义各种用户属性的地方。在此示例中,我提供了一个名称和一个 org 属性。
为了便于说明,我还创建了一个全局二级索引 (GSI),用于交换您的基础 table 中的分区 key/sort 键模式。您的 GSI 将如下所示:
这样您就可以按组织获取所有用户。
如果我想检查两个用户是否在同一个组织中,我可以查询 GSI,或者获取两个用户记录并比较组织字段。
这只是一个示例,旨在为您提供 NoSQL 设计的起点。这里的要点是:
- 否SQL(或非关系)数据建模不同于SQL(关系)数据建模。
- 您想将相关数据存储在同一个 table.
- 您如何存储数据完全取决于您打算如何使用数据。