NoSQL是此特定数据库问题的最佳选择

时间:2011-01-04 01:25:13

标签: sql mongodb database-design db4o nosql

我遇到了问题,我认为NoSQL解决方案是答案,但我不确定。此外,我不确定哪种类型的NoSQL DB(对象,文档,图形,密钥等)最适合解决此问题。

问题:

我有两个系列。 CollectionA包含2K +字符串(域名)。 CollectionB更大,看起来像(伪)这样:

{
    "To" : "address1@address1.com,address2@address2.com,there_could_be_100@more_address.com",  
    "Bcc" : "address1@address1.com,address2@address2.com,there_could_be_100@more_address.com",  
 "From" : "address1@address1.com,address2@address2.com,there_could_be_100@more_address.com", 
 "Subject" : "Email Subject", 
 "Unknown" : "NumberOfFields", 
 "N" : "PlusOneExtraFields", 
}

的已知,

  1. To,Bcc和From字符串中列出的人数可达100人。
  2. 我没有一个好方法来爆炸To,From,Bcc字段。
  3. 如果没有办法爆炸To,From,Bcc字段,我不得不搜索字符串。
  4. 有一些已知字段,但有许多未知字段。
  5. 要求不当前要求搜索未知字段。
  6. 数据库引擎需要在Windows桌面上运行。
  7. 当前思路:

    使用NoSQL解决方案和可能 C#动态关键字?

    模糊

    1. 这是一个文档数据库能够轻松解决的问题吗?

    2. 在这种类型的数据结构中搜索/比较Map / Reduce的内容吗?

4 个答案:

答案 0 :(得分:1)

我完全同意@HighTechRider,如果数据量与您所暗示的一样大,那么对于高性能查询来说,数据的非规范化(如您所说的那样爆炸)似乎是必须的,否则无论您使用什么产品都无关紧要选择,它最终将成为某种时尚或其他方式的自由文本扫描。

@ chx对狮身人面像的建议,似乎至少可以加速后者。但是这条路线有隐藏的成本 - 需要您捆绑,安装,管理,修补,更新等其他人的服务以及您的软件。

最小化索引和查询中的桌面资源消耗必须是高优先级,并且在桌面上设置自由文本服务器似乎与该章程有些相反。

我从基本文件系统开始 - 使用文件系统对象来表示非规范化数据。或者,如果表示和执行您的查询看起来过于复杂,那么在尝试将更多奇特的服务器目标产品放入桌面之前,请查看简单的嵌入式表库(如SQLite或SQL Compact版本)。

SQLite与SQL Compact Edition的比较很好:

http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.compactframework/2005-12/msg00019.html

SQLite还可以创建自由文本索引,以涵盖将来的某些“未知字段”场景。

至于map-reduce,它的策略对你正在接近的域有效。

答案 1 :(得分:0)

以XML格式存储并使用sphinx进行搜索。使用xmlpipe2通过像grep之类的东西来提供sphinx,只将已知字段输入其中。一旦您需要搜索更多内容,请将这些字段添加到您的过滤器和架构并重新索引。 Sphinx可以以这样的速度进行索引,这不会造成任何问题。也可以分发。

你正在呼吁进行文本搜索,这意味着solr或sphinx以及两个狮身人面像之间更容易在Windows桌面上进行设置。

答案 2 :(得分:0)

我觉得这是Apache lucene.net的正确候选人。

您可以为上述指定结构创建一个lucene文档,例如

         Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document();

         doc.Add( new Lucene.Net.Documents.Field(
             "To",
             ToData,
             Lucene.Net.Documents.Field.Store.YES,
             Lucene.Net.Documents.Field.Index.ANALYZED,
             Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));


         doc.Add(new Lucene.Net.Documents.Field(
             "From",
             FromData,
             Lucene.Net.Documents.Field.Store.YES,
              Lucene.Net.Documents.Field.Index.ANALYZED,
             Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));

         doc.Add(new Lucene.Net.Documents.Field(
            "BCC",
            BCCData,
            Lucene.Net.Documents.Field.Store.YES,
            Lucene.Net.Documents.Field.Index.ANALYZED,
             Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));

    // Since you dont want Unknown field to be indexed, you can make it Index.NO.
        doc.Add(new Lucene.Net.Documents.Field(
            "Unknown",
            BCCData,
           Lucene.Net.Documents.Field.Store.YES,
             Lucene.Net.Documents.Field.Index.NO));

但是lucene的问题是你不能在以后添加新字段或修改现有的字段结构。因此,您必须删除文档并从scracth创建新文档。

更好的方法是让所有字段都可以为未知字段编制索引。

答案 3 :(得分:0)

不,不是。它是全文搜索引擎的候选者,与“nosql”无关,无论是什么。

全文搜索引擎经常使用SQL或其中的一些变体。例如,Sphinx或Lucene。您也可以使用Microsoft的(但我不知道这是否满足您的要求,您需要检查)。