Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQLAzure中获取大行—但该去哪里?桌子,Blob或者类似MongoDB的东西?_Mongodb_Azure_Azure Sql Database_Azure Storage Blobs_Azure Table Storage - Fatal编程技术网

从SQLAzure中获取大行—但该去哪里?桌子,Blob或者类似MongoDB的东西?

从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篇文章,我预计它将以每年数百万篇的速度增长。每篇

我阅读了很多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上,我只需要在自托管服务器和服务方面做一些必要的事情

你真的读到这里了吗?

然后,非常感谢您宝贵的时间和思考我的问题:)

如有任何建议,将不胜感激。如你所见,我有自己的想法和计划,但没有什么比以前走过这条路的人的经验更好:)

谢谢,
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;
            }