我是DynamoDB的新手,我正努力设计一个好的分区键。 我读到一个好的DynamoDB使用分区键具有几乎不同的值。 不过,我一直想知道,如果我始终能够将排序键用作唯一标识符(eq not startswith),是否可以使用仅约10个(不同)值的DynamoDB作为分区键。我会遇到这种方法的问题吗?
我的问题如下:
1。 假设我要可视化少数房屋中的房间。每个房间都有物联网设备,应该在一种“房间地图”中看到它。 可视化已完成,目前以json格式存储在本地。我想将此配置存储在DynamoDB中。我的分区键是房屋,分类键是带有roomMap_的前缀,后跟房间名称(分区键为课程)
| partition key | sort key | room map json |
|---------------|---------------------|---------------|
| House1 | roomMap_livingRoom1 | {...} |
| House1 | roomMap_livingRoom2 | {...} |
| House1 | roomMap_kitchen | {...} |
| House2 | roomMap_livingRoom1 | {...} |
2。 现在,我还想在DynamoDB中为物联网设备存储仪表板。 设备编号对于房屋而言是唯一的(根据设计),但在其他房屋中可以相同。例如。一个设备“ fridgeSensor”可能存在于多于一间房屋中。仪表板配置也存储为json。
| partition key | dashboard config json |
|----------------------------|-----------------------|
| House1::fridgeSensor | {...} |
| House1::temperatureSensor1 | {...} |
| House2::fridgeSensor | {...} |
当我读到一个好的DynamoDB设计仅使用一张表时,我想到了以下表格,通过使用第一个表设计的PartitionKey并调整了排序键:
| partition key | sort key | room map json | dashboard config json |
|---------------|---------------------|---------------|-----------------------|
| House1 | roomMap_livingRoom1 | {...} | null
| House1 | roomMap_livingRoom2 | {...} | null
| House1 | roomMap_kitchen | {...} | null
| House2 | roomMap_livingRoom1 | {...} | null
| House1 | device_fridgeSensor | null | {...}
| House2 | device_fridgeSensor | null | {...}
现在,我经常会读取相同的分区键。 这是一个不好的设计吗? 如果可以,我该如何做得更好?
答案 0 :(得分:2)
出于几个原因,您希望分区键具有许多不同的值。
例如,每个分区键都限于一个存储分区(因此称为名称),最大大小为10 GB。这意味着,如果某个键具有很多排序键(例如,导致其需要超过10 GB的存储空间),则会遇到麻烦。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html
此外,如果您只有几个分区键,并且其中一个很受欢迎,因此被称为很多分区键,那么您就有一个“热”分区。并且由于您的读/写容量在所有分区上平均分配,因此您要么付出太多(如果您将R / W设置得足够高,给热分区提供足够的R / W,而其他分区给了太多),或者您将付出受到限制。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html
请注意,AWS在诸如re:Invent 2018之类的几种情况下表示,它们会自动 try 来补偿热分区,而不会给客户带来任何额外费用。但是不要指望太多。
但是,在您的情况下,除非一所房子要拥有成千上万的设备/房间,或者一栋或几所房子的数据非常受欢迎,否则我真的不会看到问题。
要注意的一件事是json文件的大小(房间地图,仪表板配置)。如果这些文件太大,则AWS内的常规方法是将它们存储在S3中,然后在DynamoDB中添加它们的位置/ ID。在这种情况下,如果需要这些文件,则获取ID并转到S3进行查找。