从SQLAzure中获取大行—但该去哪里?桌子,Blob或者类似MongoDB的东西?
我阅读了很多Azure Table/Blob/SQL存储之间的比较,我认为我对所有这些都有很好的理解。。。但是,我仍然不确定该去哪里满足我的特殊需求。也许有人在类似的情况下有经验,能够提出建议 我拥有的 SQLAzure数据库,将原始HTML中的文章存储在varchar(max)列中。每行还具有许多元数据列和许多索引,便于查询。该表包含许多对用户、订阅、标记等的引用,因此我的项目始终需要SQL DB 有什么问题 我在这个表格中已经有大约500000篇文章,我预计它将以每年数百万篇的速度增长。每篇文章的HTML内容可以在几KB到1MB之间,或者在极少数情况下大于1MB 出现了两个问题:因为Azure SQL存储非常昂贵,所以我会提前而不是晚一点用存储成本来打击自己。此外,我还将更早地达到150gbdb的大小限制,而不是更晚。这500000篇文章现在已经消耗了1,6GB的数据库空间 我想要什么 很明显,这些HTML内容必须从SQL数据库中删除。虽然为了快速发现所需文章,必须保留文章表本身,以便将其与用户、订阅、标记等连接起来,但至少可以将保存HTML内容的列外包给更便宜的存储设备 乍一看,Azure桌面存储似乎是完美的选择 在一个大表中存储数TB的数据,价格非常便宜,查询速度也很快——如果有一个单表存储表来存储文章内容,作为SQL DB的附加组件,听起来很完美 但是,通过这里的比较可以看出,这甚至不是一个选项:每列64KB足以容纳98%的文章,但还有2%的文章,对于某些单个文章,即使整个1MB的行限制也可能不够 Blob存储听起来完全错误,但是… 所以Azure左侧只有一个选项:blob。现在,它可能不像听起来那么错误。在大多数情况下,我一次只需要一篇文章的内容。对于Blob存储,这应该可以很好且足够快地工作 但我也有一些查询,需要同时包含50行、100行甚至更多行,甚至包括内容。因此,我必须运行SQL查询来获取所需的文章,然后从Blob存储中取出每一篇文章。我没有这方面的经验,但我不敢相信在进行这项工作时,我能够在毫秒的时间跨度内进行查询。对于我的项目来说,需要几秒钟的查询是绝对不可能的 因此,这似乎也不是一个合适的解决方案 我看起来像一个有计划的人吗? 至少我有个计划。我只考虑将适当的记录“导出”到SQL表存储和/或Blob存储中 类似于“只要内容小于64 KB,就将其导出到表存储中,否则将其保存在SQL表中(或者甚至将这条XL记录导出到BLOB存储中)” 这可能足够好了。但这会使事情变得复杂,而且可能容易出现不必要的错误 其他选项 还有一些其他的NoSQL数据库,比如MongoDB和CouchDB,似乎更适合我的需要(至少从我的天真观点来看,我只是在纸上读过规范,我没有使用它们的经验)。但他们需要自我托管,如果可能的话,我想避开一些事情。在Azure上,我只需要在自托管服务器和服务方面做一些必要的事情 你真的读到这里了吗? 然后,非常感谢您宝贵的时间和思考我的问题:) 如有任何建议,将不胜感激。如你所见,我有自己的想法和计划,但没有什么比以前走过这条路的人的经验更好:) 谢谢,从SQLAzure中获取大行—但该去哪里?桌子,Blob或者类似MongoDB的东西?,mongodb,azure,azure-sql-database,azure-storage-blobs,azure-table-storage,Mongodb,Azure,Azure Sql Database,Azure Storage Blobs,Azure Table Storage,我阅读了很多Azure Table/Blob/SQL存储之间的比较,我认为我对所有这些都有很好的理解。。。但是,我仍然不确定该去哪里满足我的特殊需求。也许有人在类似的情况下有经验,能够提出建议 我拥有的 SQLAzure数据库,将原始HTML中的文章存储在varchar(max)列中。每行还具有许多元数据列和许多索引,便于查询。该表包含许多对用户、订阅、标记等的引用,因此我的项目始终需要SQL DB 有什么问题 我在这个表格中已经有大约500000篇文章,我预计它将以每年数百万篇的速度增长。每篇
Bernhard文件的正确存储方式是blob。但是,如果您的查询需要同时返回几十个blob,那么正如您所指出的那样,它将太慢。因此,您可以使用混合方法:对98%的数据使用Azure表,如果数据太大,则使用Blob,并将Blob URI存储在表中
此外,您是否正在压缩您的内容?我当然会的。我的一个想法是使用CDN来存储文章内容,并直接从客户端链接它们,而不是从sql中获取数据然后再到某个存储的任何多阶段操作。 大概是
http://<cdnurl>/<container>/<articleId>.html
http:////.html
事实上,Blob存储也可以做同样的事情
这样做的好处是速度快得惊人
这里的缺点是安全方面丢失了
共享访问签名之类的东西可以用于安全性,但我不确定它对客户端链接有多大帮助 您可以使用MongoDB的GridFS功能: 默认情况下,它将数据拆分为256k块(最多可配置16mb),并允许您将分片数据库用作文件系统,用于存储和检索文件。如果文件大于块大小,mongo db驱动程序将在需要检索文件时处理数据的拆分/重新组装。要添加额外的磁盘空间,只需添加额外的碎片 但是,您应该知道,只有一些mongodb驱动程序支持这种行为,这是一种驱动程序约定,而不是允许这种行为的服务器功能。一些评论:
- 您可以做的是始终将HTML内容存储在blob存储中,并将blob的URL存储在表存储中。就我个人而言,我不喜欢将数据存储在数据库中
YourBlobClientWithReferenceToTheFile.Seek(TableStorageData.start, SeekOrigin.Begin); int numBytesToRead = (int)TableStorageData.end - (int)TableStorageData.start; int numBytesRead = 0; while (numBytesToRead > 0) { int n = YourBlobClientWithReferenceToTheFile.Read(bytes,numBytesRead,numBytesToRead); if (n == 0) break; numBytesRead += n; numBytesToRead -= n; }