【发布时间】: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