Dav*_*Eyk 11 database-design dynamodb index-design
DyanmoDB最佳实践明确指出:
您应该在 DynamoDB 应用程序中维护尽可能少的表。大多数设计良好的应用程序只需要一张表。
我觉得很有趣,我见过的处理 DyanmoDB 的几乎每个教程都有多表设计。
但这在实践中意味着什么?
让我们考虑一个具有三个主要实体的简单应用程序:用户、项目和文档。一个用户拥有多个项目,一个项目可以有多个文档。我们通常必须查询用户的项目和项目的文档。读取数量大大超过写入数量。
一个天真的教程的表格设计将使用三个表格:
Users
Hash key
user-id
Projects
Hash key Global Index
project-id user-id
Documents
Hash key Global Index
document-id project-id
Run Code Online (Sandbox Code Playgroud)
我们可以很容易崩溃Project
,并Document
为一个Documents
表:
Documents
Hash key Sort key Global Index
project-id document-id user-id
Run Code Online (Sandbox Code Playgroud)
但为什么要停在那里?为什么不用一张桌子来统治他们呢?既然User
是一切的根源...
Users
Hash key Sort key
user-id aspect
--------- ---------
foo user email: foo@bar.com ...
foo project:1 title: "The Foo Project"
foo project:1:document:2 document-id: 2 ...
Run Code Online (Sandbox Code Playgroud)
然后我们将有一个全局索引,例如,email
用于用户记录查找的document-id
字段,以及另一个用于直接文档查找的字段。
这是它应该如何工作?将如此大相径庭的数据放入同一张表是否合法?还是第二种,双表设计是更好的方法?
在什么时候添加第二个表是正确的?
小智 7
是的,按照你说的去做是合法的。两者实际上都是。有一些变量在这里没有,它们可以帮助指导数据模型应该如何完成。
例如,如果所有读取的 80% 是为了找到项目中的用户,并且需要以 30,000/秒的速度发生,但在您的应用程序中,没有多少人会更进一步并找出项目的文档,那么它是总读取数的 20%,可能只有 2000 次读取/秒。第一个是应用程序的“热路径”,应该对其进行优化。
也可以这样想,对于像 DynamoDB 这样的非关系型数据库,您可以针对应用程序使用和访问数据的方式进行优化,而不是像关系型数据库那样,您必须非常担心它是如何存储在数据库中的。
归档时间: |
|
查看次数: |
7214 次 |
最近记录: |