我正在制作一个移动 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 对象的短键。
这是我的最后一个问题,数据库中的对象数量将根据决定的答案而有所不同,我应该:
- 为用户拥有的每个对象创建一个单独的键/对象
- 创建一个帐户密钥/对象并将所有信息存储在其中
显然,这两种选择之间会有不同的优点和缺点。例如,如果它们都是独立的,则检索起来会更快,但它也更有条理,并且用于将其存储在一个用户帐户中的数据集较小。
所以你怎么看?
谢谢您的帮助!我已经为此付出了赏金,真的需要尽快回答。