Dynamo DB数据模型

时间:2015-11-15 09:49:45

标签: database database-design amazon-dynamodb data-modeling

我正在设计一个DynamoDB表,我有以下属性:

  

uniqueID | TimeStamp | 输入 | 内容 |的标志

我需要根据时间戳将所有行的排序列表设置为true。

uniqueID是系统生成的ID。
TimeStamp是填充表时的系统时间。
不同类型的数量将小于10。
flag:true / false

我可以想到以下三种方法:

  1. 将uniqueID作为表的分区键,并创建全局二级索引作为标记&分别是TimeStamp,Partition和Sort键。现在,我可以使用hash作为标志查询Global Secondary索引,并在TimeStamp上获取已排序的项目。
    但是这里的问题是,因为flag的值只有true和false,并且没有标志设置为false的行与true相比相对非常少,所以只有2个分区。这会丢失DynamoDB的所有缩放特性。

  2. 另一种选择是将Type作为分区键,将TimeStamp作为Global Secondary Index的排序键。这个更好。但是在查询时我不能选择所有类型的Type作为DynamoDB在Query参数中需要Hash密钥。因此,我需要多次查询此GSI以获取所有类型的类型哈希键的数据。

  3. 扫描表格(扫描操作):扫描返回标志设置为true的所有数据,不需要哈希键,但它不能在creationTime上给我排序结果。< / p>

  4. 在分析用例之后,我认为方法1现在是最好的。

    请你提出更好的其他方法。

    提前致谢!

1 个答案:

答案 0 :(得分:0)

任何基于flag或TypeOfInfo的分区键都会很糟糕,因为只有很少的可能值(分别为2和10),并且数据进入分区的方式会有所偏差。您需要使用提供良好分发的东西,在您的情况下,表的分区键的基本候选者是uniqueId。

问题在于,当你想根据flag得到结果时,特别是当flag为true时,你会得到很多记录,可能是大多数。因此,如果您需要取回大多数记录,那么DynamoDB的扩展将不会给您带来太多帮助。

您可以尝试创建一个GSI,其中flag作为分区键,timestamp作为range键。这不是一套理想的按键,但涵盖了您的需求。拥有一个好的密钥表意味着您以后可以轻松切换到另一个解决方案(例如扫描而不使用GSI)。请记住,如果要在使用GSI时避免查询表,则必须将要返回的属性投影到GSI中。

总结一下,我认为你可以在GSI和扫描之间做出选择:

  • 扫描速度较慢(测试)但不需要额外的数据存储
  • GSI可以更快(测试它),但需要额外的数据存储。