服务器端分页和大型数据集的分组

时间:2014-04-30 12:01:41

标签: mongodb database-design transformation

我会尽力解释这个问题。使用服务器分页实现网格。根据N个实体的请求,DB应该返回一组数据,这些数据应该被分组或更好地表示转换,以便在转换阶段完成时它应该产生那些N个实体。

我能看到的最佳方式是:

Query_all_data() => Result; (10000000 documents)
Transform(Result) => Transformed (100 groups)
Transformed.Skip(N).Take(N) 

转型阶段应该是这样的:

Result = [d0, d1, d2..., dN]
Transformed = [
    { info: "foo", docs: [d0. d2, d21, d67, d100042] },
    { info: "bar", docs: [d3. d28, d121, d6271, d100042] },
    { info: "baz", docs: [d41. d26, d221, d567, d100043] },
    { info: "waz", docs: [d22. d24, d241, d167, d1000324] }
] 

Transformed中的每个对象都是网格中的实体。

我不确定它是否重要,但有问题的数据库是MongoDB,所有文档都存储在一个集合中。现在,这种方法的巨大缺陷在于它可以放慢大型数据集的速度,而这肯定是这种情况。

有没有更好的方法。也许不同的数据库设计?

1 个答案:

答案 0 :(得分:1)

@dakt,您可以根据您使用数据的方式以几种不同的方式存储数据。在此过程中,以非规范化形式存储数据也可能有用,在这种形式下可能会出现一些重复数据。

  1. 将数据存储为问题陈述中提及的单个文档
  2. 将数据以转换格式存储在问题陈述中。看起来您有一种将文档映射到某个标记的一致方法。如果是这样,为什么不维护文档,以便始终为这些标记嵌入文档。这当然限制了您可以根据16MB文档限制包含的文档数量。
  3. 我建议查看MongoDB用例 - http://docs.mongodb.org/ecosystem/use-cases/,看看是否有任何类似于你想要实现的内容。