Postgres与MongoDB建模递归多子关系

时间:2016-05-22 19:09:03

标签: ruby-on-rails node.js mongodb postgresql

我正在考虑将以下任一堆栈用于个人项目: Nodes.js / MongoDB(学习) Rails / Postgres(更熟悉) 我想尝试一下MongoDB用于学习目的,但我不确定它是否适合这个问题。我想听听基于以下问题描述的权衡和示例,一些具体问题在底部:

有一个产品清单,比如p1,p2,p3,每个产品都有一些环境影响的字段,比方说A,B,C。

               p1                     p2
               +                       +
               |                       |
               |                       |
      +------------------+        +----+----+
      |        |         |        |         |
      +        +         +        +         +
      p3       p4        p5       p3        p6
      +        +         |
      |        |         |
  +-----+-+  +---+--+  +---+--+
  +       +  +      +  +      +
  p7      p8 p2     p9 p10   p11

p1.A = p3.A + p4.A + p5.A

p1.B = p3.B + p4.B + p5.B

p3.A = p7.A + p8.A

产品表看起来像这样

id  A   B   C   parents children
1   4   5   6   []      [3, 4, 5]
2   10  11  12  [4]     [3, 6]
3   6   7   8   [1,2]   [7, 8]
4   3   9   6   [1]     [2, 9]
5   3   3   10  [1]     [10, 11]
6   3   1   2   [2]     []
7   4   5   0   [3]     []
...         

更新流程如下所示:

p1由p2和p3组成。

p2也由p3

组成

如果p3 A,B或C更新,它将触发p1更新以重新计算其A,B,C,尽管可能仍具有旧的p2值。然后,当p3更新p2时,p2更新将再次触发p1更新。根据排序,更新中可能会有一些冗余操作。我猜这没关系。

由于环境影响不是关键数据,我只是看数据最终是一致的。

就规模而言,在某些时候可能会有成千上万的产品。

问题:

1)我需要在循环图中防止无限更新周期。

2)你能否轻松地在MongoDB中处理这种类型的双向关联,产品的父母是产品,孩子是产品。

3)我可以构建数据而不是父数组和子数组的不同方法有哪些,并有效地设计此更新过程。如果我设计它,当一个产品更新时,触发另一个更新,触发另一个更新并且链继续,这可能会导致长的Web请求周期?

感谢。

1 个答案:

答案 0 :(得分:0)

您的模型最好被描述为有向图

G = (V,E) ; V->P ; E = VxV

因此,PostgreSQL或MongoDB都不适合您的用例。

与PostgreSQL等传统RDBMS相比,MongoDB的最大优势是MongoDB的动态模式。这意味着您可以添加具有各种结构的新记录,而无需重新定义数据库模式。

但是你描述的模型对我来说是非常静态的。所以这个论点并不能算你的问题。

就我而言,您的最佳技术决策是使用像Neo4j这样的图表数据库。

作为替代灵感,您可以查看图形数据结构。因此,对图表建模的一种有效方法是使用adjacency matrix