5

我正在制作一个移动iOS应用程序。用户可以创建一个帐户,并上传字符串。它会像Twitter一样,你可以关注人物,拥有个人资料照片等。我无法估计用户群,但是如果应用程序启动,总数据集可能会相当大。SimpleDB选择VS DynamoDB扫描

我在Amazon S3上存储了实际的对象,并且在DataBase上列出了Amazon S3密钥的密钥是slow。那么哪个更适合存储密钥?

这是我的SimpleDB和DynamoDB的知识:

的SimpleDB:

  • 便宜
  • 表现良好
  • 专为小型/中型数据集
  • 可以查询使用select表达式

DynamoDB:

  • 昂贵
  • 高度可扩展
  • 执行很大;毫秒响应
  • 无法查询

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

DynamoDB下载的一切,匹配或SimpleDB的查询和下载该

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

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

accountUsername:typeOfObject:randomGeneratedKey

E.g.如果您要引用到一个帐户对象

罗汉:帐号:shd83SHD93028rF

或者资料图片:

罗汉:ProfilePic:Nck83S348DD93028rF37849SNDh

我有随机生成的唯一性密钥,它不涉及任何内容,它只是在那里,因此密钥不会重复出现重叠两个对象。

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

  • 使用的SimpleDB,存储密钥的格式,但不使用格式的任何引用,而不是使用属性存储在SimpleDB中。因此,我将密钥存储为具有诸如用户名,类型之类的属性,也许还需要以密钥格式包含其他属性。所以如果我想从用户'Rohan'获取账户对象。我只是使用SimpleDB Select来查询属性“用户名”和属性“类型”。 (我匹配'帐户')

  • DynamoDB,存储密钥和每个密钥将具有说明的格式。我扫描整个数据库返回每一个单一的关键。然后获得密钥并利用密钥格式,我可以使用-rangeOfString来匹配我想要的密钥,然后从S3下载。

此外,SimpleDB显然是在地理上分布的,但我怎样才能启用呢?

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

这里是我的最后一个问题,和对象在数据库中的金额将在确定的答案各不相同,应该我:

  • 创建一个单独的键/对象为每一个对象的用户具有
  • 创建一个帐户密钥/对象,并将所有信息存储在那里

显然,这两个选项之间会有不同的优点和缺点。例如,如果它是全部独立的,它将更快地被检索,但是它也是更加有组织和较小的数据集以将其存储在一个用户帐户中。

那么你怎么看?

感谢您的帮助!我为此付出了一笔赏金,确实需要尽快解答。

+0

只是一对夫妇的音符为清楚起见:1. DynamoDB确实有一个查询操作,它只是需要使用RangeKey的。 2.扫描操作允许您在整个表格中查找数据,但不要求您下载整个表格。 3. SimpleDB在创建域的同一区域内有冗余副本,它不像数据库的CDN。 –

+0

@BobKinney你是什么意思,你可以在整个表中找到数据,但不需要下载它? – MCKapur

+0

我的意思就是我说的。扫描操作将扫描DynamoDB表上的所有数据,并且只返回表中与您的扫描参数匹配的项目,并且只有这些项目需要下载到您的应用程序中。扫描操作可以被绑定,以便您只查找前N个匹配结果,但它将使用尽可能多的读取吞吐量来查找这N个结果。 –

回答

6

哇!这是什么问题:)

好吧,让我们讨论一些方面:

S3

S3性能低很可能是你不增加对上市键的前缀。

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

迪纳摩对战的SimpleDB

一般情况下,这就是我的建议是:

  • 使用SimpleDB的时候:

    • 你的实体存储不会越过10GB
    • 你需要应用涉及多个领域的复杂查询
    • 您的查询IES没有明确定义,
    • 您可以从多值数据类型
  • 使用DynamoDB利用时:

    • 你的实体存储将通过10GB
    • 要缩放需求/吞吐量,因为它是
    • 您的查询和模型是明确的,不太可能改变。
    • 你的模型是动态的,涉及一个松散的架构
    • 您可以在客户端缓存你的查询
    • 你想干什么聚集/汇总(这样你就可以在吞吐量通过查询之前迪纳摩缓存保存)总结,通过使用原子更新

鉴于你目前的描述,似乎SimpleDB的实际上是更好的,因为: - 您的模型没有完全确定 - 你可以推迟一些决策方面,因为它需要一会儿打(10G iB)限制

地理简单数据库

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

重点命名

这适用最迪纳摩:每当你可以使用哈希+ RANGE键。但你也可以创建使用哈希键,并应用了一些疑问,如:

  • 列表我对与accountid:
  • 列表我的表T的所有记录与accountid:image
开始启动表T的所有记录

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

(对于综述见本:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html)如果你使用的是Java

奖金轨道

,Maven的中央阴天数据包括的SimpleJPA有一些扩展,地图BLOB字段到S3。所以给它一看:

http://bitbucket.org/ingenieux/cloudy

谢谢

+0

谢谢!非常令人放心 – MCKapur