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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
无界增长表的MongoDB模式设计_Mongodb_Schema - Fatal编程技术网

无界增长表的MongoDB模式设计

无界增长表的MongoDB模式设计,mongodb,schema,Mongodb,Schema,我正在MongoDB上通过一个小型个人项目进行练习, 其中,可能需要存储一些抽象为无限增长表的中间数据。行和列都将无限增长 这个抽象表的用途是我希望能够 知道行中每个条目对应的列 知道列中每个条目对应的行 或者,换句话说,知道每个表项的索引 因此,有两种选择可以对表进行建模: 进行两次收集: 一种是将每一行作为一个文档保存,该文档嵌入一个增长结构作为行条目,以引用相应的列 类似地,另一个集合将每一列作为一个文档,嵌入一个不断增长的结构来引用相应的行 创建一个单独的集合,将每个表条目作为文

我正在MongoDB上通过一个小型个人项目进行练习, 其中,可能需要存储一些抽象为无限增长表的中间数据。行和列都将无限增长

这个抽象表的用途是我希望能够

  • 知道行中每个条目对应的列
  • 知道列中每个条目对应的行
或者,换句话说,知道每个表项的索引

因此,有两种选择可以对表进行建模:

  • 进行两次收集:
    • 一种是将每一行作为一个文档保存,该文档嵌入一个增长结构作为行条目,以引用相应的列
    • 类似地,另一个集合将每一列作为一个文档,嵌入一个不断增长的结构来引用相应的行
  • 创建一个单独的集合,将每个表条目作为文档保存。因此,每个文档大小都是固定的
  • 第一个模型有问题(事实上,在我的应用程序中,表有点歪斜,只有一个集合会遇到文档增长问题)。我觉得第二种型号不错。是否有一些陷阱或其他问题需要注意?处理此类问题的常见做法是什么


    更新:更详细地解释事情 我正在尝试做一个正在进行的对话的一部分。输入是一个句子语料库,从每个句子中提取术语。例如,英语术语是,英语中的句子是。由此得到一个术语句子矩阵。其中一种方法需要计算这类术语的句子矩阵

    句子和提取的术语将存储到数据库中。但是句子矩阵这个词会变得无限大

    (或者可以考虑存储tweet和hashtags之间的映射的问题)

    我想到了两种草稿模式选择:

    选择一(保持句子和术语之间的双向联系) 选择二(将链接设置为单独的集合) 选择一会遇到问题,因为当句子不停地出现时,术语集合文档的“in-statemens”数组很可能会超出限制

    选择二将术语和句子之间的链接提取到单独的集合中,从而避免文档增长。虽然查询“哪些句子包含术语”花费更多,但最终,我似乎并不需要这么多操作

    目前,我认为选择二更适合我的需要。链接集合似乎符合稀疏SVD的输入。为了加快计算速度,如果将术语频率字段添加到每个术语集合文档中(或当存在多个对话时,在单独的集合中),则可以过滤掉非常高频的术语。在自动摘要的情况下,这种过滤似乎很好

    但还是很奇怪

    • 是否有一些问题或陷阱需要注意
    • 类似情况的常见做法是什么

    如果您试图用代表矩阵的整个集合来建模矩阵,我认为go-to模型应该将每个条目(第I行,第j列)作为文档。如果你在一个像
    “index”:{“row”:i,“column”:j}
    这样的字段中输入适当的索引,那么你就可以轻松快速地做一些有趣的事情,比如

    • 在(i,j)处获取条目
    • 第一排
    • 获取第j列
    矩阵是稀疏表示的,因此如果第i行只有10列带有值,那么第i行只有10个文档。如果行/列确实无限增长到非常大的大小,那么将文档建模为行或列或“一维”可能会达到16MB的BSON文档大小限制


    我认为最大的缺点可能是索引太大,因为每个条目都是自己的文档。

    我对mongodb的理解是,您需要围绕查询设计模式。因此,如何保存数据在很大程度上取决于要查询的数据。因此,即使对于同一组数据,您的模式也可能因实际用例而异。此外,数据冗余在NoSql数据库设计中非常常见。如果您一次又一次地需要一些数据,那么将其保存在单独的集合中是没有意义的。您可以在两个集合中复制它,这对于更快的查询来说是一个足够公平的成本。内存很便宜,处理却不便宜!此外,在mongo中,预聚合有助于实现大型数据集。对于数量可观的文档,您的查询可以正常工作,但一旦进入数百万条记录的领域,您可能会遇到某些查询类的问题,如计数、聚合等。预聚合有助于保持实时性,尽管它可能有更高的写/插入开销。尽可能避免全表扫描

    以上是我发现与您的问题相关的一些广义概念。我将尝试用一些例子在您的上下文中解释它(因为我不确定您最终将需要什么数据,或者您将要执行的查询)

    假设您需要经常使用每个
    句子的
    术语来突出显示它们。在这种情况下,建议的模式为:

    {   "_id" : // sentence id - you will query on this
        , "text" : // sentence text
        , "terms" : ["term1", "term2", "term3"]
    }
    
    因此,对于每个新句子,提取所有术语并将其(而不是id)与句子一起保存。这里的优点是您不需要单独查询术语。您可以在一个查询中获得给定句子的所有术语。此外,文档大小不会增长,因此不会重新定位文档

    假设您还希望有一个唯一的术语列表和一些每个术语的元数据。您可以有一个单独的术语集合,其中包含所有唯一术语的列表:

    { "_id": ,
      , "term": //term
      , "meaning":
      , "metadata""
      , "count": 1 
    }
    
    您可以在术语上具有唯一索引。每次你从一个句子中提取术语,你都会在这个集合中查找它,
    {   "_id" : // sentence id - you will query on this
        , "text" : // sentence text
        , "terms" : ["term1", "term2", "term3"]
    }
    
    { "_id": ,
      , "term": //term
      , "meaning":
      , "metadata""
      , "count": 1 
    }