Dynamo DB分区键设计:很少有不同的分区键,但始终是唯一的排序键

时间:2019-01-31 07:43:38

标签: amazon-web-services amazon-dynamodb

我是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 | {...}

现在,我经常会读取相同的分区键。 这是一个不好的设计吗? 如果可以,我该如何做得更好?

1 个答案:

答案 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 来补偿热分区,而不会给客户带来任何额外费用。但是不要指望太多。

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html#bp-partition-key-throughput-bursting

但是,在您的情况下,除非一所房子要拥有成千上万的设备/房间,或者一栋或几所房子的数据非常受欢迎,否则我真的不会看到问题。

要注意的一件事是json文件的大小(房间地图,仪表板配置)。如果这些文件太大,则AWS内的常规方法是将它们存储在S3中,然后在DynamoDB中添加它们的位置/ ID。在这种情况下,如果需要这些文件,则获取ID并转到S3进行查找。

相关问题