我正在构建移动应用程序(iPhone / Android)并希望将应用程序数据存储到Amazon的SimpleDB上,因为我们不想托管我们自己的服务器来提供这些服务。我一直在浏览所有文档,元素值的最大存储大小是1024字节。
在我的情况下,我们需要存储1024到10K的文本数据。
我希望了解其他项目如何使用SimpleDB,因为它们有更大的存储需求,比如我们的项目。我读到可以存储指向文件的指针,然后存储在S3(文件系统)中。不确定这是否是一个好的解决方案。
在我看来,我不确定SimpleDB是否是正确的解决方案。任何人都可以评论已经做了什么或者提供了一种不同的方式来思考这个问题吗?
答案 0 :(得分:14)
有多种方法可以存储您的10k文本数据,但是否可以接受将取决于您需要存储的其他内容以及您计划如何使用它。
如果您需要存储任意大数据(尤其是二进制数据),那么S3文件指针可能很有吸引力。 SimpleDB在此方案中添加的值是能够针对存储在SimpleDB中的文件元数据运行查询。
对于限制为10k的文本数据,我建议将其直接存储在SimpleDB中。它很容易适合单个项目,但您必须将其分布在多个属性中。基本上有两种方法可以做到这一点,每种方法都有一些缺点。
一种方式更灵活,搜索更友好,但需要您触摸数据。您将数据拆分为大约1000字节的块,并将每个块作为属性值存储在多值属性中。没有对多值属性进行排序,因此您必须在每个块前面添加一个用于排序的数字(例如01)
将所有文本存储在一个属性中的事实使得查询在谓词中使用单个属性名称变得容易。您可以为1k到200 + k之间的每个项目添加不同大小的文本,并对其进行适当处理。但您必须注意,您的前缀行号可能会对您的查询产生正面影响(例如,如果您要搜索01
,则每个项目都会与该查询匹配)。
在SimpleDB中存储文本的第二种方法不需要在文本块中放置任意排序数据。您可以通过将每个文本块放在不同的命名属性中来进行排序。例如,您可以使用属性名称:desc01
desc02
... desc10
。然后将每个块放在适当的属性中。您仍然可以使用这两种方法进行全文搜索,但使用此方法搜索会更慢,因为您需要指定许多谓词,而SimpleDB最终将通过单独的索引搜索每个属性。
可能很容易将这种类型的工作视为黑客攻击,因为对于数据库,我们习惯于在数据库中为我们处理这种类型的低级细节。 SimpleDB专门设计用于将此类事物从数据库推出到客户端,作为提供可用性作为一流功能的一种方式。
如果您发现关系数据库将您的文本拆分为1k块以存储在磁盘上作为实现细节,那么它似乎不是一个黑客攻击。问题是SimpleDB客户端的当前状态是你必须自己实现很多这种类型的数据格式。这是理想情况下在智能客户端中为您处理的事物类型。现在还没有任何智能客户可以免费使用。
答案 1 :(得分:1)
如果您担心成本问题,您可能会发现将文本放入S3并使用SimpleDB中的指针元数据更便宜。
答案 2 :(得分:1)
您可以将10k文本放在S3上,然后创建一个属性,该属性将10k文本的所有唯一单词作为多个值。然后搜索会很快。不过没有短语搜索。
您可以在一个'行'(名称)中的一个属性中存储多少个值?我查看了文档,没有回答我的问题。
- 汤姆
答案 3 :(得分:0)
即将发布的Simple Savant(我创建的SimpleDB的C#持久性库)将支持Mocky描述的属性跨越和使用Lucene.NET对SimpleDB数据的全文搜索。
我意识到您可能没有在C#中构建应用程序,但由于您的问题是搜索SimpleDB和全文索引时的最佳结果,因此值得一提。
更新:我上面提到的Simple Savant版本现已推出。
答案 4 :(得分:0)
SimpleDb很简单。其中的一切都是一个字符串。文档非常简单。而且有很多使用限制。如:
SELECT * FROM ___ WHERE ItemName() IN (...)
中使用ItemName
个IN
。PUT
(更新)到25条记录。SELECT
LIMIT
进行1000
,则可能会返回800
(甚至一无所有)以及您需要的nextToken
之类的内容提出额外请求(使用nextToken
)。这意味着下一个SELECT
实际上可能会返回限制计数,因此两个SELECT
中返回的行的总和可能会大于原始限制。如果您选择了很多,这是一个问题。此外,如果您执行SELECT COUNT(*)
,您将遇到类似的问题。它将返回一个计数,以及nextToken
。而且你需要继续迭代那些nextToken
并总结返回的计数以获得真实的(总计)数。因此,如果您计划使用大量字符串数据,或者拥有大量记录,那么您可能希望查看其他地方。 SimpleDb非常可靠,并且按照文档记录,但它可能会引起很多麻烦。
在你的情况下,我会推荐像MongoDb这样的东西。它也有自己的一些问题,但对于这种情况可能更好。但是,如果你有很多记录(数百万和向上),然后尝试将索引添加到太多记录中,如果它在spindels而不是SSD上,你可能会破坏它。