6

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

我将实际对象存储在 Amazon S3 上,并将密钥存储在数据库上,列出 Amazon S3 密钥很。那么存储密钥哪个更好?

这是我对 SimpleDB 和 DynamoDB 的了解:

简单数据库:

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

动态数据库:

  • 昂贵
  • 可扩展性极强
  • 表现出色;毫秒响应
  • 无法查询

这些点在我的理解中是正确的,DynamoDB 更多的是关于杀手的。速度和可扩展性,SimpleDB 更多的是关于查询和价格(仍然提供良好的性能)。但是,如果您这样看,从 DynamoDB 下载所有键,或者使用 SimpleDB 进行选择查询……这会更快,对吧?一种是使用超快的数据库下载大量(然后我们必须匹配它们),另一种是使用性能相当好的数据库来查询和下载少数正确的对象。所以,哪个更快:

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

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

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

accountUsername:typeOfObject:randomGeneratedKey

例如,如果您正在引用一个帐户对象

罗汉:账号:shd83SHD93028rF

或个人资料图片:

罗汉:简介图片:Nck83S348DD93028rF37849SNDh

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

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

  • 使用 SimpleDB,使用格式存储键,但不使用格式进行任何引用,而是使用 SimpleDB 存储的属性。因此,我将密钥与用户名、类型等属性一起存储,也许我还必须将其他属性包含在密钥格式中。因此,如果我想从用户“Rohan”获取帐户对象。我只是使用 SimpleDB Select 来查询属性“用户名”和属性“类型”。(我匹配“帐户”的地方)

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

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

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

这是我的最后一个问题,数据库中的对象数量将根据决定的答案而有所不同,我应该:

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

显然,这两种选择之间会有不同的优点和缺点。例如,如果它们都是独立的,则检索起来会更快,但它也更有条理,并且用于将其存储在一个用户帐户中的数据集较小。

所以你怎么看?

谢谢您的帮助!我已经为此付出了赏金,真的需要尽快回答。

4

1 回答 1

7

哇!这是什么问题 :)

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

S3

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

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

Dynamo 与 SimpleDB

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

  • 在以下情况下使用 SimpleDB:

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

    • 您的实体存储将超过 10GB
    • 您想随时扩展需求/吞吐量
    • 您的查询和模型定义明确,不太可能更改。
    • 您的模型是动态的,涉及松散的模式
    • 您可以在客户端缓存查询(因此您可以通过在 Dynamo 之前查询缓存来节省吞吐量)
    • 您想通过使用原子更新来进行聚合/汇总摘要

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

地理 SimpleDB

它不支持。它仅适用于 us-east-1 afaik。

键名

这最适用于 Dynamo:只要有可能,就使用 Hash + Range Key。但您也可以使用哈希创建键,并应用一些查询,例如:

  • 列出我在表 T 上的所有记录,表 T 以accountid:
  • 列出我在表 T 上的所有记录,表 T 以accountid:image

但是,这些根本就是扫描。请记住这一点。

(有关概述,请参见:http: //docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html

奖金轨道

如果您使用的是 Java,Maven Central 上的 cloudy-data 包括 SimpleJPA 以及一些将 Blob 字段映射到 S3 的扩展。所以看一下:

http://bitbucket.org/ingenieux/cloudy

谢谢

于 2013-01-11T20:10:06.780 回答