我正在制作移动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对象的短键。
这是我的最后一个问题,如果我:
,数据库中的对象数量将根据确定的答案而有所不同显然,这两个选项之间存在不同的优缺点。例如,检索它是否全部是单独的更快,但它也更有条理,而且数据集的大小不足以将其存储在一个用户帐户中。
那你觉得怎么样?
感谢您的帮助!我已经给了这个奖励,真的需要尽快回答。
答案 0 :(得分:7)
哇!什么问题:)
好的,我们来讨论一些方面:
S3性能很低,因为您没有为列表键添加前缀。
如果通过存储像type/owner/id
这样的对象进行分片,列出给定所有者的所有ID(前缀为类型/所有者/)将会很快。或者至少比一次列出所有内容更快。
总的来说,这就是我的建议:
在以下情况下使用SimpleDB:
在以下情况下使用DynamoDB:
鉴于您当前的描述,似乎SimpleDB实际上更好,因为: - 您的模型未完全定义 - 您可以推迟一些决策方面,因为达到(10GiB)限制需要一段时间
它不支持。它仅适用于我们 - 东方 - 1 afaik。
这最适用于Dynamo:只要你可以,使用Hash + Range Key。但您也可以使用Hash创建密钥,并应用一些查询,例如:
accountid:
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
谢谢