我正在制作一个移动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对象的短键。
这里是我的最后一个问题,和对象在数据库中的金额将在确定的答案各不相同,应该我:
- 创建一个单独的键/对象为每一个对象的用户具有
- 创建一个帐户密钥/对象,并将所有信息存储在那里
显然,这两个选项之间会有不同的优点和缺点。例如,如果它是全部独立的,它将更快地被检索,但是它也是更加有组织和较小的数据集以将其存储在一个用户帐户中。
那么你怎么看?
感谢您的帮助!我为此付出了一笔赏金,确实需要尽快解答。
只是一对夫妇的音符为清楚起见:1. DynamoDB确实有一个查询操作,它只是需要使用RangeKey的。 2.扫描操作允许您在整个表格中查找数据,但不要求您下载整个表格。 3. SimpleDB在创建域的同一区域内有冗余副本,它不像数据库的CDN。 –
@BobKinney你是什么意思,你可以在整个表中找到数据,但不需要下载它? – MCKapur
我的意思就是我说的。扫描操作将扫描DynamoDB表上的所有数据,并且只返回表中与您的扫描参数匹配的项目,并且只有这些项目需要下载到您的应用程序中。扫描操作可以被绑定,以便您只查找前N个匹配结果,但它将使用尽可能多的读取吞吐量来查找这N个结果。 –