【问题标题】:Postgres vs MongoDB on modeling recursive multi-child relationsPostgres vs MongoDB 对递归多子关系建模
【发布时间】:2016-09-19 14:17:56
【问题描述】:

我正在考虑将以下任一堆栈用于个人项目: 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) 我可以用哪些不同的方法来构造我的数据而不是父数组和子数组,并有效地设计这个更新过程。如果我将其设计为,当一个产品更新时,触发另一个更新,从而触发另一个更新并且链继续下去,这可能会导致很长的网络请求周期?

谢谢。

【问题讨论】:

  • I need to way to prevent infinite update cycle in a circular graph. 避免循环引用是不可能的?
  • MongoDB 不提供参照完整性、JOIN(更不用说 WITH RECURSIVE)、事务......所以你最终会手动完成很多简单的事情。在我看来,您最好在这里尝试使用图形数据库。
  • 在数据完整性方面,MongoDB 很糟糕。最好使用具有适当事务支持的 PostgreSQL。

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


【解决方案1】:

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

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

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

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

但是你描述的模型对我来说是相当静态的。所以这个论点不适合你的问题。

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

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

【讨论】:

  • 感谢您的建议,现在我将使用 PostgresSQL 作为简单的原型。但我可能会按照您稍后的建议检查图形数据库。
猜你喜欢
  • 2012-07-23
  • 2017-01-02
  • 1970-01-01
  • 2018-01-30
  • 2019-02-28
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多