SimpleDB选择VS DynamoDB扫描

时间:2013-01-04 02:58:52

标签: database amazon-web-services amazon-s3 amazon-simpledb amazon-dynamodb

我正在制作移动iOS应用。用户可以创建帐户并上传字符串。它会像twitter,你可以关注人物,有个人资料图片等。我无法估计用户群,但如果应用程序起飞,总数据集可能会相当大。

我将实际对象存储在Amazon S3上,并且列出Amazon S3密钥的DataBase上的键是。那么存储密钥会更好吗?

这是我对SimpleDB和DynamoDB的了解:

SimpleDB的:

  • 便宜
  • 表现良好
  • 专为小型/中型数据集而设计
  • 可以使用选择表达式进行查询

DynamoDB:

  • 昂贵的
  • 极易扩展
  • 表现出色;毫秒响应
  • 无法查询

这些观点对我的理解是正确的,DynamoDB更像是杀手锏。速度和可扩展性,SimpleDB更多的是查询和价格(仍然提供良好的性能)。但是如果以这种方式看待它,这会更快,从DynamoDB下载所有密钥,或者使用SimpleDB进行选择查询......对吗?一个是使用超快速数据库下载批次(然后我们必须匹配它们),另一个是使用性能相当好的数据库来查询和下载少数正确的对象。所以,这更快:

DynamoDB下载所有内容并匹配OR SimpleDB查询和下载

(注意:匹配只是意味着使用-rangeOfString和字符串比较,没有耗电或非时间效率或任何服务器端)

我的S3键将为每种类型的对象使用此格式

  

accountUsername:typeOfObject:randomGeneratedKey

E.g。如果您正在引用帐户对象

  

罗汉:帐号:shd83SHD93028rF

或者个人资料图片:

  

罗汉:ProfilePic:Nck83S348DD93028rF37849SNDh

我有随机生成的唯一性密钥,它没有引用任何东西,只是因为密钥不重复因此重叠两个对象。

在我的应用程序中,我可以选择SimpleDB或DynamoDB,所以这里有两个选项:

  • 使用SimpleDB,使用格式存储密钥但不使用任何引用的格式,而是使用存储在SimpleDB中的属性。所以,我存储了密钥,其中包含用户名,类型等属性以及其他我也必须以密钥格式包含的内容。因此,如果我想从用户'Rohan'获取帐户对象。我只是使用SimpleDB Select来查询属性'username'和属性'type'。 (我在那里匹配'帐户')

  • DynamoDB,商店密钥和每个密钥都将具有图示的格式。我扫描整个数据库返回每一个键。然后获取密钥并利用密钥格式,我可以使用-rangeOfString来匹配我想要的密钥,然后从S3下载。

此外,SimpleDB显然是按地理位置分布的,我该如何启用它呢?

哪个更快且更可靠?使用SimpleDB查询具有属性的键。或者使用DynamoDB存储所有密钥,扫描(下载所有密钥)并使用例如匹配进行匹配。 -rangeOfString?请注意,这些只是指向S3对象的短键。

这是我的最后一个问题,如果我:

,数据库中的对象数量将根据确定的答案而有所不同
  • 为用户拥有的每个对象创建单独的键/对象
  • 创建一个帐户密钥/对象并将所有信息存储在那里

显然,这两个选项之间存在不同的优缺点。例如,检索它是否全部是单独的更快,但它也更有条理,而且数据集的大小不足以将其存储在一个用户帐户中。

那你觉得怎么样?

感谢您的帮助!我已经给了这个奖励,真的需要尽快回答。

1 个答案:

答案 0 :(得分:7)

哇!什么问题:)

好的,我们来讨论一些方面:

S3

S3性能很低,因为您没有为列表键添加前缀。

如果通过存储像type/owner/id这样的对象进行分片,列出给定所有者的所有ID(前缀为类型/所有者/)将会很快。或者至少比一次列出所有内容更快。

Dynamo与SimpleDB

总的来说,这就是我的建议:

  • 在以下情况下使用SimpleDB:

    • 您的实体存储空间不会超过10GB
    • 您需要应用涉及多个字段的复杂查询
    • 您的查询定义不明确
    • 您可以利用多值数据类型
  • 在以下情况下使用DynamoDB:

    • 您的实体存储空间将通过10GB
    • 您希望随着时间的推移扩大需求/吞吐量
    • 您的查询和模型定义明确,不太可能发生变化。
    • 您的模型是动态的,涉及松散的架构
    • 您可以在客户端缓存查询(这样您就可以通过在Dynamo之前查询缓存来节省吞吐量)
    • 您希望使用原子更新
    • 执行汇总/汇总汇总

鉴于您当前的描述,似乎SimpleDB实际上更好,因为:      - 您的模型未完全定义      - 您可以推迟一些决策方面,因为达到(10GiB)限制需要一段时间

地理SimpleDB

它不支持。它仅适用于我们 - 东方 - 1 afaik。

键命名

这最适用于Dynamo:只要你可以,使用Hash + Range Key。但您也可以使用Hash创建密钥,并应用一些查询,例如:

  • 列出表格T上以accountid:
  • 开头的所有记录
  • 列出表格T上以accountid:image
  • 开头的所有记录

然而,这些都是扫描。牢记这一点。

(见概述:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html

奖金追踪

如果您正在使用Java,Maven Central上的云数据包括SimpleJPA,其中包含一些对Map Blob Fields到S3的扩展。所以看看:

http://bitbucket.org/ingenieux/cloudy

谢谢